Replacing SSMTP with MSMTP in Docker.

Trying to build a new image of a Docker file that I’ve been running for months, and I’m greeted with this error:

1Package ssmtp is not available, but is referred to by another package.
2This may mean that the package is missing, has been obsoleted, or
3is only available from another source
4
5E: Package 'ssmtp' has no installation candidate

Looks like sSMTP is no longer maintained, and has been orphaned since 19th March 2019. MSMTP is the suggested replacement. So let’s get replacing.

The plan

  1. Install mSMTP in our Docker image
  2. Configure mSMTP to our smtp server (in this case Office 365)
  3. Tell PHP to use mSMTP for email instead of sSMTP
  4. Send a test email
  5. Final source

1. Install mSMTP in our Docker image

We’re going to start with the php:7.30-apache docker image

1FROM php:7.3-apache

Lets install msmtp with apt-get, and tidy up afterwards:

1apt-get update && apt-get install msmtp -y && \
2rm -rf /var/lib/apt/lists/*

2. Configure mSMTP to our smtp server (in this case Office 365)

We need to setup a configuration file for msmtp to have the smtp details. The msmtp config location is in /etc/

Let’s create a new file called msmtprc, and add the following configuration:

 1account default
 2host smtp.office365.com
 3port 587
 4tls on
 5tls_starttls on
 6tls_trust_file /etc/ssl/certs/ca-certificates.crt
 7tls_certcheck on
 8auth on
 9user user@domain.com
10password "YourAwesomeStr0ngP4zzw0rd"
11from "[email protected]"
12logfile /var/log/msmtp.log

This is for Office 365, change the smtp details to gmail or your own smtp server.

Copy the config into our Docker image

1COPY msmtprc /etc/msmtprc

Make the msmtprc config file readable/writable by its owner

1RUN chmod 600 /etc/msmtprc

3. Tell PHP to use mSMTP for email instead of sSMTP

Now that we have mSMTP setup, we need to tell PHP to use it.

You can get a copy of the default php.ini file from the docker image we have just created. It’s located in /usr/local/etc/php/php.ini-production

1docker cp <CONTAINER_ID>:/usr/local/etc/php/php.ini.production .

Open up your php.ini file, and make the following change to the sendmail_path variable:

1sendmail_path = /usr/bin/msmtp -t

Copy your php.ini file to the Docker image php config location:

1COPY php.ini $PHP_INI_DIR/php.ini

4. Send a test email

With all that setup we should now be able to send an email.

1. Build the Docker image

1docker build . -t php-msmtp-setup:latest

2. Run the container

1docker run -d -p 80:80/tcp php-msmtp-setup:latest

3. Log into the container

Run the following command to find the CONTAINER ID of our new container

1docker container ls

Run the following command to login to the container

1docker exec -ti <CONTAINER_ID> /bin/bash

4. Send an email directly with msmtp

1echo -e "Subject: Test Mail\r\n\r\nThis is a test mail, let me know if this works" |msmtp --debug --from [email protected] -t [email protected]

5. Send an email with php

1php -r "mail('[email protected]','Test Mail from PHP', 'This is a test mail from PHP, let me know if this works');"

5. Final source

Our Docker file

 1FROM php:7.3-apache
 2
 3RUN apt-get update && apt-get install msmtp -y && \
 4    rm -rf /var/lib/apt/lists/*
 5
 6COPY msmtprc /etc/msmtprc
 7RUN chmod 600 /etc/msmtprc
 8
 9COPY php.ini $PHP_INI_DIR/php.ini
10
11EXPOSE 80

The changes to our php.ini file

1sendmail_path = /usr/bin/msmtp -t

Our msmtprc file

 1account default
 2host smtp.office365.com
 3port 587
 4tls on
 5tls_starttls on
 6tls_trust_file /etc/ssl/certs/ca-certificates.crt
 7tls_certcheck on
 8auth on
 9user user@domain.com
10password "YourAwesomeStr0ngP4zzw0rd"
11from "[email protected]"
12logfile /var/log/msmtp.log