各个电子邮件的PHPMailer设置正在发送空的To:字段

时间:2011-03-21 15:54:31

标签: php email phpmailer

使用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 个答案:

答案 0 :(得分:3)

您正在使用SMTP发送电子邮件。当使用Smtp发送时,phpmailer类没有使用SingleTo参数。

更多,如果你在SingleTo == true时看到CreateHeader函数,那么这些配方只能用于$ this-&gt; 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();

}

答案 1 :(得分:3)

设置所有其他参数,然后在循环中设置收件人,发送电子邮件,然后使用ClearAllRecipients()函数。像这样:

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

答案 2 :(得分:0)

问题在于SmtpSend函数(从class.phpmailer.php中的第701行开始)。正如您在那里看到的那样,他们不会考虑singleTo设置,只需添加所有收件人并将邮件正文发送一次。

所以你应该在那里添加一些逻辑来测试singleTo是否为真,如果它是修改代码所以它分别发送这些邮件,在To:标题前面加上消息正文。如果singleTo为false,您可以按原样调用代码(第713 - 758行)。

或者,如果您不想修补内容,则可以使用似乎支持singleTo参数的传输方法(即sendmail)。

答案 3 :(得分:0)

$ MAIL-&GT; 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.
}

- BF。

答案 4 :(得分:0)

SingleTo不是个好主意。它仅适用于“sendmail”或“mail”传输,而不适用于SMTP。如果将SingleTo与SMTP一起使用,则只会忽略此参数而不会出现任何错误或警告,并且您可能会获得重复项。

由于您同时使用SingleTo和SMTP,如您的代码所示,您的案例中的SingleTo将被忽略。

SMTP协议的设计方式是,您无法向多个不同的收件人发送一封邮件,每个收件人在“收件人:”字段中只有自己的地址。要使每个收件人在TO:中只有其名称,必须再次传输整个邮件。这解释了为什么SingleTo与SMTP不兼容。

根据PHPMailer库的作者,计划在PHPMailer 6.0的发行版中弃用SingleTo,并在7.0中删除。作者已经解释说,最好控制向更高级别的多个收件人发送,因为PHPMailer不是邮件列表发件人。他们告诉我们不鼓励使用PHP mail()函数,因为它非常难以安全使用; SMTP更快,更安全,并提供更多控制和反馈。由于SMTP与SingleTo不兼容,PHPMailer的作者将删除SingleTo,而不是SMTP。