PHP Mail - Como enviar e-mails utilizando a função Mail nativa do PHP

De Wiki Locaweb
Ir para: navegação, pesquisa

Índice

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 Revenda Linux e Windows)

<video desc="Enviando e-mail via Script" type="youtube" id="hwqvbbq5du0" width="480" height="295"/>

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:

LocawebRevenda 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: Meu Nome <eu@seudominio.com>"."\n"; // remetente
$headers .= "Return-Path: Meu Nome <eu@seudominio.com>"."\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";
?>

LocawebRevenda 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:
Locaweb $headers .= "From: eu@seudominio.com\n";
Locaweb $headers .= "From: Meu Nome <eu@seudominio.com>\n";

Na Revenda Windows:
Locaweb $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:
Locaweb $headers .= "Cc: umemail@destinatario.com\n";
Locaweb $headers .= "Cc: Um Nome <umemail@destinatario.com>\n";
Locaweb $headers .= "Bcc: outroemail@destinatario.com\n";
Locaweb $headers .= "Bcc: Outro Nome <outroemail@destinatario.com>\n";
E na função mail (ou seja, o campo To):
Locaweb mail("destinatario@algum-email.com", "Assunto", "Texto", $headers);
Locaweb 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:
Locaweb $headers .= "Cc: umemail@destinatario.com\r\n";
Locaweb $headers .= "Bcc: outroemail@destinatario.com\r\n";
E na função mail (ou seja, o campo To):
Locaweb 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:

Locaweb $headers .= "Reply-To: umemail@visitante.com\n";
Locaweb $headers .= "Return-Path: Um Nome <umemail@remetente.com>\n";
Locaweb $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.


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&aacute;rio para envio de mensagens atrav&eacute;s da Fun&ccedil;&atilde;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&aacute;rio para envio de mensagens atrav&eacute;s da Fun&ccedil;&atilde;o mail() do PHP</b></center></p>
      <b>Remetente</b><br>
      Nome:<br>
      <input name="nomeremetente" type="text" size="100">
      <br>
      E-mail(*):<br>
      <input name="emailremetente" type="text" size="100">
 
      <font size="-2">Este e-mail ser&aacute; usado no campo Reply-To, o script automaticamente definir&aacute; o e-mail do remetente com base no seu dom&iacute;nio</font>
      <br><br>
      <strong>Destinat&aacute;rio</strong><br>
      E-mail:<br>
      <input name="emaildestinatario" type="text" id="emaildestinatario" size="100">
      Assunto:<br>
      <input name="assunto" type="text" id="assunto" size="100">
      <br>
      Mensagem:<br>
 
      <textarea name="mensagem" cols="75" rows="5" id="textarea"></textarea> 
      <br>
      <input type="submit" name="Submit" value="Enviar">
      <input type="reset" name="limpar" value="Limpar">
     </td>
    </tr>
    <tr>
     <td>
    <b> Veja tamb&eacute;m: </b>
 
    <br>
    <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>
    <br>
    <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&ccedil;&atilde;o para Envio de Mensagens mail()</a>
    <br>
    <b>*Aten&ccedil;&atilde;o:</b>Use sempre como endere&ccedil;o de remetente o e-mail de um dom&iacute;nio hospedado na LocaWeb, caso contr&aacute;rio a mensagem enviada poder&aacute; ser considerada pelo destinat&aacute;rio como sendo um poss&iacute;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$|publiccloud.com.br$', $_SERVER[HTTP_HOST])) {
        $emailsender='email@dominio.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.  */
if(PATH_SEPARATOR == ";") $quebra_linha = "\r\n"; //Se for Windows
else $quebra_linha = "\n"; //Se "não for Windows"
 
// Passando os dados obtidos pelo formulário para as variáveis abaixo
$nomeremetente     = $_POST['nomeremetente'];
$emailremetente    = $_POST['emailremetente'];
$emaildestinatario = $_POST['emaildestinatario'];
$assunto           = $_POST['assunto'];
$mensagem          = $_POST['mensagem'];
 
 
/* Montando a mensagem a ser enviada no corpo do e-mail. */
$mensagemHTML = '<P>Esse email &eacute; 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 .= "Reply-To: " . $emailremetente . $quebra_linha;
// Note que o e-mail do remetente será usado no campo Reply-To (Responder Para)
 
/* Enviando a mensagem */
//É obrigatório o uso do parâmetro -r (concatenação do "From na linha de envio"), aqui na Locaweb:
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!<br><br>
De: $emailsender<br>
Para: $emaildestinatario<br>
Com cópia: $comcopia<br>
Com cópia Oculta: $comcopiaoculta
<p><a href='".$_SERVER["HTTP_REFERER"]."'>Voltar</a></p>"
?>



Warningblue.png

Atenção: O código mencionado acima é somente um exemplo. Caso haja dúvidas quanto sua utilização, sugerimos que verifique juntamente a um desenvolvedor de sua confiança.


Veja também


Links

Ferramentas pessoais
Espaços nominais

Variantes
Ações
Navegação
Ferramentas
Criar um livro