Função mail()
De Wiki CaseHost
Tabela de conteúdo |
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:
Hospedagem Linux
A quebra de linha para utilizar no cabeçalho deve ser "\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\n"; $headers .= "Content-type: text/plain; charset=iso-8859-1\n"; $headers .= "From: eu@seudominio.com\n"; // remetente $headers .= "Return-Path: eu@seudominio.com\n"; // return-path mail("destinatario@algum-email.com", "Assunto", "Texto", $headers); print "Mensagem enviada com sucesso"; ?>
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 mail("destinatario@algum-email.com", "Assunto", "Texto", $headers); print "Mensagem enviada com sucesso"; ?>
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.
Função mail na prática, como se preparar para diversos tipos de ambientes
Abaixo faremos um pequeno demonstrativo de um formulário de envio de e-mails que envia as mensagens no formato HTML e está pronto para funcionar em diversos tipos de ambientes, ou seja, PHP 4 e 5, tanto com QMail quanto em Postfix (Linux) e em hospedagens Windows.
Neste exemplo o 'formulario.html' enviará os dados por POST para o script 'envia.php', que fará o disparo da mensagem.
Arquivo: formulario.html
<html> <head> <title>Formulário para envio de mensagens através da Função mail() do PHP</title> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> </head> <body> <form action="envia.php" method="post"> <table width="40%" border="1"> <tr> <td> <p><center><b>Formulário para envio de mensagens através da Função mail() do PHP</b></center></p> <b>Remetente</b> Nome: <input name="nomeremetente" type="text" size="100"> E-mail(*): <input name="emailremetente" type="text" size="100"> <font size="-2">Este e-mail será usado no campo Reply-To, o script automaticamente definirá o e-mail do remetente com base no seu domínio</font> <strong>Destinatário</strong> E-mail: <input name="emaildestinatario" type="text" id="emaildestinatario" size="100"> Com Cópia(cc): <input name="comcopia" type="text" id="comcopia" size="100"> Com Cópia Oculta(cco): <input name="comcopiaoculta" type="text" id="comcopiaoculta" size="100"> Assunto: <input name="assunto" type="text" id="assunto" size="100"> Mensagem: <textarea name="mensagem" cols="75" rows="5" id="textarea"></textarea> <input type="submit" name="Submit" value="Enviar"> <input type="reset" name="limpar" value="Limpar"> </td> </tr> <tr> <td> <b> Veja também: </b> <a href="http://www.php.net/manual/pt_BR/function.mail.php" target="new">http://www.php.net/manual/pt_BR/function.mail.php</a> <a href="http://ajuda.locaweb.com.br/pt-br/Como_enviar_e-mails_com_a_fun%C3%A7%C3%A3o_mail()_do_PHP" target="new">Função para Envio de Mensagens mail()</a> <b>*Atenção:</b>Use sempre como endereço de remetente o e-mail de um domínio hospedado na LocaWeb, caso contrário a mensagem enviada poderá ser considerada pelo destinatário como sendo um possível spam. </td> </tr> </table> </form> </body> </html>
Arquivo: envia.php
<?php /* Medida preventiva para evitar que outros domínios sejam remetente da sua mensagem. */ if (eregi('tempsite.ws$|locaweb.com.br$|hospedagemdesites.ws$|websiteseguro.com$', $_SERVER[HTTP_HOST])) { $emailsender='locaweb@www370.locaweb.com.br'; // Substitua essa linha pelo seu e-mail@seudominio } else { $emailsender = "webmaster@" . $_SERVER[HTTP_HOST]; // Na linha acima estamos forçando que o remetente seja 'webmaster@seudominio', // você pode alterar para que o remetente seja, por exemplo, 'contato@seudominio'. } /* Verifica qual é o sistema operacional do servidor para ajustar o cabeçalho de forma correta. Não alterar */ if(PHP_OS == "Linux") $quebra_linha = "\n"; //Se for Linux elseif(PHP_OS == "WINNT") $quebra_linha = "\r\n"; // Se for Windows else die("Este script nao esta preparado para funcionar com o sistema operacional de seu servidor"); // Passando os dados obtidos pelo formulário para as variáveis abaixo $nomeremetente = $_POST['nomeremetente']; $emailremetente = $_POST['emailremetente']; $emaildestinatario = $_POST['emaildestinatario']; $comcopia = $_POST['comcopia']; $comcopiaoculta = $_POST['comcopiaoculta']; $assunto = $_POST['assunto']; $mensagem = $_POST['mensagem']; /* Montando a mensagem a ser enviada no corpo do e-mail. */ $mensagemHTML = '<P>Esse email é um teste enviado no formato HTML via PHP mail();!</P> <P>Aqui está a mensagem postada por você formatada em HTML:</P> <p><b><i>'.$mensagem.'</i></b></p> <hr>'; /* Montando o cabeçalho da mensagem */ $headers = "MIME-Version: 1.1".$quebra_linha; $headers .= "Content-type: text/html; charset=iso-8859-1".$quebra_linha; // Perceba que a linha acima contém "text/html", sem essa linha, a mensagem não chegará formatada. $headers .= "From: ".$emailsender.$quebra_linha; $headers .= "Cc: ".$comcopia.$quebra_linha; $headers .= "Bcc: ".$comcopiaoculta.$quebra_linha; $headers .= "Reply-To: ".$emailremetente.$quebra_linha; // Note que o e-mail do remetente será usado no campo Reply-To (Responder Para) /* Enviando a mensagem */ //Verificando qual é o MTA que está instalado no servidor e efetuamos o ajuste colocando o paramentro -r caso seja Postfix 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 ); } /* Mostrando na tela as informações enviadas por e-mail */ print "Mensagem <b>$assunto</b> enviada com sucesso! De: $emailsender Para: $emaildestinatario Com cópia: $comcopia Com cópia Oculta: $comcopiaoculta <p><a href='".$_SERVER["HTTP_REFERER"]."'>Voltar</a></p>" ?>
