MantisBT et PHPMailer: problème avec l’envoi de mails

Je me suis retrouvé récemment face à un problème assez facheux. MantisBT, un logiciel de tracking de bugs, n’envoyait plus de mail. Que ce soit lors d’un ajout de bug ou lors de la procédure de réinitialisation du mot de passe: rien, nada. Pourtant, MantisBT affirmait que le mail était envoyé.

Un petit coup d’oeil dans le fichier core/email_api.php permet de voir que Mantis prend en compte les erreurs de PHPMailer via les try/catch suivants:

1
2
3
4
5
6
7
8
9
10
// Insertion du mail dans la BDD
try
{
  // Envoi du mail
  // Suppression du mail dans la BDD
}
catch ( phpmailerException $e )
{
  // Rien
}

Mais vous l’avez bien compris, MantisBT ne génère pas de message d’erreur (ni de log) si l’envoi du mail n’est pas correctement effectué. Par contre, il laisse le mail dans la BDD pour qu’il puisse être envoyé dès que le système marche à nouveau (voir core/email_queue_api.php).

Pour débugger mon affaire, j’ai donc du insérer une petite ligne de code juste après le catch:

1
echo $e->getMessage();

Et là, bingo: Could not instantiate mail function.

Pourtant, j’avais bien vérifié que la fonction mail fonctionnait correctement avec un petit if (mail("toto@test.com", "sujet", "message")) echo "ok";. Chose que je ne savais pas: si PHP est en safe_mode, la fonction mail() est amputée d’un argument:

Fonctions désactivées par le Safe Mode:
mail(): Si le Safe Mode est actif, le 5ème paramètre est désactivé (note : uniquement affecté depuis PHP 4.2.3)

Super.

Il faut donc vérifier que safe_mode = On dans php.ini pour que tout ça marche. Autre solution si votre hébergeur ne vous permet pas d’accéder au fichier de configuration, ajouter php_flag safe_mode off dans votre .htaccess.

Cela montre encore une fois que PHP est totalement imprévisible. Il y a tellement d’endroits où l’on peut écraser les paramètres d’une configuration que l’on ne peut savoir si telle ou telle fonction va marcher. Mais bon, problème résolu !

Loïs Di Qual: I'm an iOS developer based in Bordeaux, France. This is my blog.