Função mail()
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"
<source lang="php"> <?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"; ?> </source>
Hospedagem Windows
A quebra de linha para utilizar no cabeçalho deve ser "\r\n"
<source lang="php"> <?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"; ?></source>
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
<source lang="php"> // 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"; </source> 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
<source lang="php"> <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">
Remetente
Nome:
<input name="nomeremetente" type="text" size="100">
E-mail(*):
<input name="emailremetente" type="text" size="100">
Este e-mail será usado no campo Reply-To, o script automaticamente definirá o e-mail do remetente com base no seu domínio
Destinatário
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">
|
Veja também:
<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> *Atenção: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. |
</form> </body>
</html>
</source>
Arquivo: envia.php
<source lang="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. */
Esse email é um teste enviado no formato HTML via PHP mail();!
Aqui está a mensagem postada por você formatada em HTML:
'.$mensagem.'
';
/* 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 $assunto enviada com sucesso! De: $emailsender Para: $emaildestinatario Com cópia: $comcopia Com cópia Oculta: $comcopiaoculta
<a href='".$_SERVER["HTTP_REFERER"]."'>Voltar</a>
"?> </source>