Configuring PHP under Windows to use Gmail or External SMTP Server [SSL]
Keywords: SSL, SMTP Authentication, External SMTP, Google Apps, Fake Sendmail
When installing and setting up Apache, PHP and MySQL on my Windows Server box I have a unique problem, I didn't run my own mail server. I got sick of having to deal with spam issues as well as ensuring maximum uptime or end up losing mail. I then decided to take advantage of Google Apps, which allows you to use Google Services for your domains including the Gmail Service, which allows you to have your email handled by Google. What's best? You still keep the domain name, so you get all the features of Gmail, but with your own domain name and you still retain full control of users. To see an example of the log on, check out http://mail.digiex.net.
One big problem with this though, how do you configure PHP so it can send mail now that you don't run the mail service yourself? In the PHP.ini you can configure to use SMTP to drop off mail but it doesnt offer you many options, whats missing is SSL support which Gmail uses as well as SMTP authentication which yet again, Gmail uses.
This is the best part, I found a "Unix fake sendmail" application for Windows, what this does is accepts mail in the same way Unix does, but then passes it onto another mail server and supports SSL and authentication.
Configuration
Note: If you are intending to use Gmail or Google Apps with Custom Domain, please read this for an update regarding the SSL problems.
This configuration will talk you through setting up the service with Gmail using a Custom Domain. If you have not yet done this, you will need to set up Google Apps for your Domain by clicking here. Once you have enabled Gmail for your domain you will need to set up an account for webmaster or whatever email address you intend to use for your PHP Mails. Once the account is created you must log into it once and enable POP3 or IMAP under Settings, this usually then enables SMTP on your Gmail so that you can use it with this.
If you are not using Gmail you will need to do some additional steps like setting up the SMTP server and port. You will need to find these out from your email provider. This does NOT work with Windows Live Domains due to the lack of SMTP.
Step 1 - Download and Configure Sendmail
The first step is to download Fake Sendmail created by Byron Jones. I have provided a copy which already has SSL supported added in and configured to work with Gmail which can be downloaded by clicking here.
You will need to extract it somewhere on your Server. Its recommended you choose somewhere sensible because once set up you will need to reconfigure PHP if you change the path, so don't bother with your Desktop. If you have locked down Apache and PHP with a seperate locked down user account, that user account with need access to read and run applications in the folder where you store Sendmail. For the purpose of this guide, I have stored it in C:\inetpub\sendmail\
Once extracted, open Sendmail.ini in your favourite text editor, Notepad will do. You will need to customize this configuration to your own. The lines highlighted in red must be changed and configured to your domain settings. Words highlighted in blue should ONLY be changed if you are not using Gmail for your email.
Code:
; configuration for fake sendmail
; if this file doesn't exist, sendmail.exe will look for the settings in
; the registry, under HKLM\Software\Sendmail
[sendmail]
; you must change mail.mydomain.com to your smtp server,
; or to IIS's "pickup" directory. (generally C:\Inetpub\mailroot\Pickup)
; emails delivered via IIS's pickup directory cause sendmail to
; run quicker, but you won't get error messages back to the calling
; application.
smtp_server=smtp.gmail.com
; smtp port (normally 25)
smtp_port=587
; the default domain for this server will be read from the registry
; this will be appended to email addresses when one isn't provided
; if you want to override the value in the registry, uncomment and modify
default_domain=domain.com
; log smtp errors to error.log (defaults to same directory as sendmail.exe)
; uncomment to enable logging
error_logfile=error.log
; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging
;debug_logfile=debug.log
; if your smtp server requires authentication, modify the following two lines
auth_username=webmaster@domain.com
auth_password=password
; if your smtp server uses pop3 before smtp authentication, modify the
; following three lines
pop3_server=
pop3_username=
pop3_password=
; to force the sender to always be the following email address, uncomment and
; populate with a valid email address. this will only affect the "MAIL FROM"
; command, it won't modify the "From: " header of the message content
force_sender=webmaster@domain.com
; sendmail will use your hostname and your default_domain in the ehlo/helo
; smtp greeting. you can manually set the ehlo/helo name if required
;hostname=
Once you have configured this you can save your sendmail.ini and Sendmail is configured. Its now time to move onto Step 2.
Step 2 - Configuring PHP to use Sendmail
You will need to open your PHP configuration (PHP.ini), you will then need to look for the [mail function] section. Once there, look for the line which asks for Sendmail path, you may notice it says for Unix only, but ignore this.
Code:
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = "C:\inetpub\sendmail\sendmail.exe -t"
In this case, I am storing "sendmail.exe" in C:\inetpub\sendmail. If you are storing it elsewhere, be sure to declare it here. You also need to add the argument -t for it to work.
Also ensure all other options under [mail function] is commented out using ; so that the sendmail path is the only option uncommented.
Your [mail function] should now look something like this:
Code:
[mail function]
; For Win32 only.
;SMTP = localhost
;smtp_port = 25
; For Win32 only.
;sendmail_from = me@example.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = "C:\inetpub\sendmail\sendmail.exe -t"
; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =
You have now configured PHP to use your sendmail which should in turn send the mail via your Gmail account (or whatever account you configured). Now its time to test it...
Step 3 - Test
You will need to now run a php script under your PHP environment which sends mail via the PHP sendmail command. In my case it was easy to test with vBulletin.

Once you have sent the email, check the Inbox for whichever account you sent it in a couple of minutes and the email should be there!
If you received an email, congratulations you have configured your web server perfectly 
If not, there could be a problem. To help with troubleshooting heres a few things to check:
Check the error log of the PHP script and make sure it didnt have any problems running the Sendmail command in PHP.
Check the error.log in the Sendmail.exe directory and see if it had problems logging into your SMTP server to send the mail
Make sure the receipt is not having email problems, try it with a few people with different mail providers incase theres a problem there.
Bookmarks