La version 1.2x de CakePhp possède un composant très pratique pour envoyer des courriels et permet d’éviter le recours à des solutions externes comme phpmailer ou swiftmailer (même s’ils sont incontournables dans la version 1.1x et des tutos sont disponibles dans la cuisine de cakephp).
Les mises à jour sont régulières et il est préférable de les installer car ce composant est souvent actualisé.
Toutefois, j’ai buté dans un os et, comme je suis partageur, je me dis qu’il vaut mieux le ronger à plusieurs (j’ai soumis un ticket à ce sujet sur cakephp d’ailleurs).
Envoyer un courriel avec le composant email
Le manuel est très bien fait et laisse peu de place au hasard. La création du message peut se faire directement dans le contrôleur (hum côté MCV, ça se pose un peu là) ou via des layouts et des vues (c’est mieux).
Le composant permet 2 méthodes d’envoi :
- La fonction mail de PHP : Elle est relativement limitée et, si elle n’est pas implémentée sur le serveur, ne fonctionne pas.
- L’utilisation du protocole SMTP (
sending mail protocol) : C’est ce protocole qui est généralement utilisé par les clients de messagerie habituels. Son utilisation ne nécessite pas toujours de s’authentifier mais la plupart des fournisseurs d’accès internet (FAI) l’impose pour éviter des utilisations frauduleuses de leurs serveurs.
Pour envoyer un mail via SMTP, il vous faut habituellement 3 informations : l’adresse du serveur, un nom d’utilisateur et un mot de passe, accessoirement un numéro de port (25 par défaut) . Vous les avez ? Parfait. Passons à la suite.
La configuration du composant est des plus simples et documentée dans le manuel de cakephp. Je ne reviendrais donc pas là-dessus.
Mes courriels ne partent pas !
Après avoir suivi scrupuleusement les instructions et renseigné correctement le tableau smtpOptions, vous essayez fièrement votre script et… une erreur 550, le mail n’est pas parti !
Cet incapable de serveur SMTP vous explique que le message ne peut pas être relayé depuis <votre nom de domaine ou IP> ou quelque chose dans ce goût là ! Fiévreusement, vous vérifiez toutes vos informations, elles sont correctes !
Mais que s’est-il donc passé ?
Pour le savoir, utilisons telnet (accessible par l’invite de commande sous Windows, tapez menu démarrer -> exécuter ->cmd et ok, par la console sous Linux). Pourquoi ? Telnet va nous permettre de simuler étape par étape une transaction SMTP pour voir où réside le problème.
Première étape, se connecter au serveur SMTP. Entrez la commande : telnet <votre_serveur_smtp> XX où XX est le numéro du port (généralement 25 mais pas forcément).
Normalement votre serveur devrait vous répondre quelque chose du genre : 220 - . Peut importe le texte, pourvu que le code soit 220. Cela veut dire que le serveur attend vos commandes.
Deuxième étape, dire bonjour. Entrez HELO. Le serveur va vous répondre quelque chose qui doit commencer par le code 250. Si ce n’est pas ce code, il est fort possible que le serveur n’accepte pas d’entrer en discussion avec un client non reconnu.
Troisième étape, demandez à s’identifier. Tapez AUTH LOGIN. Si le serveur vous renvoie un code 503, c’est que vous n’avez pas à vous identifier. S’il s’agit d’un code 334, il attend un identifiant et un mot de passe.
C’est cette procédure que suit le composant email de CakePhp (et c’est normal). Lorsqu’il reçoit une réponse 503, il n’envoie pas de nom d’utilisateur ni de mot de passe considérant que c’est inutile. Tout va bien quand ça l’est vraiment.
Mon hébergeur, mavenhosting (très bien au demeurant), m’a réservé une petite surprise sur laquelle j’ai passée quelques heures. Le serveur SMTP renvoyait un code 503 à mon AUTH LOGIN mais refusait d’envoyer des e-mails sans authentification et tout finissait en une belle erreur 550.
En fouillant un peu sur le net, je me suis aperçu que le standard HELO était devenu EHLO (extended HELO). Pour autant, tous les serveurs devraient pouvoir encore gérer HELO. Et bien pas Exim dans les versions supérieurs à la 4.2.
En utilisant EHLO, puis AUTH LOGIN, le serveur m’a renvoyé un code 334 pour me demander de m’authentifier. Il m’a donc suffit de modifier légèrement mailer.php à la ligne 693 comme ceci :
1 2 3 4 5 | if(!$this->__smtpSend("EHLO {$host}", '250')) { if (!$this->smtpSend("HELO {$host}", '250')) { return false; } } |
La commande HELO ne sera utilisée que si EHLO ne fonctionne pas. Je ne sais s’il est souhaitable de faire ainsi et je laisse le soin aux excellents développeurs (bénévoles qui plus est) de cakePHP de trancher. En attendant, ça semble fonctionner.

