Como gerar Base64 MIME
- Cole o texto em Entrada · texto. Quebra de linha já vem em 76 (MIME, LF).
- Mantenha Charset em UTF-8, a menos que a mensagem declare outro charset, e use o mesmo valor no header
Content-Type. - Copie o Base64 quebrado de Saída · Base64, ou clique em Baixar para salvá-lo como
base64.txt. - Para o conteúdo de certificados ou chaves, troque Quebra de linha para 64 (PEM). Para HTTP, JSON ou qualquer outra coisa que precise de uma linha só, escolha Nenhuma.
O que é Base64 MIME
O MIME (RFC 2045) é o padrão que permite ao e-mail levar anexos, texto em outros idiomas e HTML. Quando o corpo de uma parte é binário ou cheio de bytes não ASCII, o remetente o codifica em Base64 e o marca com Content-Transfer-Encoding: base64. Além do Base64 comum, a RFC 2045 acrescenta uma regra de tamanho de linha: as linhas codificadas podem ter no máximo 76 caracteres. Uma linha de 76 caracteres guarda 57 bytes de entrada.
Uma parte de texto codificada assim fica deste jeito; as duas linhas Base64 são a saída desta ferramenta para a frase citada abaixo:
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
Q2Fmw6kgbWVudTogY3LDqG1lIGJyw7tsw6llLCBqYWxhcGXDsW8sIHNtw7ZyZ8Olc2JvcmQuIFRo
aXMgbGluZSBpcyBsb25nIGVub3VnaCB0byB3cmFwIGFmdGVyIDc2IGNoYXJhY3RlcnMu
O texto original era Café menu: crème brûlée, jalapeño, smörgåsbord. This line is long enough to wrap after 76 characters., 108 bytes em UTF-8. Decodificadas com o decodificador Base64, as duas linhas juntas devolvem a frase; a quebra de linha é ignorada.
Quebras de linha, CRLF e tamanho
Quebra de linha oferece duas variantes de 76 colunas: 76 (MIME, LF) separa as linhas com line feed (\n), e 76 (MIME, CRLF) usa \r\n. O e-mail em trânsito usa CRLF, e as bibliotecas de e-mail convertem os finais de linha ao serializar uma mensagem, então LF serve para código. Se você colar a saída direto num arquivo .eml bruto ou numa sessão SMTP, escolha a variante CRLF.
A quebra custa um pouco de espaço além dos 33% de sempre:
| Saída | Caracteres a cada 57 bytes de entrada | Acréscimo |
|---|---|---|
| Uma linha, sem quebras | 76 | 33,3% |
| Linhas de 76 caracteres com LF | 77 | 35,1% |
| Linhas de 76 caracteres com CRLF | 78 | 36,8% |
Os limites de tamanho de e-mail valem para a mensagem codificada, então um anexo de 10 MB consome uns 13,7 MB do limite. A calculadora de tamanho dá os números exatos, e Base64 em e-mail explica como as partes se encaixam.
Encoded-words para headers
Headers como Subject e From não podem usar Content-Transfer-Encoding. Texto não ASCII em headers usa os encoded-words da RFC 2047: =?charset?B?base64?=. Para montar um, codifique o texto com Quebra de linha em Nenhuma e envolva o resultado você mesmo:
Subject: =?UTF-8?B?R3LDvMOfZSBhdXMgQmVybGlu?=
Isso decodifica para Grüße aus Berlin. Um encoded-word pode ter no máximo 75 caracteres; assuntos mais longos são divididos em vários encoded-words separados por espaço. Para texto quase todo em ASCII, os programas de e-mail muitas vezes usam a forma ?Q?, baseada em quoted-printable.
Base64 MIME no código e na linha de comando
O base64.encodebytes do Python quebra em 76 caracteres com \n, gerando as mesmas linhas desta ferramenta:
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"))
Para mensagens inteiras, o pacote email cuida da codificação, dos headers e do CRLF para você. No Linux, o base64 do GNU quebra em 76 por padrão e o openssl base64 em 64:
base64 attachment.pdf > attachment.b64
openssl base64 -in attachment.pdf -out attachment.pem.b64
Para fazer o contrário e desmontar um e-mail bruto, abra-o no decodificador de e-mail (EML), que extrai os corpos e os anexos.
Perguntas frequentes
Por que o Base64 MIME usa linhas de 76 caracteres?
A RFC 2045 define o limite em 76 caracteres, com folga abaixo do limite de 998 caracteres por linha do e-mail (RFC 5322). 76 é múltiplo de 4, então cada linha guarda exatamente 57 bytes.
O Base64 MIME é diferente do Base64 normal?
O alfabeto e o preenchimento são idênticos. A única diferença são as quebras de linha, e espera-se que os decodificadores as ignorem, então as versões com e sem quebra decodificam para os mesmos bytes.
Devo quebrar o Base64 na linha de assunto de um e-mail?
Não. Headers usam encoded-words da RFC 2047, como =?UTF-8?B?R3LDvMOfZQ==?=, que não podem ter quebras de linha. Codifique o assunto com Quebra de linha em Nenhuma e mantenha cada encoded-word com no máximo 75 caracteres.
Por que o openssl me dá linhas de 64 caracteres?
O openssl base64 quebra em 64, a convenção do PEM, enquanto o base64 do GNU e a maioria das bibliotecas de e-mail quebram em 76. Os dois decodificam do mesmo jeito; escolha 64 aqui se precisar de uma saída idêntica à do openssl.