L’envoi de mail automatique est un sujet passionnant quoique parfois très subtil.
Pour bien comprendre, il faut savoir que le protocole d’envoi de mail est smtp, et que smtp utilise lui-même le protocole telnet, qui est simplement un protocole d’échange de messages.
Pour envoyer un mail, on se connecte forcément sur un serveur smtp. « On », c’est vous, ou c’est votre serveur de mail, qui va lui-même se connecter (en smtp) sur le serveur de mail du destinataire, ou sur un serveur relais (on dirait que ceci ne se fait plus trop). Vous pouvez aussi utiliser un autre protocole pratiqué par votre serveur de mail, comme par exemple imap, mais in fine, c’est bien smtp qui va être utilisé.
Pour que ça marche, il faut que le ou les serveurs smtp acceptent que vous vous connectiez, et que vous envoyiez un message. Si le serveur est votre serveur linux, et que ce serveur fait partie d’un domaine officiel (ceci est fondamental) et que le dns de ce domaine mentionne ce serveur comme serveur smtp (ceci est fondamental), et que le serveur smtp est correctement configuré (ceci est fondamental), alors tout va bien, vous pouvez très facilement envoyer un mail.
Par exemple, en tapant les commandes une à une (pratique pour tester) :
La commande pour démarrer telnet :
telnet localhost 25
Le serveur répond :
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‹ ^] ›.
220 vpsxxxxxx.ovh.net ESMTP Postfix (Ubuntu)
La commande smtp HELO :
HELO mondomaine.fr
Le serveur répond :
250 vpsxxxxxx.ovh.net
La commande pour indiquer l’expéditeur :
MAIL FROM: jmbc@mondomaine.fr
Le serveur répond :
250 2.1.0 Ok
La commande pour indiquer le destinataire :
RCPT TO: jmbc@gmail.com
Le serveur répond :
250 2.1.5 Ok
La commande pour le corps du message :
DATA
Le serveur répond :
354 End data with CRLF.CRLF
Le corps du message :
Subject: test de message telnet
blabla
.
Le serveur répond :
250 2.0.0 Ok: queued as 559503E905
Et enfin, la commande QUIT :
Le serveur répond :
221 2.0.0 Bye
Connection closed by foreign host.
Et à la fin du fichier /var/log/mail.log, vous avez un truc du style :
Apr 20 10:07:20 vpsxxxxxx postfix/smtp[14846]: 35C3C3E905: to=jmbc@gmail.com, relay=gmail-smtp-in.l.google.com[66.102.1.27]:25, delay=38, delays=37/0.01/0.49/0.12, dsn=2.0.0, status=sent (250 2.0.0 OK 1555747640 n16si5169713wmh.3 - gsmtp)
Notez la mention « status=sent » qui indique que votre serveur de mail (en l’occurrence postfix) a bien fait son boulot.
Le mail va-t-il être reçu ? C’est au bon vouloir du serveur du destinataire. Ici, gmail m’a collé le message dans les spam ; mais ça marche.
En python, c’est plus facile :
import smtplib,datetime,sys
import email,email.parser
from email.header import Header
from email.mime.text import MIMEText
msg = MIMEText(‹ Bla bla ›,‹ html ›,‹ utf8 ›)
msg[‹ Subject ›] = Header(‹ Test envoi mail ›,‹ utf8 ›)
msg[‹ From ›] = ‹ jmbc@mondomaine.fr ›
dest = ‹ jmbc@gmail.com ›
msg[‹ To ›] = dest
msg[‹ Date ›] = datetime.datetime.now().strftime(‹ %c ›)
server= smtplib.SMTP(‹ localhost ›,‹ 25 ›)
msgtxt= msg.as_string()
server.sendmail(dest,[dest],msgtxt)
server.quit()
Et hop !
En php ? J’en sais rien ma foi… mais c’est bien possible que ce soit encore plus simple.
Maintenant, pourquoi ça marche chez OVH, et pas sur le RPI ?
Sûrement parce que le serveur OVH dispose d’un serveur smtp bien configuré, et qui accepte la connexion des utilisateurs locaux sans authentification.
Sur le RPI, soit vous vous connectez directement sur le serveur du destinataire (mais il faut que celui-ci accepte les connexions de la part d’une machine non référencée sur un dns, et c’est de plus en plus rare), soit vous installez et configurez un serveur smtp (attention, prévoir de l’huile de coude), mais il faudra que celui-ci soit référencé dans un dns.
Conclusion de tout ça, si vous êtes chez vous, en dehors d’un domaine, guère possible de faire du smtp. Il faut alors passer par un serveur de mail sur lequel vous avez un compte, et qui acceptera les connexions depuis chez vous, authentifiées. Et là, c’est plutôt compliqué de faire une réponse générale, car il y a plein de cas de figure. Par exemple, il faudra utiliser ce que l’on appelle les TLS, et là, je ne me lancerais pas dans une explication… Le serveur gmail sait faire, mais il faut fouiner dans les paramètres de sécurité. Le serveur de la poste sait faire aussi, il faut trouver la bonne recette sur le web.
Enfin, sauf erreur de ma part, apache ne sait pas envoyer de mail.
Bon courage, et bon amusement…