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:
Revenda 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";
?>
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/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:
$headers .= "From: eu@seudominio.com\n";
$headers .= "From: Meu Nome <eu@seudominio.com>\n";
Na Revenda 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.
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><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á usado no campo Reply-To, o script automaticamente definirá o e-mail do remetente com base no seu domínio</font>
<br><br>
<strong>Destinatá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é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ção para Envio de Mensagens mail()</a>
<br>
<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='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 é 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>"
?>
|
|
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
|