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:

LocawebHospedagem 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>

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

No 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

<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.


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">

Formulário para envio de mensagens através da Função mail() do PHP

     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. */

$mensagemHTML = '

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>

Veja também