Docker : Comment envoyer des emails depuis WordPress ?

Suite à de nombreuses péripéties avec pour résultat la mise hors ligne du blog durant plusieurs heures, le Blog tourne maintenant sur Docker. Pour cela on peut remercier, entre autres, Dominique pour ses articles sur Docker qu’il publie sur mercurenews.

Après ma transition, plusieurs soucis se posaient, l’un d’entre eux étant l’impossibilité de WordPress à envoyer des mails.

C’est ce qui me permet de recevoir les messages issus du formulaire de contact ainsi que des notifications diverses. Dans l’immédiat j’aurais sûrement pu m’en passer, en remplaçant le formulaire par un lien vers ma clef PGP et mon mail. Sauf que j’ai plusieurs idées en tête dont une éventuelle newsletter.

Ne voulant pas m’infliger une dette technique que j’aurais du être amené à rembourser il me fallait une solution.

Ne souhaitant pas non plus utiliser un SMTP externe du type Gmail, suite logique de la degooglisation du blog, je me suis donc mis à la recherche d’un moyen de mettre en place un envoi de mail directement depuis le serveur.

Le tout sans utiliser de plugin WordPress, pourquoi faire simple quand on peut faire compliquer ?

Et comme d’habitude, si je vous parle de mon problème, c’est que j’ai au minimum une astuce ou une bidouille pour le résoudre. Regardons tout ça de plus prêt !

Notez qu’ici j’utilise Docker sur un serveur où sendmail est fonctionnel.

Ajout de sendmail au Dockerfile WordPress

Sendmail est un serveur SMTP (Simple Mail Transfer Protocol), Mailutils est lui un utilitaire comprenant un ensemble d’utilitaires, de programmes et de bibliothèques pour le traitement des emails.

On commence donc par modifier le Dockerfile de WordPress afin de les ajouter à notre installation.

Comment on fait ? j’ai jamais fais ça moi !

Pas de soucis, il faut une première fois à tout ! Voici comment procéder :

  • Téléchargez les sources de WordPress
cd /tmp
git clone https://github.com/docker-library/wordpress.git .
  • Ouvrez le Dockerfile :
cd fpm
nano Dockerfile
  • Ajoutez sendmail et mailutils dans le premier block
# install the PHP extensions we need RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev sendmail sendmail-bin mailutils && rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
&& docker-php-ext-install gd mysqli opcache

Si vous utilisez nano comme moi alors faites CTRL + O puis Entrer pour enregistrer puis CTRL + X pour fermer l’editeur.

  • Pour finir reconstruisez l’image :
docker build -t wordpress-sendmail .

On vient de faire quoi là ?

Nous avons simplement téléchargé le fichier qui permet de construire l’image docker WordPress à laquelle nous avons ajouté nos paquets. Ainsi nous créons une copie exacte de l’image officielle avec nos paquets en plus !

 Configuration php

Nous allons maintenant créer un php.ini afin de lui renseigner quelques paramètres, placez vous dans le dossier de votre docker-compose.yml ou où se trouve les autres fichiers que vous liez à vos containers (nginx dans mon cas) puis créez un fichier php.ini.

Pour ça sera donc ./etc/php.ini

A l’intérieur de ce dernier insérez donc les lignes suivantes :

sendmail_path = /usr/sbin/sendmail -t -i
SMTP = localhost
smtp_port = 25

Il ne nous reste plus qu’à le lier à notre container !

 Script de modification du fichier HOSTS

Pour que sendmail fonctionne il faut lui attribuer un FQN. Pour cela nous allons créer un fichier email.sh contenant le script suivant :

#!/bin/bash
line=$(head -n 1 /etc/hosts)
line2=$(echo $line | awk '{print $2}')
echo "$line $line2.localdomain" >> /etc/hosts
service sendmail restart

 Démarrage du container WordPress

Notez que vous devrez aussi ajouter notre script à votre container, pour cela vous pouvez soit l’ajouter au Dockerfile, soit la mettre dans un dossier partager avec l’host, ce que j’ai choisi de faire.

Pourquoi ne pas l’exécuter depuis notre Dockerfile ? Car le script utilise l’ID de votre container, celui-ci changeant à chaque « couche » nous sommes obligés de l’exécuter une fois notre container lancé.

Utilisant docker-compose mon bloc WordPress ressemble donc au final à ça (notez l’apparition de la ligne pointant à notre fichier php.ini) :

wordpress:
image: wordpress-qsypoq
restart: always
links:
- mysql:mysql
volumes:
- ./wp:/var/www/html
- ./etc/php.ini:/usr/local/etc/php/php.ini
environment:
WORDPRESS_DB_NAME: ma_bdd
WORDPRESS_TABLE_PREFIX: mon_prefix

Si vous n’êtes pas certain de l’emplacement du fichier php.ini dans votre container, lancez le une première fois, puis :

docker exec -i ID_DE_VOTRE_CONTAINER php --ini

Ainsi vous recupererez les emplacements de vos differents dossiers et fichiers de configuration de php.

Une fois nos containers démarré et notre script inclus, récupérez l’ID de votre container :

docker ps

Puis exécutez votre script :

docker exec -i ID_DE_VOTRE_CONTAINER bash chemin/vers/votre/fichier/email.sh

Notez que si dans le futur vous reconstruisez votre container vous devrez à nouveau lancer le script afin que WordPress puisse continuer à envoyer des emails !

 Modifier l’envoie de mail via WordPress

Dernière étape, nous allons modifier le fichier /wp-includes/class-phpmailer.php !

Les lignes à modifier sont les suivantes :

public $From = 'root@votrevps';
public $Sender = 'root@votrevps';
public $Mailer = 'smtp';

Il ne vous reste plus qu’à renseigner l’adresse email de votre utilisateur local dans les 2 premières lignes et vous êtes bons ! smiley

A noter : l’adresse mail affichée sera celle définie dans votre tableau de bords WordPress dans la partie Réglages > Général

Envie de partager ?

Poster un Commentaire

10 Commentaires sur "Docker : Comment envoyer des emails depuis WordPress ?"

avatar
Dominique HAAS
Invité

Hello,

Merci pour la citation de mon nom et de Mercure News :)

Article très intéressant mais certain point sont un peu embêtant comme le fait de devoir modifier le docker après qu’il a été lancé :/ Imaginons que tu le supprime, il faudra refaire l’opération à chaque fois. Une possibilité serait de créer un docker qui fait office de serveur de mail. Les services serait donc bien séparé :) Je vais me pencher un peu plus sur ce sujet.

As-tu fais un test concernant le score de tes mails ( Avec https://www.mail-tester.com/ ) ? En ce qui concerne la newsletter, j’utilise le plugin Mailpoet. Pour commencer il fonctionne très bien :)

David GUENAULT
Invité
David GUENAULT

il y a plus simple comme par exemple l’utilisation de ssmtp. Tu reconstruis une image basée sur wordpress en installant ssmtp. La tu es sur que tu n’as pas besoin de t’embéter avec des scripts.

Thomas L
Invité
Thomas L

Sans vouloir dire de bêtise il me semble que SSMTP fonctionne obligatoirement avec un serveur SMTP externe c-à-d Gmail, Orange ou autres…puisque dans le ssmtp.conf il est nécessaire d’indiquer le serveur SMTP et le port par lequel les mails seront envoyés.

wpDiscuz