PHPMailer - 每次运行代码时都会收到2封邮件

时间:2016-10-24 09:12:29

标签: php email phpmailer

我正在使用PHPMailer 5.2 但是每次我尝试发送邮件时,它都会发送两次。所以接收者两次收到一封邮件。我没有在主班上做任何改变。请帮助我。

class Mail{

    static function send($data){
        $mail = new PHPMailer;

        $mail->isSMTP();                                      // Set mailer to use SMTP
        $mail->Host = MAIL_HOST;  // Specify main and backup SMTP servers
        $mail->SMTPAuth = true;                               // Enable SMTP authentication
        $mail->Username = MAIL_USERNAME;                 // SMTP username
        $mail->Password = MAIL_PASSWORD;                           // SMTP password
        $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
        $mail->Port = MAIL_PORT;                                    // TCP port to connect to
        $mail->SingleTo = true;
        $mail->setFrom(MAIL_FROM_ID, MAIL_FROM_NAME);
        $mail->addAddress($data['email'], $data['name']);     // Add a recipient
        $mail->isHTML(true);                                  // Set email format to HTML

        $mail->Subject = $data['subject'];
        $mail->Body    = $data['body'];

        if(!$mail->send()) {
           return false;
        } else {
            return true;
        }
    }
} 

我使用此代码发送mail =>

class Index extends Controller{

    public function index(){

        $data['email'] = 'kunalkhanx@gmail.com';
        $data['name'] = 'Kunal Khan';
        $data['subject'] = 'Hello Mr. Kunal Khan';
        $data['body'] = '<h1>Welcome in frsh Bazar</h1>';
        Mail::send($data);
    }
}

1 个答案:

答案 0 :(得分:0)

您可能会收到重复项,因为SingleTo与SMTP传输不兼容。 SingleTo仅适用于“sendmail”或“mail”传输,而不适用于SMTP。如果将SingleTo与SMTP一起使用,则只会忽略此参数而不会出现任何错误或警告,并且您可能会获得重复项。但这非常不可取,因为$ data ['email']参数中只有一个收件人地址。试着评论一下SingleTo系列,看看它是否会有所不同。

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

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

另一个,最可能的原因可能是你的代码被调用了两次,而PHPMailer正确地完成了所有操作。要检查这一点,请在函数中添加简单的日志记录,这样每次调用函数时都会写入日志字符串。因此,您可以计算您的函数被调用的次数:两次或一次。

如果您可以访问服务器上的php错误日志,只需将error_log()添加到send()函数的开头,例如

error_log($data['email']);

因此,您将从日志中看到该函数实际被调用了多少次。只是不要忘记从代码中删除error_log行。如果您无权访问错误日志文件,请使用file_put_contents:

file_put_contents($filepath, date("r", time())." ". $data['email'].PHP_EOL, FILE_APPEND);

在调用它之前,将$ filepath设置为您有权访问的文件的路径名。