Sending E-mail that reaches the destination using PHP

Post on 14-May-2015

5,787 views 2 download

description

Slides of a presentation about the PHP MIME message composing and sending class. It teaches how to compose and send e-mail according to the Internet e-mail standards and without problems of messages not reaching the destination recipients, efficient bulk mailing of personalized and non-personalized messages, handling bounced messages, knowing when messages are viewed, and avoiding messages being confused with SPAM.

transcript

Manuel Lemosmlemos@acm.org

http://www.ManuelLemos.net/

http://www.phpclasses.org/mimemessage

Sending E-mail that reaches the destination

The problems

● Sending e-mail is fundamental

● PHP native support for sending e-mail is deficient

● The Internet e-mail standards are complicated

● Incorrectly composed messages are discarded

● Correctly composed messages are confused with SPAM

Solution

Ready to use PHP components for sending e mail‑

● PHPMailer

● PEAR Mail

● SWIFT mailer

● MIME message

● Etc.

What is MIME?● Multipurpose Internet Mail Extensions

● Standards for sending E-mail messages

● Defined by many RFC documents: Request For Comments

● New RFC document versions are compatible with past versions

MIME message class

PHP class to compose and send e-mail

● Sends messages with text and HTML using any character set

● Embeds related files: images, CSS, etc..

● May attach multiple files

● Optimized for sending newsletters to many recipients

Text message

require('email_message.php');

$m = new email_message_class;

$m->SetEncodedHeader('Subject', 'This is the subject');

$m->SetEmailEncodedHeader('From', 'john@here.com', 'John');

$m->SetEmailEncodedHeader('To', 'joe@there.com', 'Joe');

$text = “Hello Joe,\n\nThis is the message.”;

$m->AddQuotedPrintableTextPart($text);

$m->Send();

HTML message

$html = “<html><head><title>Messagm</title></head><body>Hello Joe,<br />\n<br />\nThis is the message.</body></html>”;

$text = strip_tags($html);

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

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

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

$m->AddAlternativeMultipart($alternatives);

$m->Send()

HTML messages with embedded images

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

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

$url = 'cid:'.

$m->GetPartContentID($i);

$html = "<html> <head><title>Message</title> </head><body><img src=\”$url\” /> Hello Joe,<br />\n<br />\nThis is the message.</body></html>";

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

$text = strip_tags($html);

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

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

$m->AddAlternativeMultipart ($alternatives);

$related = array( $alternatives, $i,);$m->AddRelatedMultipart ($related);

$m->Send()

Message with attached files$attachment=array( 'Data'=>'This is an attachment called attachment.txt', 'Name'=>'attachment.txt', 'Content-Type'=>'automatic/name', 'Disposition'=>'attachment',);$m->AddFilePart($attachment);$attachment=array( 'FileName'=>'attachment.zip', 'Content-Type'=>'automatic/name', 'Disposition'=>'attachment',);$m->AddFilePart($attachment);$m->Send();

Sending via SMTP

Supports several types of authentication using the SASL classes: 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 = 'some_user';

$m->smtp_password = 'some_password';

$m->direct_delivery = 0;

Sending via sendmail, qmail and Microsoft Exchange

Faster delivery to the MTA queue

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;

Mail() function alternatives

When the mail() function does not work well

● smtp_mail()

● sendmail_mail()

● qmail_mail()

● urgent_mail()

The path of the messages

PHP script MTA

Local queue

Destination SMTP

Destination queueLocal SMTP

mail()

SMTP Pickup

Direct

The best delivery methods

1.Drop a message file in the local queue

2.Pass to MTA with the mail function (sendmail)

3.Pass to the local SMTP server

4.Direct delivery to the destination SMTP server

Optimizing the delivery of non personalized newsletters‑

$list = array(

'peter@here.com'=>'Peter', 'paul@there.com'=>'Paulo', 'mary@overthere.com'=>'Mary'

);

$m->SetBulkMail(1);

$m->cache_body = 1;

foreach($list as $email => $name) {

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

$m->Send();

}

$m->SetBulkMail(0);

Optimizing the delivery of personalized newsletters

$m->SetBulkMail(1);

$m->cache_body = 0;

$template = 'Hello {name}, ...';

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

$m->AddPart($part_template);

foreach($list as $email => $name) {

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

$text = str_replace('{name}', $name, $template);

$m->CreateQuotedPrintableTextPart($text, '', $personalized);

$m->ReplacePart($part_template, $personalized);

$m->Send();

}

$m->SetBulkMail(0);

Handling returned messages

1.Set the Return-Path message header to an address associated with a POP3 mailbox

2.Periodically poll that mailbox using a POP3 client class

3.Process the returned messages with the MIME parser class

4.Unsubscribe from the newsletters the e mail ‑addresses that are returning the messages

Know when a message was received

Techniques that do not always work

1.Set the Disposition-Notification-To message header to an address to which reception notices will be sent

2.Insert a beacon image in an HTML message using the URL of a script that accounts messages that are viewed by recipients

<img src=”http://www.meusite.com.br/conta.php?usuario=joao@ali.com.br”>

Avoid confusion with SPAM

What types of messages you should not send?● Sent from an IP address without reverse DNS

record (PTR) or that is listed in blacklists● The recipient e-mail addresses are in Bcc● Only with an HTML part or has invalid HTML● With beacon image URL that has parameters● Link URLs do not match anchor text URL● Do not pass SpamAssassin checks

Questions?

Manuel Lemosmlemos@acm.org

http://www.phpclasses.org/mimemessage

References● MIME Message classhttp://www.phpclasses.org/mimemessage

● SMTP client classhttp://www.phpclasses.org/smtpclass

● SASL authentication classhttp://www.phpclasses.org/sasl

● POP3 client classhttp://www.phpclasses.org/pop3class

● MIME parser classhttp://www.phpclasses.org/mimeparser

● Verify IP addresses in multiple blacklistshttp://openrbl.org/

● SpamAssassinhttp://spamassassin.apache.org/