Comment créer du Base64 MIME
- Collez le texte dans Entrée · texte. Retour à la ligne est préréglé sur 76 (MIME, LF).
- Laissez Jeu de caractères sur UTF-8, sauf si le message déclare un autre jeu de caractères, et utilisez la même valeur dans l’en-tête
Content-Type. - Copiez le Base64 coupé depuis Sortie · Base64, ou Télécharger pour l’obtenir dans
base64.txt. - Pour les corps de certificats ou de clés, passez Retour à la ligne sur 64 (PEM). Pour HTTP, JSON ou tout ce qui exige une seule ligne, choisissez Aucun.
Ce qu’est le Base64 MIME
MIME (RFC 2045) est la norme qui permet aux e-mails de transporter des pièces jointes, du texte dans d’autres langues que l’anglais et du HTML. Quand le corps d’une partie est binaire ou rempli d’octets non ASCII, l’expéditeur l’encode en Base64 et le marque avec Content-Transfer-Encoding: base64. En plus du Base64 simple, la RFC 2045 ajoute une règle de longueur : les lignes encodées font au plus 76 caractères. Une ligne de 76 caractères contient 57 octets d’entrée.
Une partie texte encodée ainsi ressemble à ceci ; les deux lignes Base64 sont la sortie de cet outil pour la phrase citée plus bas :
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
Q2Fmw6kgbWVudTogY3LDqG1lIGJyw7tsw6llLCBqYWxhcGXDsW8sIHNtw7ZyZ8Olc2JvcmQuIFRo
aXMgbGluZSBpcyBsb25nIGVub3VnaCB0byB3cmFwIGFmdGVyIDc2IGNoYXJhY3RlcnMu
Le texte d’origine était Café menu: crème brûlée, jalapeño, smörgåsbord. This line is long enough to wrap after 76 characters., soit 108 octets en UTF-8. Décodées avec le décodeur Base64, les deux lignes ensemble redonnent la phrase ; le saut de ligne est ignoré.
Sauts de ligne, CRLF et taille
Retour à la ligne propose deux variantes à 76 colonnes : 76 (MIME, LF) sépare les lignes par un saut de ligne (\n), et 76 (MIME, CRLF) utilise \r\n. Les e-mails en transit utilisent CRLF, et les bibliothèques de messagerie convertissent les fins de ligne en sérialisant un message : LF convient donc dans le code. Si vous collez la sortie directement dans un fichier .eml brut ou une session SMTP, choisissez la variante CRLF.
La coupure coûte un peu de place en plus des 33 % habituels :
| Sortie | Caractères pour 57 octets d’entrée | Surcoût |
|---|---|---|
| Une seule ligne, sans saut | 76 | 33,3 % |
| Lignes de 76 caractères avec LF | 77 | 35,1 % |
| Lignes de 76 caractères avec CRLF | 78 | 36,8 % |
Les limites de taille des messageries s’appliquent au message encodé : une pièce jointe de 10 Mo occupe donc environ 13,7 Mo de la limite. Le calculateur de taille donne les valeurs exactes, et Base64 dans les e-mails explique comment les parties s’assemblent.
Encoded-words pour les en-têtes
Les en-têtes comme Subject et From ne peuvent pas utiliser Content-Transfer-Encoding. Le texte non ASCII des en-têtes utilise les encoded-words de la RFC 2047 : =?charset?B?base64?=. Pour en construire un, encodez le texte avec Retour à la ligne réglé sur Aucun et entourez vous-même le résultat :
Subject: =?UTF-8?B?R3LDvMOfZSBhdXMgQmVybGlu?=
Cela se décode en Grüße aus Berlin. Un encoded-word fait au plus 75 caractères ; les objets plus longs sont découpés en plusieurs encoded-words séparés par une espace. Pour un texte majoritairement ASCII, les logiciels de messagerie utilisent souvent plutôt la forme ?Q?, basée sur le quoted-printable.
Base64 MIME dans le code et en ligne de commande
base64.encodebytes en Python coupe à 76 caractères avec \n et donne les mêmes lignes que cet outil :
import base64
text = "Café menu: crème brûlée, jalapeño, smörgåsbord. This line is long enough to wrap after 76 characters."
print(base64.encodebytes(text.encode("utf-8")).decode("ascii"))
Pour des messages complets, le package email gère l’encodage, les en-têtes et les CRLF à votre place. Sous Linux, le base64 de GNU coupe à 76 par défaut et openssl base64 à 64 :
base64 attachment.pdf > attachment.b64
openssl base64 -in attachment.pdf -out attachment.pem.b64
Pour décortiquer un e-mail brut, ouvrez-le plutôt dans le décodeur d’e-mails (EML), qui en extrait les corps et les pièces jointes.
FAQ
Pourquoi le Base64 MIME utilise-t-il des lignes de 76 caractères ?
La RFC 2045 fixe la limite à 76 caractères, bien en dessous de la limite de 998 caractères par ligne des e-mails (RFC 5322). 76 est un multiple de 4 : chaque ligne contient donc exactement 57 octets.
Le Base64 MIME diffère-t-il du Base64 normal ?
L’alphabet et le remplissage sont identiques. La seule différence, ce sont les sauts de ligne, que les décodeurs sont censés ignorer : les versions coupées et non coupées se décodent donc en les mêmes octets.
Faut-il couper le Base64 dans l'objet d'un e-mail ?
Non. Les en-têtes utilisent les encoded-words de la RFC 2047, comme =?UTF-8?B?R3LDvMOfZQ==?=, qui ne doivent pas contenir de sauts de ligne. Encodez l’objet avec Retour à la ligne réglé sur Aucun et limitez chaque encoded-word à 75 caractères.
Pourquoi openssl me donne-t-il des lignes de 64 caractères ?
openssl base64 coupe à 64, la convention PEM, alors que le base64 de GNU et la plupart des bibliothèques de messagerie coupent à 76. Les deux se décodent de la même façon ; choisissez 64 ici si vous avez besoin d’une sortie identique à celle d’openssl.