enviando e mail que chega ao destino usando php

21
Manuel Lemos [email protected] http://www.ManuelLemos.net/ CoNaPHP – CONISLI 2008 Congresso Nacional de PHP 2008 http://www.conaphp.com.br/ São Paulo, 18 e 19 de Outubro de 2008 Enviando e-mail que chega ao destino usando PHP

Upload: manuel-lemos

Post on 24-May-2015

2.668 views

Category:

Technology


4 download

DESCRIPTION

Palestra dada por Manuel Lemos no CONAPHP 2008 - Congresso Nacional de PHP que ocorreu em São Paulo nos dias 18 e 19 de Outubro dentro do CONISLI 2008

TRANSCRIPT

Page 1: Enviando E Mail Que Chega Ao Destino usando PHP

Manuel [email protected]

http://www.ManuelLemos.net/

CoNaPHP – CONISLI 2008Congresso Nacional de PHP 2008

http://www.conaphp.com.br/

São Paulo, 18 e 19 de Outubro de 2008

Enviando e-mail que chega ao destino usando PHP

Page 2: Enviando E Mail Que Chega Ao Destino usando PHP

Os problemas

● Enviar e-mail é fundamental

● Suporte nativo de envio de e-mail em PHP é deficiente

● Os padrões da Internet para composição e envio de e-mail são complicados

● Mensagens mal compostas são descartadas

● Mensagens bem compostas são confundidas com SPAM

Page 3: Enviando E Mail Que Chega Ao Destino usando PHP

A solução

Componentes prontos em PHP para envio de e-mail

● PHPMailer

● PEAR Mail

● SWIFT mailer

● MIME message

● Etc.

Page 4: Enviando E Mail Que Chega Ao Destino usando PHP

O que é MIME?● Multipurpose Internet Mail Extensions

● Padrões para envio de mensagens de E-mail

● Definidos através de muitos documentos RFC: Request For Comments

● Novas versões dos documentos RFC compatíveis com versões passadas

Page 5: Enviando E Mail Que Chega Ao Destino usando PHP

Classe MIME message

Classe em PHP para compôr e enviar e-mail

● Envia mensagens de texto e HTML com texto em qualquer alfabeto

● Embute arquivos relacionados: imagens, CSS, etc..

● Pode anexar múltiplos arquivos

● Otimizações para envio de newletters para muitos destinatários

Page 6: Enviando E Mail Que Chega Ao Destino usando PHP

Mensagem de texto

require('email_message.php');

$m = new email_message_class;

$m->SetEncodedHeader('Subject', 'Isto é o assunto');

$m->SetEmailEncodedHeader('From', '[email protected]', 'João');

$m->SetEmailEncodedHeader('To', '[email protected]', 'José');

$texto = “Olá José,\n\nEsta é a mensagem.”;

$m->AddQuotedPrintableTextPart($texto);

$m->Send();

Page 7: Enviando E Mail Que Chega Ao Destino usando PHP

Mensagem de HTML

$html = “<html><head><title>Mensagem</title></head><body>Olá José,<br />\n<br />\nEsta é a mensagem.</body></html>”;

$texto = strip_tags($html);

$m->CreateQuotedPrintableHTMLPart($html, '', $h);

$m->CreateQuotedPrintableTextPart($texto, '', $t);

$alternativas = array($t, $h);

$m->AddAlternativeMultipart($alternativas);

$m->Send()

Page 8: Enviando E Mail Que Chega Ao Destino usando PHP

Mensagem HTML com imagens embutidas

$imagem=array( 'FileName'=>'imagem.gif', 'Content-Type' => 'automatic/name', 'Disposition'=>'inline');

$e->CreateFilePart($imagem, $i);

$url = 'cid:'.

$m->GetPartContentID($i);

$html = "<html> <head><title>Mensagem</title> </head><body><img src=”$url” /> Olá José,<br />\n<br />\nEsta é a mensagem.</body></html>";

$m->CreateQuotedPrintableHTMLPart ($html, '', $h);

$texto = strip_tags($html);

$m->CreateQuotedPrintableTextPart ($texto, '', $t);

$alternativas = array($t, $h);

$m->AddAlternativeMultipart ($alternativas);

$relacionadas = array( $alternativas, $i,);$m->AddRelatedMultipart ($relacionadas);

$m->Send()

Page 9: Enviando E Mail Que Chega Ao Destino usando PHP

Mensagem com arquivos anexados

$anexo=array( 'Data'=>'Isto é um arquivo chamado anexo.txt', 'Name'=>'anexo.txt', 'Content-Type'=>'automatic/name', 'Disposition'=>'attachment',);$m->AddFilePart($anexo);$anexo=array( 'FileName'=>'anexo.zip', 'Content-Type'=>'automatic/name', 'Disposition'=>'attachment',);$m->AddFilePart($anexo);$m->Send();

Page 10: Enviando E Mail Que Chega Ao Destino usando PHP

Enviando por SMTP

Suporta vários tipos de autenticação usando as classes SASL: LOGIN, MD5, NTLM, etc.

require('sasl.php'); require('smtp.php');

require('smtp_message.php');

$m = new smtp_message_class;

$m->smtp_host = 'smtp.gmail.com';

$m->smtp_port = 465;

$m->smtp_ssl = 1;

$m->smtp_user = 'usuario';

$m->smtp_password = 'senha';

$m->direct_delivery = 0;

Page 11: Enviando E Mail Que Chega Ao Destino usando PHP

Enviando via sendmail, qmail e Microsoft Exchange

Envio mais rápido para fila de espera do MTA

require('sendmail_message.php');

$m = new sendmail_message_class;

$m->delivery_mode = SENDMAIL_DELIVERY_DEFERRED;

require('qmail_message.php');

$m = new qmail_message_class;

require('pickup_message.php');

$m = new pickup_message_class;

Page 12: Enviando E Mail Que Chega Ao Destino usando PHP

Alternativas à função mail()

Quando a função mail() não funciona bem

● smtp_mail()

● sendmail_mail()

● qmail_mail()

● urgent_mail()

Page 13: Enviando E Mail Que Chega Ao Destino usando PHP

O caminho das mensagens

Script de PHP MTA

Fila local

SMTP de destino

Fila de destinoSMTP local

mail()

SMTP Pickup

Direct

Page 14: Enviando E Mail Que Chega Ao Destino usando PHP

Melhores métodos de envio

1.Largar arquivo de mensagem na fila local

2.Passar para MTA com função mail (sendmail)

3.Passar para servidor de SMTP local

4.Enviar para direto para SMTP de destino

Page 15: Enviando E Mail Que Chega Ao Destino usando PHP

Otimização de envio de newsletters não personalizadas$lista = array(

'[email protected]'=>'Pedro', '[email protected]'=>'Paulo', '[email protected]'=>'Maria'

);

$m->SetBulkMail(1);

$m->cache_body = 1;

foreach(lista as $email => $nome) {

$m->SetEncodedEmailHeader('To', $email, $nome);

$m->Send();

}

$m->SetBulkMail(0);

Page 16: Enviando E Mail Que Chega Ao Destino usando PHP

Otimização de envio de newsletters personalizadas

$m->SetBulkMail(1);

$m->cache_body = 0;

$template = 'Olá {nome}, ...';

$m->CreateQuotedPrintableTextPart($template, '', $parte_template);

$m->AddPart($parte_template);

foreach(lista as $email => $nome) {

$m->SetEncodedEmailHeader('To', $email, $nome);

$texto = str_replace('{nome}', $nome, $template);

$m->CreateQuotedPrintableTextPart($texto, '', $personalizada);

$m->ReplacePart($parte_template, $personalizada);

$m->Send();

}

$m->SetBulkMail(0);

Page 17: Enviando E Mail Que Chega Ao Destino usando PHP

Lidando com devoluções

1.Definir o cabeçalho Return-Path com o endereço associado a uma caixa POP3

2.Vigiar regularmente esse endereço usando uma classe de cliente POP3

3.Processar as mensagens recebidas com a classe MIME parser

4.Descadastrar das newsletters os endereços de e-mail que estão devolvendo

Page 18: Enviando E Mail Que Chega Ao Destino usando PHP

Saber quando a mensagem foi recebida

Técnicas que nem sempre funcionam

1.Definir o cabeçalho Disposition-Notification-To com um endereço para onde serão enviados avisos de leitura

2.Inserir imagem espiã em mensagem de HTML com URL de script que contabiliza leituras

<img src=”http://www.meusite.com.br/[email protected]”>

Page 19: Enviando E Mail Que Chega Ao Destino usando PHP

Evitar confusão com SPAM

Que mensagens não se deve enviar?● Enviadas a partir de IP sem reverso no DNS

ou que consta de listas negras de SPAM● Destinatários só em cabeçalho Bcc● Só com HTML ou com HTML inválido● Com imagens espiãs com parâmetros no URL● URLs dos links não conferem com os textos● Não passam nos testes do SpamAssassin

Page 21: Enviando E Mail Que Chega Ao Destino usando PHP

Referências● Classe MIME Messagehttp://www.phpclasses.org/mimemessage

● Classe SMTPhttp://www.phpclasses.org/smtpclass

● Classe SASLhttp://www.phpclasses.org/sasl

● Classe POP3http://www.phpclasses.org/pop3class

● Classe MIME parserhttp://www.phpclasses.org/mimeparser

● Verificação de IP em múltiplas listas negrashttp://openrbl.org/

● SpamAssassinhttp://spamassassin.apache.org/