Sending to lists
You can find a simple example of sending to a list held in a MySQL database here.
Some basic optimizations can be seen in that script:
- Don't create a new PHPMailer instance every time around the loop.
SMTPKeepAliveand sort your list by domain to reduce SMTP overhead and maximise connection re-use.
- Set all the properties that will remain the same for every recipient (e.g.
Subjectetc) before the sending loop so they only happen once.
- Inside the loop you should have only calls to
If the messages you send are absolutely identical, you can add all the addressees using
addBCC(), which will mean you only need to
send() a single message, though most mail servers will have a limit on the number of addresses you can send at once.
For ultimate performance, you should submit to a local mail server, though surprisingly using the
isSendmail() options in PHPMailer is not necessarily faster than SMTP to localhost, largely because postfix'
sendmail binary opens a synchronous SMTP connection to localhost anyway - postfix' docs recommend SMTP to localhost for best performance for this reason.
If you are sending to localhost, don't use authentication or encryption as the overhead doesn't gain you anything, but if you are using a remote server, use
tls on port 587 in preference to the obsolete
ssl on port 465.
Generally sending directly to end users is to be avoided. The SMTP client in PHPMailer is not an MTA - it does not handle queuing at all, so any domains with greylisting or delivery deferrals for traffic control (in particular Yahoo) will fail to be delivered. The best approach is to use SMTP to a nearby MTA and leave the queue handling to that. You can get bounces back from that as well so you can remove bad addresses from your list.
You should make sure you have a local caching DNS -
dnsmasq on Linux is a great choice.