SMTP 配置在生产中不起作用

Posted

技术标签:

【中文标题】SMTP 配置在生产中不起作用【英文标题】:SMTP configuration not working in production 【发布时间】:2017-01-24 05:56:09 【问题描述】:

我正在尝试在提交表单时发送电子邮件。我正在使用 phpMailer 使用以下配置发送邮件。

$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'mail.example.in'; 
$mail->Port = 25; 
$mail->SMTPAuth = true;
$mail->Username = 'user@example.in'; 
$mail->Password = 'password'; 

$mail->setFrom("user@example.in" , "User");
$mail->addAddress('receiver@example.in', 'Receiver');
$mail->addBCC('anotheruser@somedomain.com', 'Another user');
$mail->AddReplyTo('user@example.in', 'User');

$mail->ishtml(true);

$mail->Subject = $subject;
$mail->Body    = $message;
if($mail->send())
    echo "Your request has been received. We will soon contact you.";
else echo "Unable to send your request. Please try again";

这在 localhost 中运行良好。但是,当我将它部署到我的服务器(example.in)时,我得到了以下异常。

SMTP ERROR: Failed to connect to server: Connection timed out (110)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

--编辑--

我尝试使用 telnet 命令连接到 SMTP 服务器,但无法添加收件人。我收到以下错误?

Last login: Fri Sep 16 11:08:06 on ttys000
admin:~ admin$ telnet mail.example.in 25
Trying 111.91.153.112...
Connected to mail.example.in.
Escape character is '^]'.
220 fbs-ho-mailserver.example.in ESMTP Service (Lotus Domino Release 8.5.3FP3) ready at Fri, 16 Sep 2016 11:36:01 +0530
HELO example.in
250 fbs-ho-mailserver.example.in Hello example.in ([111.91.127.222]), pleased to meet you
MAIL from: marketing@example.in
250 marketing@example.in... Sender OK
RCPT to: john.hh@gmail.com
554 Relay rejected for policy reasons.

-- 编辑--

我能够在 Outlook 中设置此帐户。我真的很困惑发生了什么。

【问题讨论】:

听起来您的生产环境阻止了到邮件服务器的传出连接,或者邮件服务器阻止了传入连接。与运营人员交谈。 我认为 mail.example.in 不是有效的 smtp 服务器。 我添加了 mail.example.in 因为我不想透露实际的 smtp 服务器名称。 @Joni 没有运维人员。只有我。你能告诉我我需要做什么的步骤吗? 谁负责确保两台服务器也能正常运行? 【参考方案1】:

超时错误是丢包的典型表现,因此可能是 Web 服务器和 SMTP 服务器之间的防火墙问题。 如果您可以通过 ssh 访问您的服务器,您可以尝试使用以下方式连接到 smtp:

telnet <smtp server> 25

即使使用 telnet 也出现超时错误,您很确定问题出在网络/防火墙方面。

【讨论】:

很奇怪。您所做的 telnet 测试是从运行 PHPMailer 的 Web 服务器执行的? 不,不是。它在我的本地机器上运行。【参考方案2】:

您需要更改 php.ini 中的一些设置:

upload_max_filesize = 2M 
;or whatever size you want

max_execution_time = 60
; also, higher if you must - sets the maximum time in seconds.

您的 PHP.ini 是否取决于您的环境,更多信息: reference

把它放在你的 PHP 脚本的顶部,让你的脚本松散

ini_set('max_execution_time', 600); //600 seconds = 10 minutes or set your time

【讨论】:

您的建议在不同的情况下会很好,但它与实际问题无关,因此没有用。 OP 的错误是 connection 超时,而不是 script 超时错误。此外,上传文件大小与从服务器发送电子邮件无关 - 它是发送到服务器的文件的大小。【参考方案3】:

第一个引用(来自 ibm 社区):

john.hh@gmail.com 是列于 gmail.com 的“拒绝发送给以下互联网的消息 地址”字段(在目标服务器的 Domino 配置中 文档的路由器/SMTP、限制和控制、SMTP 入站 Controls 选项卡的“Inbound Intended Recipient's Controls”部分)。

从成员中删除 Mary 的分层名称 (Mary Jones/ABC) Reject (group) 文档中的列表允许 Mary 接收消息 来自互联网。

第二句:

大多数邮件服务器,以防止它们被用作匿名垃圾邮件 中继,仅配置为中继来自某些主机的邮件。

【讨论】:

【参考方案4】:

使用您自己的 SMTP 是个坏主意。 根据您的处理方式,您很有可能会以某种方式阻止您的电子邮件或将其标记为垃圾邮件。而且您将不得不花费一些时间来使您的服务器保持最新状态。

使用为每个提供商列入白名单并公开 API 以发送您的交易邮件的在线服务: https://www.mailjet.com/ http://mailchimp.com/ ...

他们经常为少量(每天 2000 封电子邮件以下)提供免费帐户。 使用 API 非常简单,可以在几分钟内完成(例如:https://dev.mailjet.com/)

【讨论】:

【参考方案5】:

您遇到的问题——而不是两个不相关的问题——非常简单:

SMTP 错误:无法连接到服务器:连接超时 (110) SMTP connect() 失败。

并且您已验证服务器确实在接受连接:

我尝试使用 telnet 命令连接到 SMTP 服务器

Last login: Fri Sep 16 11:08:06 on ttys000
admin:~ admin$ telnet mail.example.in 25
Trying 111.91.153.112...
Connected to mail.example.in.

您的脚本在从其生产服务器运行时无法连接到 SMTP 服务器

可能的原因是生产服务器有防火墙,为了避免滥用,阻止与外部的任何连接。服务器可以服务 Web 请求,但不能提供更多。

如果您的测试验证了 端口 25 没有响应,那么(在检查主机地址正确之后)您可以尝试 telnet mail.example.in 587 > 取而代之。如果可行,则可能意味着服务器不接受不安全的连接(端口 25),但正在接受安全连接。使用 PHPMailer 你可以尝试activating secure connection:

$mail->SMTPSecure = 'tls';

$mail->SMTPSecure = 'ssl';

如果这不起作用,您可能仍然遇到防火墙问题;或者您可能需要查看 phpinfo() 并验证您是否在 PHP 中提供了 OpenSSL 支持。

你需要做什么

请维护生产服务器的 IT 人员打开防火墙; 更有希望的是,询问他们如何从该服务器发送电子邮件。您可能需要使用mail() 函数,或使用localhost127.0.0.1 作为SMTP 服务器。然后电子邮件将通过您的生产服务器的服务网络发送出去。

他们可能会告诉您不允许使用端口 25,但允许使用端口(例如)465 或 567。您必须相应地更新配置和/或添加 TLS/SSL(见上文)。

或者您可能被允许连接到您必须提供 IP 地址的第三方 SMTP 服务器,以允许 IT 人员打开合适的防火墙窗口。然后电子邮件将通过第三方服务器发送出去。

第二个问题(可能不是问题)

250 marketing@example.in... 发件人确定 RCPT 至:john.hh@gmail.com 554 中继因政策原因被拒绝

为了避免滥用,SMTP 服务器不会让每个人都连接和发送电子邮件,而只允许他们自己的客户。我看到您在 PHPMailer 配置中指定了用户和密码。在 telnet 会话中你没有。所以很可能PHPmailer可以发送,但不能连接,而你的telnet可以连接,但不能发送。

一旦您解决了连接问题,您的身份验证问题就会得到解决或消失(因为您将使用 IT 人员提供给您的不同服务器,例如 localhost)。

第三个问题(可能永远不会出现)

第三种滥用服务的方式是过度使用 - 向太多人发送太多电子邮件。与 IT 人员核实发送电子邮件的可接受策略。

问题,问题

要调查的其他事项是来源的可信度(您可能希望代表某个域发送电子邮件,该域没有将您选择的 SMTP 服务器指定为允许的发件人),以及 机密性 数据(即使使用 TLS/SSL 连接,如果您被指定为localhost 作为 SMTP 服务器,您的 IT 人员将可以完全、不受限制、无法检测到您发送的任何电子邮件。您可能,或者可能不会,可以接受)。

【讨论】:

【参考方案6】:

询问您的托管服务提供商是否在该服务器上启用了 smtp。我之前对 smtp 和 curl 都遇到过同样的问题。请联系托管服务提供商。

【讨论】:

启用 smtp。我可以使用 php 的邮件功能发送电子邮件。但是,我的要求是使用问题中解释的配置。 尝试在其他东西之前添加这一行 $mail->IsSMTP() 或者可能是一些端口问题。 我已经添加了这一行。我也更新了问题。【参考方案7】:

phpmailer 版本是多少?

您可能忘记添加此行

  $mail->IsSMTP(); //  use SMTP

在您启动 $mail 之后。

试一试。

【讨论】:

我正在使用 PHPMailer 版本 5.2.14。另外,我已经更新了问题。【参考方案8】:

我明白你的意思。同样的问题发生在我身上,我只添加了一行,它对我有用。请使用,

$mail->SMTPSecure = 'ssl';

并根据 ssl 配置您的设置。还要在您的服务端正确检查邮件配置。

【讨论】:

【参考方案9】:

因此,您有一个 GoDaddy 服务器,并且您想通过新获得的 SMTP 中继发送电子邮件。好吧,如果您在 Google 上闲逛一下,您可能会发现“你不能”

如果您再仔细研究一下,您可能会发现 GoDaddy 的官方解决方案是使用他们的内部邮件中继。这并不理想,因为他们设置了任意障碍,例如这个:

我们的专用服务器每天的出站电子邮件限制为 1000 封。如果 您每天需要发送超过 1000 封电子邮件,请致电客户 支持或打开支持票以请​​求更高的限制。

快速有效的解决方案:获取支持使用 HTTP API 发送电子邮件的 SMTP 中继。

我的建议:(一个简单有效的解决方案,我个人正在使用)

在Sendgrid 中注册一个帐户。 Sendgrid 每月提供 12k 封免费电子邮件,我认为这应该足以满足任何基本需求。

第一步: Sendgrid 会要求您添加一些 DNS 记录来验证您是否代表该主机发送电子邮件。就这样吧。

第二步:配置白标https://sendgrid.com/docs/User_Guide/Settings/Whitelabel/index.html(这并不重要,但它会让您发送的电子邮件看起来更专业)

第三步:生成 API 密钥

您可以通过 SendGrid 客户门户manage your API Keys。另外,您可以manage your API keys via the API itself。

第四步:继续编写我们的代码。

使用 github 上的 library 在 sendgrid 上使用 PHP 发送邮件很容易:

// using SendGrid's PHP Library
// https://github.com/sendgrid/sendgrid-php
require 'vendor/autoload.php';
$sendgrid = new SendGrid("SENDGRID_APIKEY");
$email    = new SendGrid\Email();

$email->addTo("test@sendgrid.com")
      ->setFrom("you@youremail.com")
      ->setSubject("Sending with SendGrid is Fun")
      ->setHtml("and easy to do anywhere, even with PHP");

$sendgrid->send($email);

这是如何工作的

GoDaddy 会阻止端口 25、2525、587 和 485,这些端口是 SMTP 的理想端口。所以我们使用端口 80/443 并请求 sengrid 的 API 使用端口 80 代表我们发送电子邮件,是的,我们欺骗了 GoDaddy。

【讨论】:

这可能是许多人似乎在寻找的魔法,所以我赞成这个答案。然而,当心相信你已经“欺骗”了你的 ISP。流量监控简单,如果 ISP 决定阻止定向到 SendGrid 服务器的传出流量,他们可以立即完成。如果可能,请始终尝试您的 ISP 合作 - 或更换 ISP;尽量避免愚弄您的连接供应商。 @lserni 是的!但是在许多方面,我们可以在 80 上覆盖到 sendgrid 的块,以防万一,比如使用反弹或 ***。无论如何,这是我个人使用的当前工作解决方案。 GoDaddy 永远不会取消这些限制,我尝试了很长时间。 @lserni OP 正在使用 GoDaddy。找这个评论I'm able to send mail using gmail and godaddy smtp configurations. Only this particular configuration which is using port 25 is not working.回复作者的问题。 是的,评论已经“折叠”了,所以我再也没有看到它了:-)。我是说,在 OP 的情况下,也许只使用 mail() 将是最快的解决方案。 PHPMailer 对于看似简单的联系表格来说有点过分了。 是的,这确实是正确的。但是这个解决方案,很多人都在寻找它。【参考方案10】:

你的错误说:

SMTP ERROR: Failed to connect to server: Connection timed out (110)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

那么让我们看看https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting:

“SMTP 错误:无法连接到 SMTP 主机。”

这也可能显示为 SMTP connect() failed 或 Called Mail() without 在调试输出中连接。这通常被报告为 PHPMailer 问题,但几乎总是归结为本地 DNS 故障、防火墙 阻止(例如像 GoDaddy 那样)或您本地的其他问题 网络。这意味着 PHPMailer 无法联系 SMTP 服务器 您已在 Host 属性中指定,但没有确切说明原因。 它也可能是由于未加载 openssl 扩展而导致的(请参阅 加密说明如下)。

讨论了一些诊断此错误来源的技术 以下。

GoDaddy

美国流行的托管服务提供商 GoDaddy 规定非常严格(直截了当 变得几乎无用)限制发送电子邮件。他们阻止 出站 SMTP 到端口 25、465 和 587 到所有服务器,除了它们的 自己的。这个问题是许多令人沮丧的问题的主题 堆栈溢出。如果您发现您的脚本可以在本地机器上运行, 但不是当您将其上传到 GoDaddy 时,这将是正在发生的事情 给你。 GoDaddy 对解决方案的记录极差:您 必须通过他们的服务器发送,并且还禁用所有安全性 功能、用户名和密码(很棒,嗯?!),给你这个配置 对于 PHPMailer:

$mail->isSMTP();
$mail->Host = 'relay-hosting.secureserver.net';
$mail->Port = 25;
$mail->SMTPAuth = false;
$mail->SMTPSecure = false;

GoDaddy 也拒绝使用属于任何 aol 的发件人地址发送, gmail、yahoo、hotmail、live、aim 或 msn 域(请参阅他们的文档)。这 是因为所有这些域都部署了 SPF 和 DKIM 防伪 措施,伪造您的发件人地址是伪造的。

您可能会发现切换到更开明的主机会更容易 供应商。

【讨论】:

【参考方案11】:

我认为只需几个步骤,我们就可以让它正常工作。

    在您的 Godaddy/Hostgator Cpanel > 选择 MX 记录 > 选择有问题的域 > 选择“远程邮件交换器

    此时您可以测试邮件投递,问题可能会得到解决。

    我确信它的设置是正确的,但是当谈到好的 ole Cpanel、PhpMailer 和 Godaddy/Hostgator 时请相信我。这是一个常识毫无意义的地方。

替换:

$mail->Host = 'mail.example.in';

与:

$mail->Host = 'localhost';

我相信这应该可以解决任何问题,前提是登录凭据等有效。

【讨论】:

【参考方案12】:

我遇到了类似的超时问题,原因是我的托管服务提供商 (Linode)。 TLDR; SMTP 限制在 2019 年 11 月 5 日之后创建的帐户上默认设置为 Linode。您需要为您的实例配置 rDNS 并打开支持票证以确认 CAN-SPAM 合规性,支持应该很快解除限制。我想很多人会因为 smtp 限制而面临这个问题

【讨论】:

以上是关于SMTP 配置在生产中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Tailwind 自定义背景图像在生产中不起作用

谷歌推送通知在生产中不起作用

Django中的线程在生产中不起作用

iOS推送通知在生产中不起作用

Flutter Firebase Google Auth 在生产中不起作用

iOS App购买在生产中不起作用