Problema de formatação por correio PHP - Por que os finais da linha de cabeçalho da CRLF quebram o email HTML no Outlook?

StackOverflow https://stackoverflow.com/questions/3449431

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:

  1. Remova o $headers = "MIME-Version: 1.0\r\n"; Cabeçalho de correio.
  2. 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
Foi útil?

Solução

Você tem 2 soluções:

  1. Atualize o postfix para +2.9, que tem "sendmail_fix_line_endings" (finalmente !!!) Veja: Documentação Postfix
  2. 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top