Tester l'envoi d'emails en local avec une configuration offline pour Apache

Envoi d'emails
septembre 2020
Didier Boff
L'article vous plait ? Partagez le

Ce tutoriel s'adresse aux développeurs d'applications web qui souhaitent configurer leur environnement local pour tester l'envoie d'emails sans passer par un serveur smtp externe.

Dans cet article, nous allons vous expliquer comment configurer son environnement local pour tester l'envoi d'e-mails sans passer par un serveur smtp externe. Un petit tutoriel bien utile destiné à tous les développeurs d'applications web. C'est parti !

Concept et préparation de la configuration

Un serveur local intercepte les envois de mails (généralement sur le port 1025, avec une interface web en :8025 pour Mailhog, :1080 pour les autres). Plusieurs solutions existent donc :

     1- Mailhog
     2- Maildev

     3- Mailcatcher

Une fois la solution choisie, il vous suffit de configurer la méthode d'envoi des mails par le serveur web.

Configuration d'Apache

Avec Linux : dans ce cas là, nous devons ajouter un remplacement du binaire sendmail, à choisir dans la liste ci-dessous :

L'objectif de ce programme est de fournir un binaire compatible sendmail qui fasse ensuite le pont avec un serveur SMTP (précisément ce qu'offre mailhog, maildev, mailcatcher…). En effet, il ne peut rien faire d'utile tout seul.

  • Option 1 : ajouter un lien symblique : Il est possible de créer un symlink ( sudo update-alternatives --install /usr/sbin/sendmail sendmail /usr/bin/estmp 10 ) pour que esmtp ou mhsendmail devienne le logiciel sendmail utilisé par défaut par PHP. Cela évite ainsi d'avoir à le configurer dans tous les php.ini. C'est également la méthode la plus sûre et la plus rapide en termes de mise en place. En effet, elle ne nécessite pas de modification à l'installation de nouvelle version de PHP (ex installation de PHP 7.3 en parallèle des autres).
  • Option 2 : éditer le php.ini : Pour que cela soit plus parlant, voici un petit exemple avec mhsendmail : sendmail_path = '/usr/local/bin/mhsendmail' Attention, cette méthode est viable seulement avec un nombre limité de fichiers php.ini à maintenir. Ce qui, entre parenthèse, est rarement le cas (cli, fpm, apache... différentes versions). Dans le cas contraire, il est donc préférable de se tourner vers l'option n°1.

Avec Windows : le serveur (mailhog, maildev, mailcatcher) est ici une application qui fait aussi office de service d'envoi de mails. Pour Apache, cela se traduit par une modification du php.ini à la ligne :
[mail function] ... smtp_port = 1025

Tester l'envoi d'emails en local

Nous allons voir ici, 3 méthodes afin de tester l'envoi d'e-mails en local avec une configuration pour Apache.

MailHog : la solution que nous vous recommandons

Serveur de remplacement smtp, en complément de mhsendmail

  • Installation avec Docker (recommandée) : docker run -d -p 1025:1025 -p 8025:8025 mailhog/mailhog
  • Setup manuel avec go et rpm (alternative) :

apt-get install golang-go
mkdir /home/$USER/gocode
echo "export GOPATH=$HOME/gocode" >> ~/.profile
source ~/.profile
go get github.com/mailhog/MailHog
go get github.com/mailhog/mhsendmail
sudo cp /home/$USER/gocode/bin/MailHog /usr/local/bin/mailhog
sudo cp /home/$USER/gocode/bin/mhsendmail/usr/local/bin/mhsendmail

Dans une console, lancez cette commande pour que mailHog soit actif (pris en charge automatiquement par docker, soit docker start manuel au startup) : mailhog -api-bind-addr 127.0.0.1:8025 -ui-bind-addr 127.0.0.1:8025 -smtp-bind-addr 127.0.0.1:1025

Mais afin de se simplifier la tâche, dans ~/.bash_aliases, c'est envisageable d'ajouter une fonction qui lance mailhog : function startmailhog() { mailhog -api-bind-addr 127.0.0.1:8025 -ui-bind-addr 127.0.0.1:8025 -smtp-bind-addr 127.0.0.1:1025 }

>> Les mails seront désormais accessibles à cette adresse : http://127.0.0.1:8025/#

MailDev : une alternative possible

Serveur de remplacement smtp, semblable à MailHog, en complément de mhsendmail ou esmtp

  • Installation avec npm (recommandée): npm -g install maildev
  • Installation avec Docker (alternative) : docker run -p 1080:80 -p 1025:25 djfarrelly/maildev
  • Lancement : maildev
  • Accès : L'interface web de maildev sera accessible via http://localhost:1080 par défaut. Le serveur SMTP (dans la configuration de esmtp ou mhsendmail) est localhost:1025 par défaut.

Mailcatcher : une troisième façon d'y arriver

Solution "all-in-one" comprenant à la fois le serveur smtp de remplacement et la commande sendmail.

Attention : pour le faire fonctionner avec les emails utf8 et Content-Transfer-Encoding: 8bit de Drupal, le downgrade d'une des dépendances (la gem mail en 2.6.4) peut-être nécessaire.
Source : https://github.com/sj26/mailcatcher/issues/371#issuecomment-376273028

Installation et configuration

  • Dépendances :

apt install build-essential libsqlite3-dev ruby-dev

gem install mailcatcher --no-document

  • Lancement au démarrage :

echo "@reboot root $(which mailcatcher) --ip=0.0.0.0" >> /etc/crontab update-rc.d cron defaults

  • Configuration de mailcatcher.ini

echo "sendmail_path = /usr/bin/env catchmail -f 'www-data@localhost'" >> /etc/php/5.6/mods-available/mailcatcher.ini

echo "sendmail_path = /usr/bin/env catchmail -f 'www-data@localhost'" >> /etc/php/7.0/mods-available/mailcatcher.ini

echo "sendmail_path = /usr/bin/env catchmail -f 'www-data@localhost'" >> /etc/php/7.2/mods-available/mailcatcher.ini

  • Notification de php mod manager (5.5+)

phpenmod mailcatcher

  • Redémarrage d'apache

service apache2 restart

  • php.ini :

sendmail_path = /usr/bin/env catchmail

  • Lancer mailcatcher avec :

mailcatcher --foreground --http-ip=0.0.0.0

>> Les mails seront alors consultables via l'interface de Mailcatcher : http://localhost:1080/

Didier Boff
Didier Boff
Lead Développeur