====== Créer son site web en php : envoi de mails ======
* Objet : envoyer des mails en php
* Niveau requis : avisé
* Commentaires : développement, php, système linux, auto-hébergement
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-)
===== Introduction =====
Configurer son système pour l'envoi de mail en php.
Le contexte, l'auto-hébergement.
Deux solutions, msmtp ou postfix.
La première solution permet d'envoyer des mails depuis son site en se servant du client msmtp et d'un serveur SMTP extérieur, comme celui de google qui fait office de relais.
L'avantage de cette première solution est d'être légère et facile, évitant d'avoir à gérer un serveur IMAP et SMTP. Le désavantage c'est que le site pourra seulement émettre des mails, mais pas en recevoir sur sa propre adresse mail bien officielle et qui serait celle du domaine. Si on veut que son site puisse recevoir des messages, le travail sera côté développement php, par exemple, en proposant au visiteur du site une page du site consacrée à l'envoi de messages via un simple submit qui envoie à une adresse mail dédiée au site les messages ainsi rédigés.
Bref, dans ce cas, on utilise les serveurs SMPT des autres.
La deuxième solution, c'est d'installer un client ET un serveur SMTP, comme postfix, mais cela impose si on fait de l'auto-hébergement d'ouvrir le port 22 de sa box, et donc d'apprendre à sécuriser un serveur SMTP.
===== msmtp =====
====Installation et paramétrage====
* On installe les outils d'envoi de mail :
apt install msmtp msmtp-mta
* On édite le fichier de configuration de msmtp ''/etc/msmtprc'' pour se servir du serveur SMTP de son fournisseur de domaine, par exemple gandi.
vim /etc/msmtprc
account default
host mail.gandi.net
from admin@comgocom.pw
auto_from off
add_missing_from_header on
auth plain
port 587
user application@comgocom.pw
password mot-de-passe-de-l'adresse-mail-gandi-associée-au-nom-de-domaine-du-site-web
logfile /var/log/msmtp
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
* **host mail.gandi.net** : c'est le mail DNS de gandi
nom de domain -> boite mail et redirection -> clic sur le mail associé
{{/file-Ra65c4054ffec4f80293c45833e900837.png}}
* **user application@comgocom.pw** : c'est le nom de la messagerie associée au domaine servant pour le site web
{{/file-R1e8ae758462487d12172eaf18416fb7c.png}}
* **from admin@comgocom.pw** : c'est l'alias de l'adresse nom de la messagerie associée au domaine servant pour le site web
* **tls_trust_file /etc/ssl/certs/ca-certificates.crt** : si aucun certificat se trouve à ce chemin, tout fonctionne malgré cela.
* On édite le fichier php.ini d'apache pour utiliser cette configuration lors de l'utilisation de la fonction php mail()
vim /etc/php/7.3/apache2/php.ini
sendmail_path = /usr/bin/msmtp -t
* utilisation en php
Il ne reste plus qu'à ajouter au code source de son site, une fonction php qui permet d'envoyer un mail.
Il faut bien sûr que le site est récupéré et conservé l'adresse à laquelle la fonction d'envoi s'adresse.
private function envoyerMailConfirmation($pseudo, $destinataire, $prenom, $nom, $motpasse)
{
$cle = md5(microtime(TRUE)*100000);
// Préparation du mail contenant le lien d'activation
$sujet = "Activer votre compte" ;
$entete = "From: inscription@essai.local" ;
$message = 'Bienvenue '.$prenom. ' '.$nom.',
Votre pseudonyme est '.$pseudo.'.
Votre mot de passe est '.$motpasse.'.
Votre cle est : '.$cle.'
Pour activer votre compte, veuillez cliquer sur le lien ci dessous
ou copier/coller dans votre navigateur internet.
http://mondomaine.bla_ou_localhost/public/pages/activationMail.php?log='.urlencode($pseudo).'&cle='.urlencode($cle).'
---------------
Ceci est un mail automatique, Merci de ne pas y répondre.';
mail($destinataire, $sujet, utf8_decode($message), $entete) ; // Envoi du mail
$this->requete->insererCle($pseudo, $cle);
}
* La personne ayant pour adresse mail ''$destinataire'' recevra un mail contenant son pseudo son mot de passe et une clé.
C'est là un exemple, et pour le faire fonctionner, il faut créer une page "activationMail.php" sur son site où le lien dans le mail faire arriver.
* Pour tester en ligne de commandes php, il faut paramétrer le cli :
vim /etc/php/7.3/cli/php.ini
sendmail_path = /usr/bin/msmtp -t
====Paramétrage du DNS de son fournisseur de domaine====
{{/file-Rf3eb4cff75e262bf85cde75ebcb2938d.png}}
Dans cet exemple, à partir de la configuration DNS par défaut qui correspond au nom de domaine comgocom.pw :
* Les champs de **type A** permettent de rejoindre une box machin_chose_1 d'ip 78.115.221.146 ou la box machin_chose_2 qui sont paramétrées pour rediriger le port 80 vers une machine sur laquelle tourne apache2 et qui possède le code source du site.
* Le dernier champ **CNAME** a été ajouté pour créer un alias www.comgocom.pw qui pointe sur comgocom.pw
====Autres configurations pour l'envoi de mail en PHP depuis le site ====
* ''/etc/hosts''
more /etc/hosts
127.0.0.1 localhost
127.0.1.1 Eve
192.168.0.18 db
192.168.0.18 comgocom.pw
192.168.1.80 comgocom.pw
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
* 192.168.0.18 comgocom.pw : c'est l'ip fixée à cette adresse au niveau du routeur de la box_machin_1 sur laquelle est redirigé le port 80
* 192.168.1.80 comgocom.pw : c'est l'ip fixée à cette adresse au niveau du routeur de la box_machin_2 ...
===== postfix =====
Il faut aller sur le compte de son fournisseur d'accès internet et rediriger le port 25 sur l'ip fixe de la machine où est installé postfix.
Il faut décocher la case "Autoriser l'envoi de courriels..." pour émettre depuis postfix
{{/file-R93ee758276b492f717878ce95dc0878c.png}}
====Installations et configurations ====
* Pour utiliser le client mail en ligne de commande
apt install mailutils
* Pour utiliser la commande dig (info sur dns reverse)
apt install dnsutils
* Pour créer des clés d'authentification dns
apt-get install opendkim opendkim-tools
apt install postfix
Lors de l'installation de postfix répondre :
* Site internet
* Nom du domaine des adresses mails, ici comgocom.pw
===Configuration de postfix /etc/postfix/main.cf ===
kate /etc/postfix/main.cf
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = comgocom.pw
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
#myorigin = /etc/mailname
mydestination = $myhostname, comgocom.pw, Eve, localhost.$mydomain, $mydomain
relayhost =
mynetworks = 127.0.0.0/8 192.168.1.0/24 192.168.0.0/24 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
kate /etc/hosts
127.0.0.1 localhost
127.0.1.1 Eve
192.168.0.18 db
192.168.0.18 comgocom.pw mail.comgocom.pw
192.168.1.80 comgocom.pw mail.comgocom.pw
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
* Pour changer le nom de la machine par le nom de domaine, pour que le mail envoyé le soit ...@domain au lieu de ...@hostname
hostnamectl set-hostname comgocom.pw
kate /etc/aliases
# /etc/aliases
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
root: nathalie
admin: nathalie
* Pour régénérer le fichier aliases.db
newaliases
===Configuration de OpenDKIM ===
kate /etc/opendkim.conf
* On modifie la ligne commençant par Socket pour mettre ceci :
Socket inet:12301@localhost
* Connexion du mail avec Postfix:
kate /etc/default/opendkim
SOCKET="inet:12301@localhost"
* Configurer postfix pour qu'il utilise le mail :
kate /etc/postfix/main.cf
On ajoute les deux lignes suivantes :
milter_protocol = 2
milter_default_action = accept
systemctl restart postfix
* créer les dossiers pour ranger les clés :
mkdir /etc/opendkim && mkdir /etc/opendkim/keys
* Le fichier définissant les hosts de confiance
kate /etc/opendkim/TrustedHosts
127.0.0.1
localhost
192.168.0.1/24
192.168.1.1/24
*.comgocom.pw
* créer les tables des clés :
kate /etc/opendkim/KeyTable
mail._domainkey.comgocom.pw comgocom.pw:mail:/etc/opendkim/keys/comgocom.pw/mail.private
* Déclarer les adresses mails qui correspondent aux clés :
kate /etc/opendkim/SigningTable
*@comgocom.pw mail._domainkey.comgocom.pw
* Générer les clés :
cd /etc/opendkim/keys
mkdir comgocom.pw
cd comgocom.pw
opendkim-genkey -s mail -d comgocom.pw
chown opendkim:opendkim mail.private
* Prendre le contenu de /etc/opendkim/keys/comgocom.pw/mail.txt pour mettre dans le DNS de gandi, ajout d'un ''TXT''
more /etc/opendkim/keys/comgocom.pw/mail.txt
mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0+srrYaYVjb47PPRNKnmw9SpDaLyZDyF74g2xhfbo+Hg0OeOSGiTLVb9YBMQnWrAcWHroUDJr6lSjDpQ/A4aON+XAdyHGmdaC/idLYLkIIwDxoLQBGJrfjfhf+pVaQj3sWI0
IiTIOltzyiIK4k7yNlaZqcpfOp2i2bP0adcfPyRFdqcWKob0bHStk2OFGRTq8C9YxhdatHM1yW"
"YmeWelo1xH99D79XAjt59CAyf3QiLcI8cfzTkD/846VKPr2ooObP5mMIpOTqO74euIRSRrtYktTDYlbxbGLfb3q7gdObSfLP18b0blneCE2Osd3Q0E1KW98d80ESEmZJRyyhI0TwIDAQAB" ) ; ----- DKIM key mail for comgo
com.pw
{{/file-R188f0780312575b65eeff6e7d8de2662.png}}
service postfix restart
service opendkim restart
===Autres commandes utiles===
* Logs
tail /var/log/mail.info
ls -lrt /var/log