Como enviar e-mails com a função mail() do PHP
Problemas com o envio de e-mails?As mensagens devem ser enviadas dentro do padrão internacional RFC 822. Veja os exemplos simples abaixo ou Clique aqui para saber o que deve ser especificado.
Função para Envio de Mensagens mail (exemplo básico em Linux e Windows)Atenção! A função mail() possui algumas particularidades relacionadas ao cabeçalho da mensagem por isso recomendamos que o cabeçalho siga o padrão abaixo:
|
|||||
if(!mail($emaildestinatario, $assunto, $mensagemHTML, $headers ,"-r".$emailsender)){ // Se for Postfix $headers .= "Return-Path: " . $emailsender . $quebra_linha; // Se "não for Postfix" mail($emaildestinatario, $assunto, $mensagemHTML, $headers ); } |
Hospedagem Windows
A quebra de linha para utilizar no cabeçalho deve ser "\r\n"
<?php // O remetente deve ser um e-mail do seu domínio conforme determina a RFC 822. // O return-path deve ser ser o mesmo e-mail do remetente. $headers = "MIME-Version: 1.1\r\n"; $headers .= "Content-type: text/plain; charset=iso-8859-1\r\n"; $headers .= "From: eu@seudominio.com\r\n"; // remetente $headers .= "Return-Path: eu@seudominio.com\r\n"; // return-path $envio = mail("destinatario@algum-email.com", "Assunto", "Texto", $headers); if($envio) echo "Mensagem enviada com sucesso"; else echo "A mensagem não pode ser enviada"; ?> |
As diferenças entre Linux e Windows (por que em um funciona e no outro não funciona e vice-versa)
Além da quebra de linha citada acima (\n em Linux e \r\n em Windows), existem também as diferenças no que deveremos especificar nos outros itens do cabeçalho.
Campo From (remetente)
No Linux, você pode definir o From das seguintes formas:
$headers .= "From: eu@seudominio.com\n";
$headers .= "From: Meu Nome <eu@seudominio.com>\n";
No Windows:
$headers .= "From: eu@seudominio.com\r\n";
O motivo desta diferença está explicado na [documentação oficial da função mail()].
Campos To, Cc e Bcc (destinatários)
A flexibilidade é maior em Linux, é possível usar os mesmos formatos acima para eles:
$headers .= "Cc: umemail@destinatario.com\n";
$headers .= "Cc: Um Nome <umemail@destinatario.com>\n";
$headers .= "Bcc: outroemail@destinatario.com\n";
$headers .= "Bcc: Outro Nome <outroemail@destinatario.com>\n";
E na função mail (ou seja, o campo To):
mail("destinatario@algum-email.com", "Assunto", "Texto", $headers);
mail("Algum Nome <destinatario@algum-email.com>", "Assunto", "Texto", $headers);
No Windows há algumas restrições, não sendo permitidos os formatos Algum Nome <destinatario@algum-email.com>, somente:
$headers .= "Cc: umemail@destinatario.com\r\n";
$headers .= "Bcc: outroemail@destinatario.com\r\n";
E na função mail (ou seja, o campo To):
mail("destinatario@algum-email.com", "Assunto", "Texto", $headers);
O motivo desta diferença está explicado na [documentação oficial da função mail()].
Outros campos
Os campos Reply-To, Return-Path e Disposition-Notification-To (serão detalhados adiante) também seguirão as mesmas regras dos campos To, Cc e Bcc:
$headers .= "Reply-To: umemail@visitante.com\n";
$headers .= "Return-Path: Um Nome <umemail@remetente.com>\n";
$headers .= "Disposition-Notification-To: umemail@destinatario.com\r\n";
Opções para o cabeçalho
É possível adicionar outros headers à função mail() além do From: como por exemplo:
Content-type: Formato do envio de mensagens, use “text/plain” para texto ou “text/html” para HTML.
Cc: Envio de cópia das mensagens.
Bcc: Envio de cópia oculta das mensagens.
Reply-To: E-mail que receberá a resposta caso quem a leu clicar em 'Responder'.
X-Priority: Prioridade da mensagem: 1 é urgente, 5 é prioridade baixa, 3 é normal (padrão se não for especificado).
Disposition-Notification-To: E-mail que receberá confirmação de leitura (somente se recebido por algum cliente de e-mail, como o Outlook).
Exemplos com cabeçalhos
// Este sempre deverá existir para garantir a exibição correta dos caracteres $headers = "MIME-Version: 1.1\n"; // Para enviar o e-mail em formato texto com codificação de caracteres Europeu Ocidental (usado no Brasil) $headers .= "Content-type: text/plain; charset=iso-8859-1\n"; // Para enviar o e-mail em formato HTML com codificação de caracteres Europeu Ocidental (usado no Brasil) $headers .= "Content-type: text/html; charset=iso-8859-1\n"; // Para enviar o e-mail em formato HTML com codificação de caracteres Unicode (Usado em todos os países) $headers .= "Content-type: text/html; charset=utf-8\n"; // E-mail que receberá a resposta quando se clicar no 'Responder' de seu leitor de e-mails $headers .= "Reply-To: e-mailDeQuemPreencheuSeuFormulario@dominio.com\n" // para enviar a mensagem em prioridade máxima $headers .= "X-Priority: 1\n"; // para enviar a mensagem em prioridade mínima $headers .= "X-Priority: 5\n"; // para enviar a mensagem em prioridade normal (valor padrão caso não seja especificada) $headers .= "X-Priority: 3\n"; |
Obs: Muito cuidado ao usar codificações diferenciadas em uma aplicação (ISO-8859-1 x UTF-8), maiores informações consulte Como resolver problemas de acentuações em seu site.
Como evitar que a mensagem seja bloqueada
- Campo From (RFC 822) deve ser um e-mail de seu domínio, do contrário, poderá ter problemas com o recebimento das mensagens também por conta do bloqueio de segurança dos servidores de diversos provedores;
- Return-Path (RFC 822)deve ser o mesmo e-mail especificado em From, se ele não for especificado ou for especificado um e-mail diferente, a mensagem pode não chegar no destino por conta do bloqueio de segurança dos servidores de diversos provedores;
- Campo Reply-To é ideal para formulários que tem como função enviar e-mail para uma caixa postal sua (@dominio.com), pois quando se responde, o destinatário será o e-mail do visitante. Se usar o e-mail do visitante no campo From, a mensagem poderá ser barrada por conta do tópico acima.
- Não é necessário o uso de Reply-To quando se deseja usar o script para enviar um e-mail para o visitante, o próprio campo From, neste caso, será utilizado como e-mail a ser respondido.
- Veja também SPF - Sender Policy Framework
Obs: É importante a utilização "Return-Path" para receber o retorno das mensagens e identificar mais rapidamente as falhas no envio.
Exemplo funcional para hospedagem Windows e Linux
Neste exemplo o 'index.html' enviará os dados por método POST para o script 'envia.php', que fará o disparo da mensagem.
Veja também
- Como obter os logs de erros e de acesso na hospedagem Linux
- PHP em Plataforma Windows
- Como conectar a um banco MySQL através de script PHP
- PHP - Upload de arquivos
- Como proteger as TAGs de formulários criados em PHP
- Utilizando SMTP autenticado em aplicações web
- Usando as diretivas allow_url_fopen e allow_url_include
- PHP Mailer - Enviando e-mail autenticado através da Revenda
- Como configurar o PHPMailer para RFC 822?
- Como configurar o Return-path no Wordpress na Locaweb
- Como configurar o Return-path no Joomla na Locaweb
