July 19, 2015

How To Use External SMTP Server with PHP mail() Function

PHP concept

Any modern website needs a few dialogues were users can either subscribe to a newsletter or they get a contact form to a send a request directly from that page.

PHP mail()

There are thousands of free scripts available which are all using the PHP mail() function.

PHP mail() uses the program indicated in the ‘sendmail_path’ in php.ini. On Debian Jessie you can find php.ini under


Now using your own linux server to send e-mail is not necessarily a wise idea and there are many constraints. You need to set up DKIM keys and you have to patch your server quite often to ensure the e-mails send by “your” server will not be flagged as spam my most professional e-mail providers.

It’s far better to use an external SMTP server. Below I will show how to set this up on A Debian Linux and with fastmail.com as the provider:

Installation MSMTP

First we should update our apt-repository and we should ensure that everything is updated to the latest and created. Next we will download and install MSMTP as the program to communicate from our Linux distribution to an external SMTP provider.

apt-get update
apt-get upgrade
apt-get install msmtp

Configuration of MSMTP

Every user has an own configuration file under ~/.msmtprc .

Edit your own configuration with your editor of choice. I’m using vi(m):

vi ~/.msmtprc

The file should like the following (you have of course to edit your username and credentials – the account “name” can be anything you want, we are using fastmail in this example):
account fastmail

tls on
tls_starttls off
tls_certcheck off
auth on
host mail.messagingengine.com
user youremailaddress@yourdomain.com
from youremailaddress@yourdomain.com
password yourpassword

MSMTP doesn’t work if this file has rights higher than 600. This is a security measure, as the file contains the password and as such it has to be readable strictly by the owner only.

chmod 600 ~/.msmtprc

Now you have to create an email test file, as we want to check if things are working well. Create in any folder of your choice a file called ’email_test.txt’. It should contain something like the following.

From: Tim Cook <tim.cook@example.com>
To: Jeannot  <jeannot.muller@ramgad.com>
Subject: Testing our external SMTP Server Access
This email was sent using MSMTP via Fastmail SMTP server.

In the next step we will launch msmtp in debug-mode. “fastmail” stands for whatever name you gave your account above. If you used a different account name, this has to get changed in the below line as well. The email address ‘jeannot.muller@ramgad.com’ needs to get replaced by one of your email addresses to check if things are running correctly.

cat email_test.txt | msmtp --debug -a fastmail jeannot.muller@ramgad.com

Due to the debugging flag, you will get a rather long report, which might help you, in case things are not running properly. If you the test e-Mail, all is working just fine.

ignoring system configuration file /etc/msmtprc: No such file or directory
loaded user configuration file /root/.msmtprc
using account fastmail from /root/.msmtprc
host                  = mail.messagingengine.com
port                  = 465
timeout               = off
protocol              = smtp
domain                = localhost
auth                  = choose
user                  = jeannot.muller@ramgad.com
password              = *
passwordeval          = (not set)
ntlmdomain            = (not set)
tls                   = on
tls_starttls          = off
tls_trust_file        = (not set)
tls_crl_file          = (not set)
tls_fingerprint       = (not set)
tls_key_file          = (not set)
tls_cert_file         = (not set)
tls_certcheck         = off
tls_force_sslv3       = off
tls_min_dh_prime_bits = (not set)
tls_priorities        = (not set)
auto_from             = off
maildomain            = (not set)
from                  = jeannot.muller@ramgad.com
dsn_notify            = (not set)
dsn_return            = (not set)
keepbcc               = off
logfile               = (not set)
syslog                = (not set)
aliases               = (not set)
reading recipients from the command line
TLS certificate information:
        Common Name: *.messagingengine.com
        Organization: FastMail Pty Ltd
        Locality: Melbourne
        State or Province: Victoria
        Country: AU
        Common Name: DigiCert SHA2 High Assurance Server CA
        Organization: DigiCert Inc
        Organizational unit: www.digicert.com
        Country: US
        Activation time: Tue Apr  8 00:00:00 2014
        Expiration time: Fri Dec 30 12:00:00 2016
        SHA1: 95:8B:16:01:56:3A:EF:92:60:7A:41:EB:5B:AD:22:E3:CA:CE:84:31
        MD5:  D8:F5:7E:43:A8:DA:29:22:6B:7E:90:A6:31:86:C8:CD
 EHLO localhost
 MAIL FROM:<jeannot.muller@ramgad.com>
--> RCPT TO:<jeannot.muller@ramgad.com>
--> DATA
-- 354 End data with <CR><LF>.<CR><LF>
--> From: Tim Cook <tim.cook@example.com>
--> To: Jeannot  <jeannot.muller@ramgad.com>
--> Subject: Testing our external SMTP Server Access
--> This email was sent using MSMTP via Fastmail SMTP server.
--> .

Configuration of PHP

Now that our test e-Mail was successfully sent, we have to tell PHP what to do, in case PHP mail() is getting called by any script.

First we have to copy “our” working configuration to the system-wide folder:

cp -p ~/.msmtprc /etc/.msmtp_php

Next we have to change the ownership to the one used by Apache2.

chown www-data:www-data /etc/.msmtp_php

Finally we have to edit our php.ini file:

vi /etc/php5/apache2/php.ini

Search for the sendmail_path = line. Ensure that any leading ‘;” will be deleted and change the path to:

sendmail_path = "/usr/bin/msmtp -C /etc/.msmtp_php --logfile /var/log/msmtp.log -a fastmail -t"

(here again, ‘fastmail’ stands for the name of the account you defined above. If you used a different name, you have to change it here as well).

Last but not least, we have to create the appropriate empty log files on our own:

touch /var/log/msmtp.log
chown www-data:www-data /var/log/msmtp.log

Now all we have to do, is restarting our Apache2 Server and we are good to go:

/etc/init.d apache2 restart


Jeannot Muller

Entrepreneur, developer, author.

Click Here to Leave a Comment Below

Leave a Reply: