我在提交表单时尝试发送电子邮件。我使用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中设置此帐户。我真的很困惑发生了什么。
答案 0 :(得分:3)
您的错误说:
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()失败或Called Mail()没有 在调试输出中连接。这通常被报告为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 domain(请参阅他们的文档)。这个 是因为所有这些域都部署了SPF和DKIM防伪 措施,伪造你的地址是伪造的。
您可能会发现切换到更加开明的托管更容易 提供商。强>
答案 1 :(得分:2)
您遇到的问题 - 而不是两个无关的问题 - 非常简单:
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支持。
mail()
功能,或使用localhost
或127.0.0.1
作为SMTP服务器。然后,电子邮件将通过您的生产服务器的服务网络发送。他们可能会告诉您不允许使用端口25,但允许使用端口(例如)465或567。您必须更新配置和/或相应地添加TLS / SSL(参见上文)。
250 marketing@example.in ...发件人确定 RCPT:john.hh@gmail.com 554 Relay因政策原因被拒绝
另外,为了避免滥用行为, SMTP服务器不会让所有人连接和发送电子邮件,而只会让自己的客户。我看到在PHPMailer配置中你指定了一个用户和一个密码。在telnet会话中你没有。所以很可能PHPmailer可以发送但不能连接,而你的telnet可以连接,但不能发送。
一旦解决了连接问题,您的身份验证问题就会解决或者会消失(因为您将使用IT人员提供给您的其他服务器,例如localhost
)
滥用服务的第三种方式是过度使用 - 向太多人发送太多电子邮件。与IT人员核实发送电子邮件的可接受政策是什么。
要查看的其他事项是源的可信度(您可能希望代表某些未指定您选择的SMTP服务器的域发送电子邮件作为允许的发件人),并且<数据的机密性(即使使用TLS / SSL连接,如果您获得localhost
作为SMTP服务器,您的IT人员将对您发送的任何电子邮件进行完全,不受约束,无法检测的访问。可能会,也可能不会,可以。)
答案 2 :(得分:1)
第一个引用(来自ibm社区):
john.hh@gmail.com是列出的组(拒绝)的成员 gmail.com的“拒绝邮件用于以下互联网 地址“字段(在目标服务器的Domino配置中) 文档的路由器/ SMTP,限制和控制,SMTP入站 控制选项卡的“入站预期收件人控件”部分。)
从成员中删除Mary的层次结构名称(Mary Jones / ABC) 拒绝(组)文档中的列表允许Mary接收消息 来自互联网。
第二句:
大多数邮件服务器,以防止它们被用作匿名垃圾邮件 中继,仅配置为中继来自某些主机的邮件。
答案 3 :(得分:1)
使用自己的SMTP是一个坏主意。 根据您的操作,您有很大的机会以某种方式阻止您的电子邮件或将其标记为垃圾邮件。而且您必须花一些时间来保持服务器的最新状态。
使用针对每个提供商列入白名单的在线服务,并公开API以发送您的transactionnal邮件: https://www.mailjet.com/ http://mailchimp.com/ ...
他们经常提出小额免费帐户(每天2000封电子邮件)。 使用API非常简单,可以在几分钟内完成(例如:https://dev.mailjet.com/)
答案 4 :(得分:1)
询问您的托管服务提供商是否在该服务器上没有启用smtp。我之前有同样的问题,因为smtp和curl都是。联系托管服务提供商。
答案 5 :(得分:1)
什么是phpmailer版本?
您可能忘记添加此行
$mail->IsSMTP(); // use SMTP
发起$ mail后。
试一试。
答案 6 :(得分:1)
所以你有一个GoDaddy服务器,你想通过新获得的SMTP Relay发送电子邮件。那么“你不能”可能就是你在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。
Forth Step:继续编写我们的代码。
使用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。
答案 7 :(得分:1)
我认为我们可以通过几个步骤使其正常运行。
在你的Godaddy / Hostgator Cpanel&gt;选择MX记录&gt;选择有问题的域&gt;选择“远程邮件交换器”
您可以在此时测试邮件投放,问题可能会得到解决。
我确信它设置正确,但相信好的Cpanel,PhpMailer和Godaddy / Hostgator。这是一个常识毫无意义的地方。
<强>取代:强>
$mail->Host = 'mail.example.in';
<强>与强>
$mail->Host = 'localhost';
我认为,如果登录凭据等内容有效,我应该解决所有问题。
答案 8 :(得分:1)
我遇到了类似的超时问题,原因是我的托管服务提供商 (Linode)。 TLDR;默认情况下,Linode 在 2019 年 11 月 5 日之后创建的帐户上的 SMTP 限制就位。您需要为您的实例配置 rDNS 并打开确认 CAN-SPAM 合规性的支持票证,并且支持人员应该很快解除限制。我想很多人因为 smtp 限制而面临这个问题
答案 9 :(得分:0)
超时错误是丢弃数据包的典型情况,因此Web服务器和SMTP服务器之间可能存在防火墙问题。 如果您获得了对服务器的ssh访问权限,则可以尝试使用以下命令连接到smtp:
telnet <smtp server> 25
即使使用telnet也会出现超时错误,您可以确定问题出在网络/防火墙端。
答案 10 :(得分:0)
您需要更改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
答案 11 :(得分:0)
我明白了你的意思。同样的问题发生在我身上,我刚刚添加了一行并为我工作。请使用,
$mail->SMTPSecure = 'ssl';
并根据ssl配置您的设置。还要在服务端正确检查邮件配置。