【问题标题】:phpmailer / IsSMTP causes 500 error but sends the mail 1 minute laterphpmailer / IsSMTP 导致 500 错误但在 1 分钟后发送邮件
【发布时间】:2015-01-13 16:03:10
【问题描述】:

每当 $mail->isSMTP();在 phpmailer 中设置它“挂起”大约 1 分钟,然后重定向到: 500 服务不可用页面,XID:2060448470。

但一分钟后,我收到了发送的邮件。在邮件中我可以阅读: Received-SPF: pass (google.com: domain of admin@skivbasar.se 将 2a00:16d8:0:4::200 指定为允许的发件人)

当我删除“$mail->isSMTP();”电子邮件立即发送但他们没有得到 SPI = 通过: spf=none(google.com: 117658@atapa01.citynetwork.se 未指定允许的发件人主机)。

我真的需要 SMTP 才能工作,因为我过去有很多丢失的邮件。我花了几天时间寻找一个解决方案,包括 20 多篇关于 stackoverflow 的文章。

我已经多次从 worxware 和 github 重新尝试了示例代码。它总是“$mail->isSMTP();”拒绝正常工作。

这是我的邮件代码:

require("PHPMailerAutoload.php");
require("class.phpmailer.php");
require("class.smtp.php");

$mail = new PHPMailer();
$mail->Host = "mail.skivbasar.se";
$mail->Port = 587;
$mail->SMTPAuth = true;    
$mail->SMTPSecure = "ssl";
$mail->IsSMTP();   
$mail->Username = "-----.se";  // SMTP username
$mail->Password = "-------"; // SMTP password
$mail->AddReplyTo($replyto);
$mail->From     = "admin@skivbasar.se";
$mail->FromName = "skivbasar.se";
$mail->AddAddress($row['email']);
$mail->Subject  = $row['subject'];
$mail->Body     = $row['message'];
$mail->WordWrap = 150;

if(!$mail->Send()) {
    $error = true;
} else {

    $error = false;
}

您可以访问测试页以查看错误的实际操作:http://skivbasar.se/action/mail/t3.php

更新:

非常感谢您回复同步!你似乎是个真正的 phpmailer 专家!

我已经无数次尝试了 tls 和 ssl,甚至评论了这一行并使用了端口 587 和 465。只要“isSMTP”是,两者实际上都可以发送邮件。

我要解决的真正问题是为什么脚本在设置“isSMTP”时会挂起 1 分钟,但在重定向到 500 页面后仍会发送邮件。

没有 isSMTP 的 softfail 是通过以下方式发送的: 来自 smtp02.mailout.citynetwork.se (mailout.citynetwork.se. [91.123.193.90])

通过(但被绞死)的由以下人员发送: 来自 smtp03.citynetwork.se (mail.citynetwork.se. [91.123.193.200])。

感觉就像脚本正在等待来自邮件服务器的回复 60 秒(如 HELO)并且当服务器没有响应时。无论如何,它会在 60 分钟后发送邮件。我在某处读到过这个。我还在代码中找到了一些引用“HELO”的条目,例如第 1340 行的 class.phpmailer.php “// 我们必须在 tls 协商后重新发送 HELO”。

由于它重定向到 500 页,我无法打印任何错误消息。我也无权访问我的日志。但它适用于本地主机上的“isSMTP”,只有当脚本在线运行时才会这样挂起。

【问题讨论】:

  • 如果您不调用isSMTP,PHPMailer 不会通过SMTP 发送,而是调用mail() 来提交到您的本地服务器。 SMTP 并不是一种交互式协议,它通常会导致延迟。 500 响应可能不是重定向,所以我建议您在服务器上启用错误输出:ini_set('display_errors', true)。我猜你的 DNS 或防火墙有问题,其中任何一个都可以解释 60 秒的延迟 - SMTP 中的大多数超时都比这长得多。请参阅the troubleshooting docs 了解更多信息。
  • PS 我对 PHPMailer 了解很多,因为我是维护者。

标签: smtp phpmailer


【解决方案1】:

这里的一些错误可能会导致问题。

你实际上有重复的需求 - 你只需要加载 PHPMailerAutoload.php - 摆脱其他两个。

您正在使用 'ssl' 但在端口 587 上。这可能行不通 - 对于端口 587,设置 $mail->SMTPSecure = 'tls';

您的邮件服务正在使用 TLS - 看看当您尝试连接它们时会发生什么:

telnet mail.skivbasar.se 587
Trying 91.123.193.200...
Connected to mail.skivbasar.se.
Escape character is '^]'.
220 smtp05.citynetwork.se ESMTP Postfix
EHLO localhost
250-smtp05.citynetwork.se
250-PIPELINING
250-SIZE 31457280
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

注意该扩展列表中的STARTTLS

如果您要使用 PHPMailer,最好从捆绑的示例之一开始,尤其是 gmail 示例,因为它可以帮助您避免此类愚蠢的错误。

【讨论】:

  • 我只切换到“PHPMailerAutoload”,但问题仍然存在。我使用citynetwork,他们告诉我使用sll和587端口。
  • 我稍微改变了我的答案,以表明您的服务正在使用 TLS。 SSL 和 TLS 之间的区别非常小——例如,大多数邮件程序中只有一个复选框可以表示两者之一,这可能就是他们所指的。真的,尝试将其设置为“tls”。如果您收到 500 错误,那么您的服务器日志中将会有一些关于它的内容。您还可以使用$mail->SMTPDebug = 3; 启用调试输出。
  • 我已根据您的回答更新了我的问题。请指教。
【解决方案2】:

我遇到了同样的问题,在我的 $mail->send() 上收到了 500 个响应,但是在按照 Synchros 的建议查找 phpMailers gmail 示例后,我使用了

$mail->Host = gethostbyname('mail.citynetwork.se');

而不是

$mail->Host = 'mail.citynetwork.se';

这解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2021-06-19
    • 2015-09-14
    相关资源
    最近更新 更多