Usando PHP para tratar E-mail com Acentos e Caracteres Especiais - Blog de PHP
Artigo que mostra como utilizar o PHP para incluir acentuação ou caracteres especiais em e-mail, tanto no título do assunto quanto no conteúdo.
Categorias: charset, php, script, tutorial
Codificação do assunto
Para codificar o assunto de um e-mail, basta utilizar a expressão:
"=?charset?método?texto codificado?=
Em "charset", é colocada a codificação de caracteres do texto do assunto.
Em "método", é colocada a letra "B" para base64 ou "Q" para quoted-printable.
Em "texto codificado", é colocado o texto codificado do assunto, usando o método e charset definidos.
Veja um exemplo para montar o assunto com o método base64 a partir de um assunto em UTF-8:
$assunto = 'Açúcar possui acento';
$assunto_codificado = sprintf('=?%s?%s?%s?=', 'UTF-8', 'B', base64_encode($assunto));
Para usar o método quoted-printable, é preciso usar a função quoted_printable_encode, disponível a partir do PHP 5.3.0 ou imap_8bit, disponível na extensão IMAP. Este método deixa o conteúdo menor e mais legível, porém, depende da disponibilidade da função. A função base64_encode, por sua vez, está disponível desde o PHP 4. Veja um exemplo de codificação com quoted-printable:
$assunto_codificado = sprintf('=?%s?%s?%s?=', 'UTF-8', 'Q', quoted_printable_encode($assunto));
Depois, basta passar o parâmetro $subject da função mail com o valor codificado.
mail($destinatario, $assunto_codificado, $mensagem, $header)
Para enviar o conteúdo do e-mail, também é utilizado um dos métodos de codificação. Porém, o método utilizado é especificado no cabeçalho do e-mail. Para especificar o cabeçalho, basta utilizar as diretivas:
Neste caso, o conteúdo precisa de uma quebra de linha a cada 76 caracteres. As funções de codificação quoted-printable já fazem a quebra automática. A função base64_encode precisa de um auxilio da função chunk_split. Veja um exemplo de um e-mail com conteúdo textual enviado com codificação base64:
$conteudo = <<<TXT
$conteudo_codificado = chunk_split(base64_encode($conteudo), 76, "\r\n");
$header = <<<HTTP
From: {$remetente}
To: {$destinatario}
mail($destinatario, $assunto_codificado, $conteudo_codificado, $header);
Além do assunto e do conteúdo do e-mail, também é possível codificar o nome do remetente e do destinatário do e-mail. É utilizado o mesmo mecanismo do assunto. Veja um exemplo para codificar o nome do destinatário do e-mail com base64:
$nome = 'Alguém com Acento no Nome';
$email = 'alguem@teste.com';
$destinatario = sprintf('=?%s?%s?%s?= <%s>', 'UTF-8', 'B', base64_encode($nome), $email);
<p class='chamada-addthis'><i>Gostou do artigo? Então ajude a divulgá-lo.</i></p>
<a class='addthis_button_facebook' rel='nofollow'></a>
<a class='addthis_button_twitter' rel='nofollow'></a>
<a class='addthis_button_google_plusone_share' rel='nofollow'></a>
<a class='addthis_button_linkedin' rel='nofollow'></a>
<a class='addthis_button_email' rel='nofollow'></a>
<a class='addthis_button_compact' rel='nofollow'></a><a class='addthis_counter addthis_bubble_style' rel='nofollow'></a>
<script>var addthis_config = {"data_track_clickback":true};</script>
<script src='//s7.addthis.com/js/250/addthis_widget.js#pubid=ra-4d8785271068c380'></script>
em 05/07/2011 às 19:26:00
Para funcionar eu tive que adicionar aos headers isso também:
Resolveu o problema do assunto :))
O e-mail estava com o corpo de texto na codificação correta, mas o assunto vinha errado.
Heheh Muito Obrigado!
Muito didático. Parabéns pelo artigo.
O corpo da mensagem fica desta forma "Q29udGXDumRvIGRvIGUtbWFpbC4KQmzDoSBibMOhIGJsw6Eu
" ao utilizar esta configuração; funcionou apenas para o assunto.
Fagner, certifique-se que passou o cabeçalho do e-mail corretamente, conforme mostrado no exemplo do artigo. Veja a linha: