Skip to main content

Sending Emails via SMTP

msmtp requires a minimal setup for sending emails via SMTP compared to sendmail. Here is a configuration for you to send emails from a web host to an external SMTP server. Prior to doing that, you must check whether there is a clear communication channel between your web host and the SMTP server. You can use Telnet.

Set up msmtp

You are going to set msmtp as an MTA. Hence, you need to remove all other MTAs such as postfix and sendmail:

$ sudo apt-get --purge autoremove postfix sendmail

Install msmtp and related utilities:

$ sudo apt-get install msmtp msmtp-mta mailutils

Configure msmtp:

$ sudo nano /etc/msmtprc
# Set default values for all following accounts.
defaults

# Use the mail submission port 587 instead of the SMTP port 25.
port 587

# Always use TLS.
tls on

# Set a list of trusted CAs for TLS. The default is to use system settings, but
# you can select your own file.
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# The SMTP server
account mx
host mail.mx.example
from admin@mx.example
auth on
user admin@mx.example
password 123456

# Set default account to mx
account default: mx

# Map local users to mail addresses
aliases /etc/aliases

You need to change some of the values above with your own. The msmtp configuration is actually a list of commands which are executed top down. The account command defines the name of the subsequent email account details. You can give it any name. The commands host, from, auth, user and password defines the email account details. You can get more explanation and other options from the msmtp documentation.

Install mailx so that you can use mail:

$ sudo apt-get install bsd-mailx

Set msmtp as MTA:

$ sudo nano /etc/mail.rc

append the following:

set mta=/usr/bin/msmtp

Setup aliases so that the system services such as cronjobs will redirect system user emails to the external SMTP server:

$ sudo nano /etc/aliases
# Send root to John
root: john_doe@mx.example
   
# Send everything else to admin
default: admin@mx.example
$ sudo nano /etc/mail.rc

append:

alias root root<john_doe@mx.example>

Test

$ msmtp -d joe@mx.example <<END
> From: Admin <admin@mx.example>
> To: joe@mx.example
> Subject: test
> 
> test
> END

Note: Some email servers like Gmail insist the From email address. Otherwise, the email will be rejected.

If msmtp hangs at the following:

...
reading recipients from the command line
it could be msmtp is trying to connect to the SMTP server but the port is not open by your web host. msmtp will resolve to IPv6 first. If it failed or timed out then it will resolve to IPv4. Or, if you are using port 465 then ensure the Start TLS option is off in /etc/msmtprc by issuing the tls_starttls off command.

If your web host allows SMTP ports on IPv4 but not on IPv6 then you may need to set timeout to the shortest so that the trials to resolve to Ipv6 will timeout quickly. Issue command timeout 1 in /etc/msmtprc.

Let's send another test email. This time is sending to the system root that should actually go to john_doe@mx.example as defined in the /etc/aliases:
$ mail -s "Hi root" root <<END
> Testing msmtp from ${HOSTNAME} with mail command
> END
Let's send to someone@gmail.com:
$ mail -s "Hi there" someone@gmail.com <<END
> Testing msmtp from ${HOSTNAME} with mail command
> END
Notice the From address was not specified. This is because mail will set it according to the command from as in /etc/msmtprc, i.e. admin@mx.example.

If you want the From address to be the preferred email address of the current system user then you need to create a configuration file in the user home folder ~/.msmtprc. Firstly, msmtp will always try to execute a configuration from ~/.msmtprc. If it does not exist then msmtp will execute /etc/msmtprc.

PHP Mail

PHP uses sendmail to send emails. You need to replace sendmail with msmtp which is sendmail compatible. The following is a typical setup for PHP mail using msmtp. The details depend on your web server. Here we are using PHP7 and Apache2 on Debian 10.

Edit the php.ini file:
$ sudo nano /etc/php/7.3/apache2/php.ini
Find sendmail_path and assign it with the following:
sendmail_path = "/usr/bin/msmtp -t"
Restart apache (or your web server):
$ sudo service apache2 restart
Test sending an email with PHP:
if (mail("your@email.com", "Test email from PHP", "msmtp as sendmail for PHP"))
  echo "Successful";
else
  echo "Failed";
You may need to read the PHP mail documentation on the additional_headers parameter to specify a different From address, or to add CCs.


Comments

Popular posts from this blog

Setting Up PyScripter for Quantum GIS

PyScripter is a general purpose Python Integrated Development Environment (IDE). Quantum GIS (QGIS) is a desktop GIS application that can be extended with Python plugins. Both are open source softwares. We intend to use PyScripter as an IDE to build QGIS Python plugin. We are using PyScripter 2.4.1.0 and QGIS 1.6.0 in Windows. PyScripter does not come with Python. On the other hand, QGIS is built in with Python. Thus, we will setup up PyScripter to use the build in Python in QGIS. We assume both PyScripter and QGIS are already installed. Preparing PyScripter batch file We assume that QGIS is installed in C:\OSGeo4W\ folder and PyScripter is installed in C:\Program Files\PyScripter\ . 1. Copy qgis.bat in C:\OSGeo4W\ bin to pyscripter.bat 2. Edit pyscripter.bat to remove the last line that read something like this start "Quantum GIS" /B "%OSGEO4W_ROOT%"\apps\qgis\bin\qgis.exe %* and replace it with this in one line Start "PyScripter" /B "C:\Progr

fatal: Couldn't find remote ref master

If you are using Github then  master is now known as main . Whatever you want to do with a master must now be referred to a main . If you search for this error message on the Internet then you will encounter with a lot of old discussions on how to set up your master properly which is probably not what you are looking for. The master  is your problem. Rename it to main . I wrote Git My Way about two years ago. Today I created another Github repository. I got this  "fatal: Couldn't find remote ref master"  error message when I wanted to sync the new repo for the first time with my notebook using the notes I wrote in the blog. All the discussions around the error message I found on the Internet were perplexing. Then I recalled that Github had renamed master to main  due to the master-slave connotation. We always have a master copy of a code, never a slave copy. Now suddenly a word context has been diminished for good. What is going to happen to the existing vast documen