7 votes

PHPMailer 5.1 envoie des messages en double lorsqu'il ajoute plus d'un destinataire.

J'utilise PHPMailer depuis un certain temps maintenant et je n'ai jamais vraiment eu de problèmes, mais la semaine dernière j'ai installé un de mes CMS sur un site web et le client a insisté pour avoir 2 e-mails recevant le contenu du formulaire de contact de son site web.

Ok, pas de problème je me suis dit, il suffit d'ajouter une adresse e-mail en utilisant la fonction $phpmailer->AddAddress(). Cependant, l'ajout d'un deuxième destinataire fait que PHPMailer envoie le courrier deux fois aux deux destinataires. J'ai essayé d'ajouter un troisième récepteur pour voir si je recevais le message trois fois, mais cela n'a rien changé. Donc, l'ajout de 2+ récepteurs fait que PHPMailer envoie le message deux fois à tous les récepteurs.

Il n'y a rien d'étrange dans mon code. C'est un exemple basique de PHPMailer :

$mail             = new PHPMailer();
$mail->AddReplyTo("name@yourdomain.com","First Last");
$mail->SetFrom('name@yourdomain.com', 'First Last');

$mail->AddAddress("info@address.com");
$mail->AddAddress("info@address.nl");
$mail->Subject    = "PHPMailer Test Subject via mail(), basic"; 

$mail->Send();

Je suis à court d'options. Je n'ai absolument aucune idée de ce qui ne va pas.

Merci d'avance

--

Juste une pensée au hasard : J'ai remarqué que le mailer est paramétré par défaut en iso-8859-1 et que mon site fonctionne en utf8. Peut-il y avoir une redirection "silencieuse" par le serveur lui-même ?

//EDIT, cela ^^ a résolu mon problème.

//EDIT2 :

Ok, ce n'est pas le cas aujourd'hui le script a bien fonctionné (juste 1 mail avec 2 récepteurs) mais il y a un moment le comportement étrange a recommencé. Des conseils ?

// Solution :

Ok, je me sens vraiment stupide ! La réponse de Zulkhaery Basrul était la plus proche du problème réel ! Voici ce qui s'est passé : J'envoyais un e-mail à plusieurs adresses dans le champ "à". Par exemple :

A : A, B, C

Les deux A/B sont mes propres adresses. Dans Outlook, j'avais des règles de message pour placer les e-mails avec certains destinataires dans un dossier spécifique. A et B avaient tous deux cette règle.

Lorsque j'ai reçu mon courrier électronique, les deux courriers contenaient les deux adresses dans le champ "à". Ce qui fait que les deux mails répondent aux exigences des deux règles. Ainsi, l'original est conservé dans un dossier et une copie est créée dans l'autre (deux fois).

Merci d'y avoir pensé :)

5voto

Zulkhaery Basrul Points 2721

Vous pouvez utiliser $SingleTo propriété.

Extrait de la documentation de PHPMailer :

$SingleTo

Offre la possibilité de faire traiter les courriels individuels par le champ TO, au lieu de les envoyer à des "adresses de destination" entières.

$mail = new PHPMailer();

$mail->SingleTo = true; //will send mail to each email address individually

$mail->AddReplyTo("name@yourdomain.com","First Last");
$mail->SetFrom('name@yourdomain.com', 'First Last');

$mail->AddAddress("info@address.com");
$mail->AddAddress("info@address.nl");
$mail->Subject    = "PHPMailer Test Subject via mail(), basic"; 

$mail->Send();

5voto

Toux Points 90

Essayez d'ajouter après

$mail->send();

$mail->ClearAddresses();

1voto

Joshua - Pendo Points 1506

Ok, si quelqu'un rencontre ce problème comme je l'ai fait :

Mon site web fonctionne en utf-8, PHPMailer utilise iso-8859-1 par défaut. D'une certaine manière, le script est exécuté dans les deux jeux de caractères, ce qui entraîne des doublons. Changer le charset dans le fichier class.phpmailer.php pour utf-8 a résolu le problème !

1voto

Jan Cajthaml Points 143

Je pense qu'ils feront l'affaire :)

$mail->SingleTo   = true;
$mail->CharSet    = "UTF-8";

1voto

user2390733 Points 11

J'ai tout essayé, la vérification UTF8 / BOM sur tous les fichiers, SingleTo-property, CharSet-property. Cela n'a pas fonctionné.

J'ai utilisé la fonction "Afficher les détails" de Gmail et j'ai vu que mes courriers en double étaient envoyés sans objet.

Donc, je me suis retrouvé avec une réparation très, très sale. J'ai mis ceci DIRECTEMENT sous la première ligne de la fonction send dans le fichier de classe :

public function Send() {
  if ($this->Subject == "") {
    return true;
  }
  // ... rest of code...
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X