Signer par DKIM ses emails envoyés avec CakePHP

Configurer DKIM sur votre serveur

Envoyer des emails depuis un serveur est facile. Envoyer un email qui arrive effectivement dans la boîte mail du destinataire est beaucoup plus dur, car les hébergeurs d'emails comme Gmail sont parfois trop zélés dans leur lutte contre le SPAM. Afin de passer leurs tests, il faut configurer de nombreuses choses comme le champ SPF ou la signature DKIM.

Je ne vais pas couvrir le sujet de la signature d'emails avec DKIM. Je vous renvoie à deux tutoriels très clairs et simples pour Ubuntu : DKIM with Postfix for Ubuntu ou Postifx/DKIM.

Tester la configuration de vos emails

Heureusement, tester ses emails est plus façile que de configurer son serveur. Il y a plusieurs solutions comme : mail-tester ou brandonchecketts. Ils permettent tous les deux d'envoyer un email de test vers une adresse mail aléatoire, et obtenir une analyse en profondeur de votre email : champ SPF, signature DKIM, score SpamAssassin,... Cela permet de savoir si les réglages d'emails sont corrects.

Résultats de mes tests

Après avoir configuré consciencieusement ma signature DKIM et le champ DNS du domaine, j'ai été très déçu de voir que tous mes tests étaient des échecs. J'ai essayé de configurer une nouvelle signature DKIM, mais les tests continuaient à être négatifs.

Je devenais désespéré quand j'ai eu l'idée de tester la signature DKIM de mes emails envoyés depuis un webmail installé sur mon serveur au lieu d'utiliser mon application CakePHP. J'ai reçu ma première bonne nouvelle : les emails envoyés par le webmail étaient parfaits et passaient tous les tests. La mauvaise nouvelle était que CakePHP était responsable.

Je me suis alors plongé dans la lib de CakePHP et la classe CakeEmail pour comprendre d'où venait le problème. J'ai commencé par désactiver à la main tous les headers configurés par Cake, ce qui a permis à mes emails de réussir les tests. J'ai finalement trouvé que c'étaient les headers 'Content-Type' et  'Content-Transfer-Encoding' qui posaient problème et faisaient échouer la signature DKIM. Dans mon cas précis, j'ai compris que ce qui causait le problème était que mes messages étaient encodés en UTF-8 donc en 8bit ce qui modifie le header envoyé par CakePHP. En utilisant un jeu de caractères 7bit pour les emails, il n'y avait plus aucun problème dans l'envoi de mails et la signature DKIM. Malheureusement pour couvrir tous les caractères spéciaux en français, il faut 8bit et UTF-8.

Une solution

Comme mentionné avant, en utilisant un jeu de caractères 7bit, il n'y a à priori pas de problèmes. Cependant pour encoder ses emails en UTF-8, la seule solution que j'ai trouvé est de modifier la fonction _getContentTransferEncoding() appelée dans lib/Cake/Network/Email/CakeEmail.php pour qu'elle renvoie toujours '7bit'. C'est un bidouillage, mais au moins cela permet d'envoyer des emails qui s'affichent correctement, passent les tests de DKIM et permet de continuer à utiliser OpenDkim et CakePHP avec une modification minime.

Plutôt que de modifier la fonction directement dans la librairie (c'est maaal), il vaut mieux déclarer une nouvelle classe DkimEmail dans le répertoire Lib de votre application. Pour envoyer un email compatible avec DKIM il faudra alors utiliser :

$email = new DkimEmail(); au lieu de $email = new CakeEmail();

<?php

class DkimEmail extends CakeEmail {
	protected function _getContentTransferEncoding() {
		return '7bit';
	}
}

?>

Vous avez une meilleure solution?

Si vous avez déjà rencontré ce problème et vous avez une autre solution, partagez là !

Cette page appartient aux catégories suivantes: actualités , CakePHP.

Commentaires

Ajoutez un commentaire

5103
Petits fours servis