Upload
manuel-lemos
View
1.757
Download
0
Embed Size (px)
DESCRIPTION
Palestra dada por Manuel Lemos no CoLAPHP 2008 - Congresso Latino-Americano de PHP que ocorreu em Foz de Iguaçu nos dias 30 de outubro a 1 novembro dentro do LatinoWare 2008
Citation preview
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de PHP
Manuel [email protected]
http://www.ManuelLemos.net/
CoLAPHP – LatinoWare 2008http://www.latinoware.org/
Foz de Iguaçu, 30 de outubro a 1 de novembro de 2008
COLAPHP - Congresso Latino-Americano de PHPPHPBC – PHP Brasil Comunidades
http://www.php.org.br/
Enviando e-mail que chega ao destino usando PHP
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de PHP
A solução
Componentes prontos em PHP para envio de e-mail
● PHPMailer
● PEAR Mail
● SWIFT mailer
● MIME message
● Etc.
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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();
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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()
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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()
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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();
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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;
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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;
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de PHP
Alternativas à função mail()
Quando a função mail() não funciona bem
● smtp_mail()
● sendmail_mail()
● qmail_mail()
● urgent_mail()
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de PHP
O caminho das mensagens
Script de PHP MTA
Fila local
SMTP de destino
Fila de destinoSMTP local
mail()
SMTP Pickup
Direct
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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);
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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);
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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]”>
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de PHP
Perguntas?
Manuel [email protected]
PHPBC – PHP Brasil Comunidades
http://www.php.org.br/
PHPBC – PHP Brasil Comunidadeshttp://www.php.org.br/
CoLAPHP - LatinoWare 2008Congresso Latino-Americano de 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/