Настройка PHPMailer для отдельных писем отправляет пустые поля To: - PullRequest
3 голосов
/ 21 марта 2011

Использование PHPMailer для отправки отдельных писем получателям Я ничего не получаю в поле Кому: , когда добавляю $mail->SingleTo = TRUE; в свой код.

Когда я удаляю $mail->SingleTo = TRUE;, я получаю электронные письма с адресом электронной почты в поле Кому: , которое является правильным.

Вот что я получаю:

reply-to     xxxxxx <xxxx@xxxx.com>, No Reply <no-reply@no-reply.com>
to    
date         Mon, Mar 21, 2011 at 5:07 PM  
subject      Testing    
mailed-by    gmail.com 
signed-by    gmail.com

(где xxxxxxx представляет мой адрес электронной почты.)

Вот мой код:

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   = "xxxxxxxxxx@gmail.com";  // GMAIL username
$mail->Password   = "*********";            // GMAIL password

$mail->SetFrom('xxx@xxx.com', 'XXXXXX');

$mail->AddReplyTo("no-reply@xxxxx.com","No Reply");

$mail->Subject    = $subject;

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

$mail->AddAddress("address1@xxxxxx.com", 'xyz abc');
$mail->AddAddress("address2@xxxxxx.com", '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!";
}       
}

Ответы [ 5 ]

3 голосов
/ 17 марта 2015

Установите все остальные параметры, затем в цикле установите получателя, отправьте электронное письмо, затем используйте функцию ClearAllRecipients (). Вот так:

{  // loop start
        $mail->AddAddress($person_email, $person_name);
        $mail->Send();
        $mail->ClearAllRecipients();
}  // loop end
3 голосов
/ 19 апреля 2011

Вы используете SMTP для отправки электронной почты. Класс phpmailer не использует параметр SingleTo при отправке с использованием Smtp.

Более того, если вы видите функцию CreateHeader, когда SingleTo == true, получатели добавляются только к $ this-> SingleToArray, а не к самому заголовку, поэтому в основном это ошибка PHPmailer.

Похоже, что единственный вариант, если вы не хотите патчить phpmailer, это отправлять электронную почту по одному без использования свойства SingleTo

решение будет

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   = "xxxxxxxxxx@gmail.com";  // GMAIL username
    $mail->Password   = "*********";            // GMAIL password
    $mail->SetFrom('xxx@xxx.com', 'XXXXXX');
    $mail->AddReplyTo("no-reply@xxxxx.com","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 голосов
/ 11 мая 2017

SingleTo Не очень хорошая идея. Он работает только с транспортными средствами «sendmail» или «mail», но не с SMTP. Если вы используете SingleTo с SMTP, этот параметр просто игнорируется без каких-либо ошибок или предупреждений, и вы можете получить дубликаты.

Поскольку вы используете оба SingleTo для SMTP, как показано в вашем коде, SingleTo в вашем случае игнорируется.

Протокол SMTP разработан таким образом, что вы не можете отправить одно сообщение нескольким различным получателям, каждый из которых имеет только свой собственный адрес в поле TO :. Чтобы у каждого получателя было только его имя в TO:, все сообщение должно быть передано снова. Это объясняет, почему SingleTo несовместим с SMTP.

По словам авторов библиотеки PHPMailer, SingleTo планируется объявить устаревшим в выпуске PHPMailer 6.0 и удалить в 7.0. Авторы объяснили, что лучше контролировать отправку нескольким получателям на более высоком уровне, поскольку PHPMailer не является отправителем списка рассылки. Они говорят, что использование PHP-функции mail () не должно поощряться, потому что ее крайне сложно безопасно использовать; SMTP быстрее, безопаснее и дает больше контроля и обратной связи. А поскольку SMTP несовместим с SingleTo, авторы PHPMailer удаляют SingleTo, а не SMTP.

0 голосов
/ 28 августа 2013

$ mail-> AddAddress () не любит CSV так что если у вас есть:

$Emails="addr1@host.com,addr2@host.net"; #etc;

сделать цикл for после разделения:

$NewList = preg_split("/,/",$Emails);
foreach ($NewList as $k=>$email){
 if ($k==0) $mail->AddAddress($email);  # Add main to the "To" list.
 else  $mail->AddCC($email); # The REST to CC or BCC which ever you prefer.
}

- БФ.

0 голосов
/ 19 апреля 2011

Проблема в функции SmtpSend (начиная со строки 701 в class.phpmailer.php). Как вы можете видеть, они не учитывают настройку singleTo, а просто добавляют всех получателей и отправляют текст сообщения один раз.

Таким образом, вы должны добавить некоторую логику, чтобы проверить, является ли singleTo истинным, и если он изменяет код, чтобы он отправлял эти письма отдельно, добавляя префикс заголовка To: к телу сообщения. Если singleTo имеет значение false, вы можете вызвать код как есть (строка 713 - 758).

Или же, если вы не хотите вносить исправления, вы можете использовать метод транспорта (например, sendmail), который, похоже, поддерживает параметр singleTo.

...