Настройка PHPMailer для отдельных электронных писем отправляет пустые поля To:

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

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

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

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

(где 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   = "[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!";
}       
}

person mysterious    schedule 21.03.2011    source источник
comment
Вопрос принят, но баунти открыта? Можем ли мы узнать почему, чтобы мы могли ответить за награду?   -  person Kevin Peno    schedule 25.04.2011


Ответы (5)


Вы используете 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   = "[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();

}
person Szymon Lukaszczyk    schedule 19.04.2011
comment
хм, спасибо .. если проблема связана с smtp, то, если я использую почтовую функцию этого класса, я могу отправлять электронные письма, как захочу? - person mysterious; 21.04.2011
comment
если вы не используете smtp, чем да, вам придется использовать IsMail() и настроить почту (из PHP) на сервере. Пример: почта или отправить почту - person Szymon Lukaszczyk; 21.04.2011
comment
Я не думаю, что этот фрагмент кода будет отправлять один адрес на поле «Кому:», если только вы не выполните $mail->ClearAddresses(); после каждого $mail-Send(); внутри этого цикла, потому что AddAddress добавляется к массиву получателей. - person rkulla; 11.05.2011
comment
@SzymonLukaszczyk - спасибо за ответ. См. также мой ответ о планах на будущее в отношении SingleTo. - person Maxim Masiutin; 11.05.2017

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

{  // loop start
        $mail->AddAddress($person_email, $person_name);
        $mail->Send();
        $mail->ClearAllRecipients();
}  // loop end
person user3335513    schedule 17.03.2015

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

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

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

person wimvds    schedule 19.04.2011
comment
Могу ли я отправить, как я хочу, используя опцию почтовой функции php mailer вместо smtp? - person mysterious; 21.04.2011

$mail->AddAddress() не любит CSV, поэтому, если у вас есть:

$Emails="[email protected],[email protected]"; #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.
}

-- BF.

person Bill Frederickson    schedule 27.08.2013

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

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

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

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

person Maxim Masiutin    schedule 11.05.2017