PHP does not have any SMTP authentication mechanism in its configuration, and most developer opt for PEAR packages to perform email sending via custom ports and SMTP authentication.
I am one of those who will avoid using external packages as much as possible unless really necessary, and of course because I wanted a quick solution to my problem (or an excuse to be lazy).
By default, PHP sets SMTP as localhost and port 25. Under normal circumstances, this should be no issue as the built in Postfix will just connect to the destination server and delivers the mail. However, if your ISP blocks outgoing packets to port 25, the mail will go nowhere.
1. Enabling Postfix on Snow Leopard
Postfix is not enabled by default. You may choose to run it by default on system startup.
$ sudo vi /System/Library/LaunchDaemons/org.postfix.master.plist |
$ sudo vi /System/Library/LaunchDaemons/org.postfix.master.plist
Add before the closing </dict> tag:
<key>RunAtLoad</key>
<true />
<key>KeepAlive</key>
<true /> |
<key>RunAtLoad</key>
<true />
<key>KeepAlive</key>
<true />
Start Postfix:
sudo launchctl
launchd% start org.postfix.master |
sudo launchctl
launchd% start org.postfix.master
You can test by using telnet on port 25 if you speak SMTP protocol.
2. Configuring Postfix to use a Smart Host
A smart host is also called a relay. This means that you need an SMTP account somewhere in the Internet to send the mail for you. With spam problems, open relays are identified in databases and are blocked by destination servers, so this means that legitimate mail servers requires authentication.
I used my Yahoo! SMTP account to help me send my test emails. Yahoo! allows for PLAIN authentication. The not so good thing about this method is that your password is transmitted plain text.
GMail is more secure and requires TLS authentication and this requires postfix to have SSL support but since I need this quick I have no time to research and find out whether it is. (Excuses, excuses).
i. Create a storage file for the password, for example /etc/postfix/relay_passwd
plus.smtp.mail.yahoo.com USERNAME:PASSWORD |
plus.smtp.mail.yahoo.com USERNAME:PASSWORD
ii. Secure the config file
$ sudo chmod 600 /etc/postfix/relay_passwd |
$ sudo chmod 600 /etc/postfix/relay_passwd
iii. Create the hash database for postfix
$ sudo postmap /etc/postfix/relay_passwd |
$ sudo postmap /etc/postfix/relay_passwd
iv. Configure /etc/postfix/main.cf:
relayhost = [plus.smtp.mail.yahoo.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_passwd
smtp_sasl_security_options = |
relayhost = [plus.smtp.mail.yahoo.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_passwd
smtp_sasl_security_options =
v. Restart Postfix
sudo launchctl
launchd% stop org.postfix.master
launchd% start org.postfix.master |
sudo launchctl
launchd% stop org.postfix.master
launchd% start org.postfix.master
You should be all set. Test sending an email from PHP.
BTW, if you’re wondering, if you are a Yahoo! Mail web user, chances are that you don’t have SMTP access. However, I have heard that some countries still do have free SMTP access for now.