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

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

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)

A Locaweb comercializa as versões 11.0 e 11.5 do painel Plesk, entretanto temos clientes que utilizam as versões 7 e 8.
A função de envio no ambiente Linux se diferencia ente as versões dos painéis, conforme mostramos nos exemplos abaixo. Verifique esta wiki para identificar qual versão utiliza.

Nos servidores Windows com Painel Plesk versão 11.0, o envio via script necessita ser autenticado, então os exemplos abaixo não devem ser aplicados a este ambiente. Veja como realizar o envio clicando aqui.


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:

Mais clear.png Revenda Linux painel 8.6

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/html; 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";
?>
Mais clear.png Revenda Linux painel 11.0

A quebra de linha para utilizar no cabeçalho deve ser "\n"
É obrigatório o uso do parâmetro -r (concatenação do "From na linha de envio"), devido ao envio ser feito através do Postfix.

<?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/html; 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, "-r"."eu@seudominio.com");
 
if($envio)
 echo "Mensagem enviada com sucesso";
else
 echo "A mensagem não pode ser enviada";
?>
Mais clear.png Revenda 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/html; 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.

Mais clear.png 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()].

Mais clear.png Campos To, Cc e Bcc (remetente)

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 no Plesk 8.6 (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);

E na função mail no Plesk 11.0 (ou seja, o campo To):
Locaweb mail("destinatario@algum-email.com", "Assunto", "Texto", $headers, "-r"."eu@seudominio.com");
Locaweb mail("Algum Nome <destinatario@algum-email.com>", "Assunto", "Texto", $headers, "-r"."eu@seudominio.com");


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()].

Mais clear.png 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"><br>
      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>
<p><a href='".$_SERVER["HTTP_REFERER"]."'>Voltar</a></p>"
?>



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



Ferramentas pessoais
Espaços nominais

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