2011-03-21 1 views
3

Utilisation de PHPMailer pour envoyer des e-mails individuels à des destinataires Je ne reçois rien dans le champ To: lorsque j'ajoute $mail->SingleTo = TRUE; à mon code.Le paramètre PHPMailer pour les e-mails individuels envoie des champs To: empty vides

Lorsque je supprime $mail->SingleTo = TRUE; Je reçois des e-mails avec une adresse e-mail dans le champ To: qui est correct.

C'est ce que je reçois:

reply-to  xxxxxx <[email protected]>, No Reply <[email protected]> 
to  
date   Mon, Mar 21, 2011 at 5:07 PM 
subject  Testing  
mailed-by gmail.com 
signed-by gmail.com 

(où XXXXXXX représente mon adresse e-mail.)

Voici mon code:

if(isset($_POST['submit'])) 
{ 
    require_once('PHPMailer_v5.1/class.phpmailer.php'); 


$mail   = new PHPMailer(); 

$subject = $_POST['subject']; 
$body = $_POST['emailbody']; 
$to   = $_POST['to']; 



$mail->IsSMTP(); // telling the class to use SMTP 
//$mail->Host  = "localhost"; // SMTP server 
$mail->SMTPDebug = 2;      // enables SMTP debug information (for testing) 
              // 1 = errors and messages 
              // 2 = messages only 
$mail->SMTPAuth = true;     // enable SMTP authentication 
$mail->SMTPSecure = "SSL";     // sets the prefix to the servier 
$mail->Host  = "smtp.gmail.com";  // sets GMAIL as the SMTP server 
$mail->Port  = 587;     // set the SMTP port for the GMAIL server 
$mail->Username = "[email protected]"; // GMAIL username 
$mail->Password = "*********";   // GMAIL password 

$mail->SetFrom('[email protected]', 'XXXXXX'); 

$mail->AddReplyTo("[email protected]","No Reply"); 

$mail->Subject = $subject; 

// After adding this line I'm getting an empty To: field 
$mail->SingleTo = TRUE; 

$mail->AddAddress("[email protected]", 'xyz abc'); 
$mail->AddAddress("[email protected]", 'abc xyz'); 
//$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test 

$mail->MsgHTML($body); 


if(!$mail->Send()) { 
    $message= "Mailer Error: " . $mail->ErrorInfo; 
} 
else 
{ 
    $message= "Message sent!"; 
}  
} 
+0

La question est acceptée, mais la prime est ouverte? Pouvons-nous obtenir un pourquoi afin que nous puissions répondre pour la générosité? –

Répondre

3

Vous utilisez SMTP pour envoyer un courrier électronique. La classe phpmailer n'utilise pas le paramètre SingleTo lors de l'envoi via Smtp. De plus, si vous voyez la fonction CreateHeader lorsque le SingleTo == true, les recipents ne sont ajoutés qu'à $ this-> SingleToArray et non à l'en-tête lui-même donc en gros il bug PHPmailer.

On dirait que le seul choix, sauf si vous voulez patcher phpmailer, est d'envoyer un e-mail par un sans utiliser la propriété SingleTo

la solution sera

function & prepare_mailer($subject, $body) { 

    $mail   = new PHPMailer(); 
    $mail->IsSMTP(); // telling the class to use SMTP 
    //$mail->Host  = "localhost"; // SMTP server 
    $mail->SMTPDebug = 2;      // enables SMTP debug information (for testing) 
               // 1 = errors and messages 
               // 2 = messages only 
    $mail->SMTPAuth = true;     // enable SMTP authentication 
    $mail->SMTPSecure = "SSL";     // sets the prefix to the servier 
    $mail->Host  = "smtp.gmail.com";  // sets GMAIL as the SMTP server 
    $mail->Port  = 587;     // set the SMTP port for the GMAIL server 
    $mail->Username = "[email protected]"; // GMAIL username 
    $mail->Password = "*********";   // GMAIL password 
    $mail->SetFrom('[email protected]', 'XXXXXX'); 
    $mail->AddReplyTo("[email protected]","No Reply"); 
    $mail->Subject = $subject; 
    $mail->MsgHTML($body); 
    return $mail; 
} 

foreach($_POST['to'] as $to){ 
    $mail = null; 
    $mail = & prepare_mailer($_POST['subject'],$_POST['body']); 
    $mail->AddAddress($to['address'], $to['name']); 
    $mail->Send(); 

} 
+0

hmm merci .. si le problème est cause de smtp alors si j'utilise la fonction mail de cette classe, je peux envoyer des emails comme je veux? – mysterious

+0

Si vous n'utilisez pas le smtp que oui, vous devrez utiliser IsMail() et avoir le mail (de PHP) configuré sur le serveur. Exemple: [mail] (http://phpmailer.worxware.com/index.php?pg=examplebmail) ou [sendmail] (http://phpmailer.worxware.com/index.php?pg=examplebsendmail) –

+1

merci essayez quand je vais travailler à nouveau sur ce projet. – mysterious

0

Le problème est dans la fonction SmtpSend (à partir à la ligne 701 dans class.phpmailer.php). Comme vous pouvez le voir, ils ne prennent pas en compte le paramètre singleTo, et ajoutent simplement tous les destinataires et envoient le corps du message une fois.

Vous devriez donc ajouter une logique pour tester si singleTo est vrai, et si vous modifiez le code, il envoie ces mails séparément, en préfixant l'en-tête To: au corps du message. Si singleTo est faux, vous pouvez appeler le code tel quel (lignes 713 - 758). Alternativement, si vous ne voulez pas patcher les choses, vous pouvez utiliser une méthode de transport (sendmail) qui semble prendre en charge le paramètre singleTo.

+0

puis-je envoyer comme je veux en utilisant l'option de fonction mail de php mailer au lieu de smtp? – mysterious

3

Définissez tous les autres paramètres, puis dans une boucle définissez le destinataire, envoyez l'e-mail, puis utilisez la fonction ClearAllRecipients(). Comme si:

{ // loop start 
     $mail->AddAddress($person_email, $person_name); 
     $mail->Send(); 
     $mail->ClearAllRecipients(); 
} // loop end 
0

SingleTo Ce n'est pas une bonne idée. Cela ne fonctionne qu'avec les transports "sendmail" ou "mail", pas avec SMTP. Si vous utilisez SingleTo avec SMTP, ce paramètre est simplement ignoré sans erreur ni avertissement, et vous risquez d'obtenir des doublons.

Comme vous utilisez à la fois SingleTo et SMTP, comme indiqué dans votre code, le SingleTo dans votre cas est ignoré.

Le protocole SMTP est conçu de manière à ce que vous ne puissiez pas envoyer un message à plusieurs destinataires différents, chacun ayant sa propre adresse dans le champ TO :. Pour que chaque destinataire ait seulement son nom dans le TO :, le message entier doit être retransmis. Cela explique pourquoi SingleTo est incompatible avec SMTP. Selon les auteurs de la bibliothèque PHPMailer, il est prévu que SingleTo soit obsolète dans la version de PHPMailer 6.0 et supprimé dans la version 7.0. Les auteurs ont expliqué qu'il est préférable de contrôler l'envoi à plusieurs destinataires à un niveau supérieur, car PHPMailer n'est pas un expéditeur de liste de diffusion. Ils disent que l'utilisation de la fonction PHP mail() doit être découragée car il est extrêmement difficile à utiliser en toute sécurité; Le protocole SMTP est plus rapide, plus sûr et offre plus de contrôle et de rétroaction. Et puisque SMTP est incompatible avec SingleTo, les auteurs de PHPMailer supprimeront SingleTo, pas SMTP.

Questions connexes