Cela peut être un peu dense à lire, mais la section "Content-Transfer-Encoding" de la RFC 1341 contient tous les détails:
http://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html
La situation va de mal en pis. Voici mon résumé:
Contexte
SMTP, par définition (RFC 821), limite le courrier à des lignes de 1000 caractères de 7 bits chacune. Cela signifie qu'aucun des octets que vous envoyez dans le tube ne peut avoir le bit le plus significatif ("d'ordre le plus élevé") mis à "1".
Le contenu que nous voulons envoyer n'obéira souvent pas à cette restriction par nature. Pensez à un fichier image ou à un fichier texte contenant des caractères Unicode: les octets de ces fichiers auront souvent leur 8ème bit mis à "1". SMTP ne le permet pas, vous devez donc utiliser le «codage de transfert» pour décrire comment vous avez contourné l'incompatibilité.
Les valeurs de l'en- Content-Transfer-Encoding
tête décrivent la règle que vous avez choisie pour résoudre ce problème.
Encodage 7 bits
7bit
signifie simplement "Mes données se composent uniquement de caractères US-ASCII, qui n'utilisent que les 7 bits inférieurs pour chaque caractère." Vous garantissez essentiellement que tous les octets de votre contenu respectent déjà les restrictions de SMTP, et qu'il ne nécessite donc aucun traitement spécial. Vous pouvez simplement le lire tel quel.
Notez que lorsque vous choisissez 7bit
, vous acceptez que toutes les lignes de votre contenu comportent moins de 1 000 caractères.
Tant que votre contenu respecte ces règles, 7bit
est le meilleur encodage de transfert, car aucun travail supplémentaire n'est nécessaire; vous venez de lire / écrire les octets au fur et à mesure qu'ils sortent du tube. Il est également facile de visualiser le 7bit
contenu et de le comprendre. L'idée ici est que si vous écrivez simplement en "texte anglais brut", tout ira bien. Mais ce n'était pas vrai en 2005 et ce n'est pas vrai aujourd'hui.
Encodage 8 bits
8bit
signifie "Mes données peuvent inclure des caractères ASCII étendus; ils peuvent utiliser le 8ème bit (le plus élevé) pour indiquer des caractères spéciaux en dehors des caractères 7 bits US-ASCII standard." Comme avec 7bit
, il y a toujours une limite de ligne de 1000 caractères.
8bit
, tout comme 7bit
, ne fait aucune transformation des octets lorsqu'ils sont écrits ou lus à partir du câble. Cela signifie simplement que vous ne garantissez pas qu'aucun des octets n'aura le bit le plus élevé mis à "1".
Cela semble être un pas en avant 7bit
, car cela vous donne plus de liberté dans votre contenu. Cependant, la RFC 1341 contient cette friandise:
A la date de publication de ce document, il n'existe aucun transport Internet standardisé pour lequel il est légitime d'inclure des données 8 bits non codées ou binaires dans les corps de courrier. Ainsi, il n'y a pas de circonstances dans lesquelles le codage de transfert de contenu "8 bits" ou "binaire" est réellement légal sur Internet.
La RFC 1341 est sortie il y a plus de 20 ans. Depuis lors, nous avons obtenu des extensions MIME 8 bits dans la RFC 6152 . Mais même dans ce cas, les limites de ligne peuvent toujours s'appliquer:
Notez que cette extension n'élimine PAS la possibilité qu'un serveur SMTP limite la longueur de la ligne; les serveurs sont libres d'implémenter cette extension mais fixent néanmoins une limite de longueur de ligne non inférieure à 1000 octets.
Encodage binaire
binary
est identique à 8bit
, sauf qu'il n'y a pas de restriction de longueur de ligne. Vous pouvez toujours inclure les caractères de votre choix et il n'y a pas d'encodage supplémentaire. Similaire à 8bit
, la RFC 1341 indique qu'il ne s'agit pas vraiment d'un encodage de transfert de codage légitime. La RFC 3030 a étendu cela avec BINARYMIME
.
Cité imprimable
Avant l' 8BITMIME
extension, il devait y avoir un moyen d'envoyer du contenu qui ne pouvait pas être 7bit
via SMTP. Les fichiers HTML (qui peuvent avoir plus de 1000 lignes de caractères) et les fichiers avec des caractères internationaux en sont de bons exemples. Le quoted-printable
codage (défini dans la section 5.1 de la RFC 1341) est conçu pour gérer cela. Il fait deux choses:
- Définit comment échapper les caractères non US-ASCII afin qu'ils puissent être représentés uniquement en caractères 7 bits. (Version courte: ils s'affichent sous la forme d'un signe égal plus deux caractères 7 bits.)
- Définit que les lignes ne dépasseront pas 76 caractères et que les sauts de ligne seront représentés à l'aide de caractères spéciaux (qui sont ensuite échappés).
Quoted Printable, en raison des lignes d'échappement et des lignes courtes, est beaucoup plus difficile à lire par un humain que 7bit
ou 8bit
, mais il prend en charge une gamme beaucoup plus large de contenu possible.
Encodage Base64
Si vos données sont en grande partie non textuelles (ex: un fichier image), vous n'avez pas beaucoup d'options. 7bit
est hors de la table. 8bit
et binary
n'étaient pas pris en charge avant les RFC d'extension MIME. quoted-printable
fonctionnerait, mais est vraiment inefficace (chaque octet sera représenté par 3 caractères).
base64
est une bonne solution pour ce type de données. Il encode 3 octets bruts sous forme de 4 caractères US-ASCII, ce qui est relativement efficace. La RFC 1341 limite en outre la longueur de ligne des base64
données codées à 76 caractères pour tenir dans un message SMTP, mais c'est relativement facile à gérer lorsque vous ne faites que fractionner ou concaténer des caractères arbitraires à des longueurs fixes.
Le gros inconvénient est que les base64
données codées sont à peu près entièrement illisibles par les humains, même s'il ne s'agit que de texte "clair" en dessous.