mail-core-ng 0.6.3

[mail/core] provides the Mail type for the mail crate (inkl. multipart mime bodies, builder and resource type)
Documentation
# **Warning: document is not up to date**

# Naming differences

(note that `foo/bar` means crate `foo` with feature `bar` enabled)

- `mail-codec` => `mail-encode`
- `mail-codec-composition` => `mail-encode-compose`
- `mail-codec-composition/smtp` => `mail-tokio-smtp/encode`
- `mail-headers` => `mail-headers/encode`
- `mail-internals` => `mail-core/encode`


# Dependency Chart

(updated)
```ascii


                       mail-smtp    mail-templates   (maybe at some point)mail-parser
new-tokio-smtp---------/ |              | \                                 |
                         |              |  \-handle-bars                    |
        <[mail-core]>----/--------------/-----------------------------------/
              |
              |
            mail-headers
              |
              |
            mail-internals
```

crates marked with a * have both parser and encoder specific parts,
which are opt-in/-out through features.

# Descriptions

## Mail-Core

This crate provides parts used by all other parts using
the `encode`/`parse` features encoding/parsing specific
parts are enabled/disabled. (Currently it's just encoding).

Parts included are the EncodingBuffer, HeaderMap, Header traits,
encoding traits, bindings to other encoding libraries like
base64, percent-encode and similar.

## Mail-Headers

A create providing implementations for the most
mail-internals headers. Like `mail-core` encoding/parsing specific
parts can be enabled/disabled using the `encode`/`decode`
feature. A Header basically consists of a name and a Header component,
which can be encoded and represents the header field.

Many of those components can be reused at different
points, e.g. `Mailbox`/`MailboxList`/`Email`/`Phrase`/...


## Mail-Encode

This crate provides a basic mechanism to create and
encode mails with includes a Mail types which can
represent any form of mails, from simple text mails
to complex multipart mails. While this API can be
used to represent any mail it is not nessesary the
most convinient to use, as it requires the user to
handle aspects like e.g. which multipart content type
is used, and how they are structured.

Additional to the Mail struct it provides a mechanism
to encode the Mail struct with the EncodingBuffer provided
by `mail-core` produceing a mail in form of a
string, ascii-string or bytes a required by the consumer.
(the encoder does know about 7bit, 8bit and utf8 i.e.
internationalized mails).

As a mail can contain all kinds of embedded data (e.g.
atachments, embeded images in a html mail etc.). This
create also provides a way to handle such resources
as part of a mail.


## Mail-Encode-Compose

Is build on-top of `mail-encode` providing traits and mechanism,
to bind in template engines, allowing the API consumer to
create mails based on from, to, subject, template_id and
template_data. The template engine only has to provide
a number of alternate bodies with embeddings/attachments
caused by them. The mail-composition crate takes care of
composing them into a mail multipart tree
(using `multipart/related`,`multipart/mixed`, etc.)

Currently `mail-composition` does not have explicit support for
e.g. encryption and some other "more special" multipart
bodies. Nevertheless by using the API provided by Mail this
mail can still be created, they do just not jet bind with
the template engine by default.

The crate also provides a pre-build template engine through a
feature which just needs another template engine to render
mail content bodies (e.g. text/html) and handles all the
other parts, like e.g. providing a logo for an HTML mail
as an embedding (as a side note generation of CID's and
providing them to the template data is already handled)

# Mail

A facade for all `mail-*` crates, providing a `encode`
`parse` feature to enable/disable the encoding/parsing
parts, and more fine grained features for more fain
grained control over what is included. This
takes advantage of rust features being additive, e.g.
if one dependency includes `mail/encode` and one `mail/decode`
than rust will only include one time `mail` with both
`encode` and `decode` enabled.

(this crate does not yet exist)


# Mail-Tokio-Smtp

This crate will provide bindings between the mail
crates and a crate providing tokio-smtp support.
While smtp is mainly a transport protocol this
crate provides bindings to make thinks easy to
use and setup, e.g. the `mail-encode-compose`
library does provide a method `compose_mail(MailSendData) -> Result<Mail>`
(called on a combination of Context and TemplateEngine),
but if you want to use this as a request in a smtp
service to send a mail, there is quite a bit of bind
code doing everything from calling compose_mail, making
it encodable, encoding it and sending the right smtp
commands.

Currently this functionality lives in `mail-encode-compose`
under the `smtp` feature and use `tokio-smtp` as binding
library and is limited to binding with the mechanism provided
in `mail-encode-compose` but not general `Mail` structs (through
is will change in the future)


# Mail-parse

A crate providing functionality for parsing mails, it
will use a combination of `Arc`/`Rc` and `OwningRef`
to allow a zero-copy parsing of mails, nevertheless
as mail normaly do contain parts further encoded in
e.g. base64 it will provide a mechanism where parts
of the mail can be shadowed by a decoded version
of the part generated on-demand/lazily.

**This crate currently does not exist, and focus lies
on the encoding based crates**

Through the crate structure is setup to include parsing
specific parts in the future.