PHPMailer - 某些SMTP邮件不发送

时间:2014-06-16 19:26:52

标签: php email smtp phpmailer

我有一个向用户发送电子邮件的脚本,有时根据大小将其分成多个邮件。这是代码:

for($i=0; $i<count($the_message); $i++){
    $mail = new PHPMailer(true);
    $mail->IsSMTP();
    $mail->SMTPDebug = 1;
    $mail->Host = "my.smtp.server";
    $mail->Port = $email_port;
    $mail->Username = "my@email.com";
    $mail->Password   = "mypassword";
    $mail->SMTPAuth   = true;
    $mail->From = $from;
    $mail->FromName = "My Name";
    $mail->IsHTML($is_html);
    if($is_html === TRUE){
       $mail->AltBody = "To view the message, please use an HTML compatible email client, or change your export to a plain text format.";
    }
    foreach($to as $address){
       $mail->AddAddress($address);
    }
    $mail->Body = $the_message[$i];
    $mail->Subject = $the_sub;
    $mail->Send();
}

这曾经很棒。现在,似乎某些消息永远不会发送。这似乎是一个数据问题(或者可能是PHPMailer向服务器发送行的方式?),但我无法确定为什么服务器总是拒绝某些消息段。

我从PHPMailer获得的错误消息是:

  

SMTP错误:数据未被接受。

来自PHP本身:

  

注意:fputs():发送31个字节失败,错误为errno = 104 Connection   在第580行的class.smtp.php中由peer重置

以下是始终无法发送的HTML数据段:

http://pastebin.com/LGYkTTFA

请注意,大小不是问题,我可以成功发送比此更大的HTML消息。但是,当我发送多个段时,服务器永远不会接受此段。

2 个答案:

答案 0 :(得分:2)

在这里,我以一种更加理智的方式为你重写了它。你不需要每次在循环中从头开始创建所有东西,只需改变身体并再次发送。

<?php
require 'PHPMailerAutoload.php';
$the_message = array('Hello', 'there', 'Justin');
$to = array('tom@example.com', 'dick@example.net', 'harry@example.org');
$the_sub = 'Crazy subject';
$email_port = 25;
$from = 'justin@example.com';
$is_html = true;

$mail = new PHPMailer(true);
$mail->IsSMTP();
$mail->SMTPDebug = 1;
$mail->Host = "localhost";
$mail->Port = $email_port;
$mail->Username = "my@email.com";
$mail->Password   = "mypassword";
$mail->SMTPAuth   = true;
$mail->From = $from;
$mail->FromName = "My Name";
$mail->Subject = $the_sub;
$mail->IsHTML($is_html);
$mail->WordWrap = 200;

if($is_html){
    $mail->AltBody = "To view the message, please use an HTML compatible email client, '.
     'or change your export to a plain text format.";
}
foreach($to as $address){
    $mail->AddAddress($address);
}
for($i=0; $i<count($the_message); $i++){
    $mail->Body = $the_message[$i];
    $mail->setWordWrap();
    $mail->Send();
}

更新:添加自动换行功能以处理包含很长行的内容。

答案 1 :(得分:0)

class.smtp.php 第51行,我将常量MAX_LINE_LENGTH 998 更改为 500 。这允许我的所有电子邮件片段都通过。

我仍然不确定问题出在我的SMTP服务器或PHPMailer上,我必须在其他地方进行测试。

编辑:使用Gmail的SMTP服务器进行测试,并保持 998 正常运行。这使我假设我的SMTP中继服务器有时会根据长度拒绝数据。

EDIT2:上述修复程序仍然出现故障。我更改了我的端口号并添加了SSL,它神奇地工作了。 Wonky服务器问题...