Phpmailer – envoyer des mails signés avec DKIM

Vous disposez de votre site web, développé en PHP, et vous souhaitez authentifier vos emails avec une signature DKIM. Quoi de plus légitime ? En plus du SPF, cela évitera à vos emails de finir classés comme SPAM.

Contexte

Je vous présente ici un paramétrage réalisé pour le site https://espace-monnaies.fr. Ce site est hébergé sur un serveur privé virtuel OVH (VPS), et les mails sont gérés par Gmail.

 

Postfix

Sur notre serveur web (que je suppose déjà fonctionnel), le seul paquet pré-requis pour la partie mails est postfix.

apt-get update
apt-get upgrade
apt-get install postfix

Je ne m’attarde pas sur sa configuration, cela va dépendre de comment vous gérez les mails de votre domaine.

 

PHPMailer

Si vous n’utilisez pas encore cette classe opensource, je vous la recommande vivement. Bien entendu, elle gère la signature DKIM qui nous intéresse dans cet article.

Lien vers le dépôt phpmailer

Pensez à inclure la classe dans votre fichier PHP (adaptez le chemin en fonction de votre arborescence).

require_once 'PHPMailer/PHPMailerAutoload.php';

Pour envoyer un email, vous devez procéder ainsi (sans parler de DKIM)

$mail = new PHPMailer();
$mail->Priority = 3;
$mail->From = 'mail@monsite.com';
$mail->Sender = 'mail@monsite.com';
$mail->FromName = 'nom de votre site';
$mail->AddAddress('destinataire@example.com');
$mail->Subject = 'sujet du mail';
$mail->IsHTML(TRUE);
$mail->Body = '<html><body><p>Message de test en html</p></body></html>';
$mail->Send();

Générer un couple clé privée / publique

DKIM se basant sur une signature par clé, il faut en générer une. Cela se fait en 2 petites commandes. Nous allons au préalable nous placer dans un dossier ou nous stockerons nos clés.

mkdir /var/dkim
cd /var/dkim/
openssl genrsa -out dkim.private 1024
openssl rsa -in dkim.private -out dkim.public -pubout -outform PEM

Vous devriez trouver vos clés dans le dossier /var/dkim/ (ou un autre dossier de votre choix).

 

Signer les mails en PHP

Modifions maintenant notre code PHP en activant la signature DKIM. Pensez à remplacer monsite.com par votre domaine.

$mail = new PHPMailer();
$mail->Priority = 3;
$mail->From = 'mail@monsite.com';
$mail->Sender = 'mail@monsite.com';
$mail->FromName = 'nom de votre site';
$mail->DKIM_domain = 'monsite.com';
$mail->DKIM_private = '/var/dkim/dkim.private';
$mail->DKIM_selector = 'mail';
$mail->DKIM_passphrase = '';
$mail->DKIM_identity = $mail->From;
$mail->Encoding = "base64";
$mail->AddAddress('destinataire@example.com')
$mail->Subject = 'sujet du mail';
$mail->IsHTML(TRUE);
$mail->Body = '<html><body><p>Message de test en html</p></body></html>';
$mail->Send();

A noter : dans selector, j’ai renseigné « mail ». C’est important pour configurer notre domaine. Vous pouvez remplacer par tout autre mot, mais pensez alors à le modifier dans les prochaines manipulations.

 

Configuration du domaine

Les enregistrements DNS du domaine doivent être modifiés. Connectez vous sur l’espace de gestion de votre domaine (dans mon cas chez OVH > Espace client).

Ajoutez un champ « DKIM » (si pas proposé chez votre hébergeur, prendre TXT) et renseignez les champs tel que sur l’image.

Ici, on revient à notre selector. J’avais mis comme valeur « mail ». Je renseigne donc en sous domaine mail._domainkey. De manière plus générale, l’annotation est selector._domainkey

Pour la clé publique / valeur, vous devez ouvrir le fichier /var/dkim/dkim.public, copier la clé sans BEGIN PUBLIC KEY et END PUBLIC KEY, le tout ramené sur une seule ligne. Ne modifiez pas le fichier dkim.public, travaillez sur une copie ou ne l’enregistrez pas…

Si vous avez du prendre un champ de type TXT, saisir en valeur

v=DKIM1;k=rsa;s=email;p=

suivi de la clé publique.

 

Vous devriez vous retrouver avec un nouvel enregistrement DNS tel que celui-ci.

 

Bravo, vous en avez terminé avec le paramétrage. A noter que la propagation des DNS peut prendre jusqu’à 48 heures.

 

Pour tester votre paramétrage, envoyer vous un mail sur une boite mail (ici gmail) et regardez le résultat.

2 commentaires

  • Bonjour,
    Merci pour ce tuto. Je pense avoir tout fait correctement mais malheureusement je ne m’en sort pas avec ce dkim signature.
    J’ai un serveur dédié KImsufi chez ovh et plusieurs domaines clients.

    J’ai donc fait un chemin et une signature dkim par domaine. Je ne m’en sort pas au niveau des DNS. J’ai bien repris le ledhul._domainkey@le-dhul.com chez gandi mais rien n’y fait. La signature n’est pas émise et le mais est rejeté en spam chez hotmail.

    Pouvez vous m’aider ?

Laisser un commentaire