为什么phpmailer-> send()返回true但我没有收到电子邮件?

时间:2018-07-11 20:04:06

标签: php phpmailer

这是我的功能:

function send_mail($email_from, $password, $email_to, $subject, $body, $name_from = "Lamtakam"){
    $phpMailer = new PHPMailer(true);
    // $phpMailer->SMTPDebug = true;
    $phpMailer->isSMTP();
    $phpMailer->Host = "smtp.zoho.com";
    $phpMailer->SMTPAuth = true;
    $phpMailer->Username = $email_from;
    $phpMailer->Password = $password;
    $phpMailer->SMTPSecure = "tls";
    $phpMailer->Port = 587;
    $phpMailer->isHTML(true);
    $phpMailer->CharSet = "UTF-8";
    $phpMailer->setFrom($email_from, $name_from);
    $phpMailer->addAddress($email_to);
    $phpMailer->Subject = $subject;
    $phpMailer->Body = $body;
    return $phpMailer->send();
}

当我在本地使用它(xampp)时,效果很好。但是最近我已经在服务器(linux ubuntu)上上传了我的网站,可惜没有发送电子邮件。实际上$phpMailer->send()返回的是true,但是收件箱和垃圾邮件中都没有收到电子邮件。为什么以及如何解决?


好的,大约30分钟后,我在收件箱中收到了电子邮件。现在我的问题是这么长时间的延误是什么原因?

2 个答案:

答案 0 :(得分:2)

我相信this post非常相关。简而言之,不是PHP,而是SMTP,这是PHP脚本将邮件传递给传递的原因,这导致了延迟。 SMTP有一些怪异的行为会导致这种情况,最常见的是greylisting。灰名单尝试通过多次处理请求,以减少垃圾邮件并防止未经验证的电子邮件。

如果您想更快地发送邮件,我建议使用具有自己的SMTP服务器的API,例如Sendgrid。 API往往更加可靠,快速并且易于使用。通常,PHP mail()函数运行缓慢,无法解决。

答案 1 :(得分:0)

尝试以下代码,尝试捕获任何phpmailer异常。

function send_mail($email_from, $password, $email_to, $subject, $body, $name_from = "Lamtakam"){

    $phpMailer = new PHPMailer(true);

    try {

        $phpMailer->SMTPDebug = 2;
        $phpMailer->isSMTP();
        $phpMailer->Host = "smtp.zoho.com";
        $phpMailer->SMTPAuth = true;
        $phpMailer->Username = $email_from;
        $phpMailer->Password = $password;
        $phpMailer->SMTPSecure = "tls";
        $phpMailer->Port = 587;
        $phpMailer->isHTML(true);
        $phpMailer->CharSet = "UTF-8";
        $phpMailer->setFrom($email_from, $name_from);
        $phpMailer->addAddress($email_to);
        $phpMailer->Subject = $subject;
        $phpMailer->Body = $body;
        $phpMailer->send();

    } catch (phpmailerException $e) {

        die($e->errorMessage());

    }

}

如果它不起作用,请与主机检查端口587是否打开