Problema de formatação por correio PHP - Por que os finais da linha de cabeçalho da CRLF quebram o email HTML no Outlook?
-
27-09-2019 - |
Pergunta
Estou usando o nativo do PHP mail()
função para enviar e -mails html e ter um problema de formatação no cliente de email mais comum dos usuários - Outlook 2007 (Além de outros clientes de e -mail)-Todas as tags HTML são expostas, por isso parece com bobagem a um desenvolvedor não-web.
Estou enviando um email html da mesma maneira que o Manual do PHP demos. Exemplo:
$message = get_HTML_email_with_valid_formatting();
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: example.com <info@example.com>\r\n";
$headers .= "Reply-To: donotreply@example.com\r\n";
mail('me@example.com', 'test', $message, $headers);
Porque testar vários clientes de email é difícil, eu me inscrevi com http://litmusapp.com/ Para que eu possa ver uma captura de tela dos e -mails em 47 clientes de email diferentes. A maioria está OK (por exemplo, Gmail, Thunderbird, Lotus Notes), mas todas as diferentes versões das perspectivas não estão bem.
Para corrigir o problema de formatação, eu tinha feito o seguinte:
- Remova o
$headers = "MIME-Version: 1.0\r\n";
Cabeçalho de correio. - Certifique -se de encerrar meus cabeçalhos com apenas "
\n
" ao invés de "\r\n
".
Alguém sabe por que estou obtendo melhores resultados com e -mails HTML quando não conforme o manual?
Informação:
- estou a usar Postfix Versão 2.3.3 no RHEL 5.5.
- PHP versão 5.3.2
Solução
Você tem 2 soluções:
- Atualize o postfix para +2.9, que tem "sendmail_fix_line_endings" (finalmente !!!) Veja: Documentação Postfix
- Instale o Sendmail (funcionando bem!)
Eu tenho uma imagem VMware com uma pilha de lâmpadas. Para enviar e -mail, finalmente decidi:
- Instale o Sendmail
- Use o SMTP do meu ISP (pois é apenas uma caixa de dev).
Para a parte do Sendmail, você pode seguir isto: http://www.geoffke.be/nieuws/13/
IMPORTANTE: Alguns webhosters podem usar apenas pacotes estáveis, o que significa que você pode ter ... um postfix com mais de 2,9 !!! Exemplo: http://packages.debian.org/search?keywords=postFix
Outras dicas
Se você usar o Postfix <2.9, você pode apenas colocar sendmail_path = "tr -d '\r'|sendmail -t -i"
em php.ini.
Eu suspeito que é minha versão do Postfix - versão 2.3.3 é 5 anos de idade E talvez esteja convertendo LF para CRLF, mas, como eu já tinha o CRLF, acho que estava enviando CRCRLF para os clientes de email.
Infelizmente, não estou na situação para atualizar o postfix. Então, no momento em que converti o código para usar uma variável configurável para as terminações da linha, para que seja fácil mudar no futuro:
$eol = "\n";
$message = get_HTML_email_with_valid_formatting();
$headers = "MIME-Version: 1.0".$eol;
$headers .= "Content-Type: text/html; charset=UTF-8".$eol;
$headers .= "From: example.com <info@example.com>".$eol;
$headers .= "Reply-To: donotreply@example.com".$eol;
mail('me@example.com', 'test', $message, $headers);
O email foi interpretado como texto/simples em vez de HTML pretendido. A razão para isso é que texto/html é um subtipo multipartreador que exige declarações de limite.
Seu código está faltando um limite do cabeçalho declaração:
$message = get_HTML_email_with_valid_formatting();
$headers = "MIME-Version: 1.0\r\n";
$headers .= "--$boundary\r\n"."Content-Type: text/html; charset=ISO-8859-1\r\n";
$headers .= "From: example.com <info@example.com>\r\n";
$headers .= "Reply-To: donotreply@example.com\r\n";
mail('me@example.com', 'test', $message, $headers);
Verifique este wiki sobre mensagens MIME e Multipart:http://en.wikipedia.org/wiki/mime#multipart_messages