我在EC2实例上运行了一个应用程序。 在部分应用程序中,需要通过电子邮件向用户发送通知。我使用PHP的本机mail()函数。
问题在于它似乎不是很稳定。我昨晚做了一些测试,发现有些电子邮件是立即收到的,但是有些电子邮件似乎等了好一段时间。
我在一分钟内触发了两个通知,几秒钟后我收到了第二个事件的通知,但第一个事件通知最多需要半个小时才能显示在我的收件箱中。
以下是迟到的电子邮件标题:
Delivered-To: ----@gmail.com
Received: by 10.140.107.75 with SMTP id g69csp40419qgf; Wed, 3 Dec 2014 16:12:00 -0800 (PST)
X-Received: by 10.194.108.162 with SMTP id hl2mr11475479wjb.102.1417651919645; Wed, 03 Dec 2014 16:11:59 -0800 (PST)
Return-Path: <apache@ip-xxx-xxx-xxx-xxx.localdomain>
Received: from ip-xxx-xxx-xxx-xxx.localdomain (ec2-xx-xx-xx-xx.eu-west-1.compute.amazonaws.com. [xx.xx.xx.xx])
by mx.google.com with ESMTP id g6si19323730wjy.43.2014.12.03.16.11.59
for <----@gmail.com>; Wed, 03 Dec 2014 16:11:59 -0800 (PST)
Received-SPF: none (google.com: apache@ip-xxx.xxx.xxx.xxx.localdomain does not designate permitted sender hosts) client-ip=xx.xx.xx.xx;
Authentication-Results: mx.google.com; spf=none (google.com: apache@ip-xxx.xxx.xxx.xxx.localdomain does not designate permitted sender hosts) smtp.mail=apache@ip-xxx.xxx.xxx.xxx.localdomain; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com
Received: by ip-172-31-19-221.localdomain (Postfix, from userid 48 id CABF521F29; Wed, 3 Dec 2014 23:38:35 +0000 (UTC)
To: ---- <----@gmail.com>
Subject: Test
X-PHP-Originating-Script: 500:Notifier.class.php
From: ---- <----@gmail.com>
Message-Id: <20141203233835.CABF521F29@ip-xxx-xxx-xxx-xxx.localdomain>
Date: Wed, 3 Dec 2014 23:38:35 +0000 (UTC)
我无法弄清楚造成这种情况的原因,所以如果有人知道问题出在哪里,那么答案非常感谢!
答案 0 :(得分:0)
从下面一行看,您的PHP脚本在23:38:35 +0000(UTC)处创建了消息
Date: Wed, 3 Dec 2014 23:38:35 +0000 (UTC)
然后,从下面这一行开始,在同一主机上运行的postfix立即确认收到来自PHP的消息(通过mail()函数):
Received: by ip-172-31-19-221.localdomain (Postfix, from userid 48 id CABF521F29; Wed, 3 Dec 2014 23:38:35 +0000 (UTC)
问题似乎在下一跳。看起来Postfix配置为通过亚马逊的SMTP服务中继邮件。但是,根据时区调整差异,亚马逊的SMTP服务器在大约33分钟后才收到消息:
Received: from ip-xxx-xxx-xxx-xxx.localdomain (ec2-xx-xx-xx-xx.eu-west-1.compute.amazonaws.com. [xx.xx.xx.xx])by mx.google.com with ESMTP id g6si19323730wjy.43.2014.12.03.16.11.59
for&lt; ---- @ gmail.com&gt ;; 2014年12月3日星期三16:11:59 -0800(太平洋标准时间)
因此,延迟是在本地主机上的postfix中,将消息传递给Amazon的SMTP中继服务器。亚马逊的服务器可能会多次从您的后缀服务器推迟收到邮件,因此延迟可能是由于后缀不得不重新排队并多次重新尝试发送,直到最后33分钟后成功。如果您能够访问后缀服务器上的日志,这些可能会对导致延迟的原因有所了解。
部分问题看起来可能是您在邮件的FROM:标头中设置发件人地址,但您没有设置信封发件人。它看起来像是使用默认信封发件人(apache@ip-xxx-xxx-xxx-xxx.localdomain),这显然不是有效的电子邮件地址,看起来这可能会导致SPF检查出现问题。由于这个原因,亚马逊的SMTP服务器可能会推迟传递邮件。您可能想要设置信封发件人,看看这是否解决了问题。这种语法可以解决这个问题:
$to = "to@to.com";
$from = "from@from.com";
$subject = "subject";
$message = "this is the message body";
$headers = "From: $from";
$ok = @mail($to, $subject, $message, $headers, "-f " . $from);