Tester l'envoi d'emails en local avec une configuration offline pour Apache
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 :
- mhsendmail (sendmail for mailhog, https://github.com/mailhog/mhsendmail, https://blog.mailtrap.io/mailhog-explained/#What_is_mhsendmail)
- esmtp (commande système https://linux.die.net/man/5/esmtprc, dont le port peut être configuré globalement dans /etc/esmtprc, typiquement utilisé avec maildev)
- catchmail (fourni avec mailcatcher)
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/
de votre projet