quinta-feira, 7 de fevereiro de 2008

Enviando e-mails diretamente do PHP.

Esta é uma tradução livre deste artigo do howtoforge.

Este tutorial mostra como você pode facilmente enviar e-mail de um servidor com suporte ao PHP. Algumas utilizações possíveis são utilizar para processar dados de formulários, enviar alertas, criar um workflow dentro da sua aplicação, entre outras.

Também é explicado um pouco sobre os cabeçalhos de e-mail.

Continuar lendo...


Configuração do sistema.

Obviamente você necessitará de um servidor web com suporte ao PHP habilitado. Também será necessário certificar-se que o MTA está instalado e configurado corretamente (como, por exemplo, o Sendmail no Linux ou o serviço de SMTP no IIS). Certifique-se ainda que a porta 25 não está sendo bloqueada. Isto é necessário mesmo que você faça relay das mensagens através de um segundo servidor.

O PHP possui a função de e-mail habilitada por padrão. Entretanto, você necessita especificar opções adicionais no "php.ini" (veja no seu arquivo php.ini a seção "[mail function]" por volta da linha 700.

Sintaxe:

Aqui vemos a sintaxe completa da função mail():

bool mail ( string $email_address_to, string $subject, string $message_contents [, string $additional_headers [, string $additional_parameters]] );

Os primeiros 3 parâmetros não necessitam de explanação: destinatário, título da mensagem e o conteúdo. O parâmetro $additional_headers inclui os cabeçalhos de e-mail que listarei mais abaixo. Este parâmetro também é utilizado para passar opções específicas para o programa utilizado para o MTA e é raramente utilizado. Você poderá saber mais sobre estes parâmetros adicionais consultando a documentação do MTA utilizado.

O mínimo de parâmetros necessários para enviar um e-mail são estes:

mail ( $email_address_to , $subject, $message_contents );

Entretanto, é recomendado definir os cabeçalhos adicionais por razões de compatibilidade. O e-mail deve ser compatível com a RFC #822.

O exemplo abaixo demonstra alguns cabeçalhos que podem ser utilizados:

  • From: O endereço do remetente.
  • Reply-To: Endereço para onde as mensagens com a resposta deverão ser enviadas.
  • Return-Path: Este cabeçalho pode ser utilizado quando a mensagem não puder ser entregue e retornar.
  • Subject: Título da mensagem.
  • CC: Carbon Copy. Uma lista de destinatários separados por vírgula aos quais a mensagem também será enviada.
  • BCC: Blind Carbon Copy. Uma lista de destinatários separados por vírgula aos quais a mensagem também será enviada sendo que os destinatários da mensagem não saberão que eles receberam.
  • Content-type: Define o tipo MIME da mensagem.
  • X-Mailer: Especifica o cliente de e-mail utilizado para enviar a mensagem.
É importante lembrar que o nome do cabeçalho é sensível a maiúsculas e minúsculas e cada cabeçalho deve ser finalizado com um retorno de carro e uma nova linha.

Cada mensagem é roteada por, no mínimo 2 servidores de e-mail (o do remetente e o do destinatário). Entranto, pode haver mais de um servidor de e-mail que roteia as mensagens, como servidores relay, servidores antiSPAM, etc. Cada um deles irá adicionar seus próprios cabeçalhos para sua mensagem. Tenha em mente que seu servidor web pode, dependendo das configurações, alterar alguns cabeçalhos como Return-Path. Note que este isto não alterar o campo reply-to.

Exemplo que irá enviar um simples e-mail:

[?php
$email_address_to = "destinatario@exemplo.com";
$subject = "Título do e-mail de teste";
$message_contents = "Olá! Este é o conteúdo da mensagem.";
$header = "From: remetente@exemplo.com\r\n";
$header .= "Reply-To: remetente@exemplo.com\r\n";
$header .= "Return-Path: remetente@exemplo.com\r\n"; mail($email_address_to,$subject,$message_contents,$header);
?]

Exemplo completo:
Este exemplo mostra uma estrutura mais organizada com mais opções e mais cabeçalhos

[?php
// --- CONFIG PARAMETERS --- //
$email_recipient = "destinatario@exemplo.com";
$email_sender = "Remetente";
$email_return_to = "remetente@exemplo.com";
$email_content_type = "text/html; charset=us-ascii";
$email_client = "PHP/" . phpversion();
// ------------------------- //
// --- DEFINE HEADERS --- //
$email_header = "From: " . $email_sender . "\r\n";
$email_header .= "Reply-To: " . $email_return_to . "\r\n";
$email_header .= "Return-Path: " . $email_return_to . "\r\n";
$email_header .= "Content-type: " . $email_content_type . "\r\n";
$email_header .= "X-Mailer: " . $email_client . "\r\n";
// --- SUBJECT AND CONTENTS --- //
$email_subject = "Teste para o título do e-mail"; $email_contents = "[html]";
$email_contents .= " [body]";
$email_contents .= "[h2]Test Email[/h2]";
$email_contents .= "[br]Remetente: " . $email_sender;
$email_contents .= "[br]Destinatário: " . $email_recipient;
$email_contents .= "[/body][/html ]";

// ---------------------------- //

$email_result = mail($email_recipient, $email_subject, $email_contents, $email_header);
if ($email_result) echo "E-mail enviado!";
else echo "Falha no envio do e-mail!";
?]

Notas:
  • A implementação da função mail() difere em alguns ambientes com a implementação Unix.
  • Esta função não é a melhor para enviar grandes volumes de e-mail pois ela abre e fecha a conexão com o MTA para cada mensagem enviada, a qual não é muito eficiente.
  • Substitua, nos trechos de código os caracteres [ e ] por <> respectivamente.

Nenhum comentário: