PHP发送的电子邮件中Message-Id存在什么问题?

20

我收到了通过php发给gmail账户的邮件,但是它的message-id头部信息让我感到怀疑:

Message-Id: <5100054f.a489440a.5d93.6a70SMTPIN_ADDED_MISSING@mx.google.com>

请问这个奇怪的格式是什么意思,SMTPIN_ADDED_MISSING 在这里是什么意思?我在网上看到的示例格式中包含了发送域名,但出于某种原因,我的消息 ID 并不包含它:

38D1C1FD-3C35-4568-925C-FC46CAC0DE8A@sendinghost.com

我不认为在Zend_Mail中设置了这个标头。是什么生成了这些标头?您是否看到这个标头的任何问题?

6个回答

25

一个适当的发件人邮件客户端在发送电子邮件时应该产生 Message-ID 标头。谷歌在通过其电子邮件系统传递消息时,会“友好地”为您生成它,但大多数情况下不会这样做,而大多数垃圾邮件过滤器将缺少此标头视为该消息更有可能是垃圾邮件的指示。任何格式错误或缺失的标头都将加入“垃圾邮件得分”中。

生成它并不难,只需要确保每个信息都是唯一的即可:

$message-id = time() .'-' . md5($sender . $recipient) . '@' $_SERVER['SERVER_NAME'];

或者

$message-id = time() .'-' . md5($sender . $recipient) . '@yourdomain.com';

提供:

1358961017-677533f745f613447d06de25e7fa4d32@yourdomain.com

你的意思是如果没有Message_Id会增加进入垃圾邮件的几率吗? - Oleg
2
就像我之前所说的,“任何格式不正确或缺失的标头都会增加‘垃圾邮件分数’”。SMTP服务器应该添加它,但是你的显然没有。 - Sammitch
是否可以配置SMTP服务器自动添加消息ID而不是在应用程序中发送它? - Oleg
@tripleee 非常感谢!你帮我省了很多时间!我相信你可以把你的评论变成一个答案! - Vic Seedoubleyew
1
如果您在复制/粘贴,请不要忘记在'@'和$_SERVER['SERVER_NAME']之间加上'.'。 - hiburn8
显示剩余4条评论

8

如果缺少邮件消息ID,Google SMTP会生成它。第一个SMTP服务器必须设置此标头。因此,您不需要生成它-谷歌会自动生成。它用于防止多次传递并将相关消息链接在一起。

不需要设置消息ID标头,但对于大多数(但不是所有,仅配置的)SMTP来说,这是一个好习惯,可以添加(可能是修复)此标头。因此,为了避免其他人生成此标头,您可以自己生成它。


1
我应该从php设置还是让服务器的smtp服务器添加它们?message_id是否应包含发送地址服务器的域名,类似于8D1C1FD-3C35-4568-925C-FC46CAC0DE8A@sendinghost.com这样的格式? - Oleg
你的意思是如果发送的电子邮件中没有消息 ID,那么接收方邮件会自动生成并添加到该消息中吗? - Oleg
SMTP服务器在不存在时会生成它。不必从PHP生成。它必须包含@domain部分。建议参考http://www.jwz.org/doc/mid.html。 - clover
如果我发送电子邮件的SMTP服务器生成了它,为什么它会设置谷歌的域名而不是发送它的SMTP服务器的域名? - Oleg
是否可以配置SMTP服务器自动添加消息ID而不是在应用程序中发送它? - Oleg
是的,后缀例如:always_add_missing_headers(默认值:否) - clover

4
这个对我有效(我还添加了一个“日期”行到标题,因为对我来说这也是一个垃圾邮件问题)。基于 这段代码
以下是我的PHP数组方法(使用Pear的Mail和Mime库):
$headers = array(
   'From'       => $from,
   'Subject'    => $subject,
   'To'     => $to,
   'Cc'     => '',
   'Date'       => date('r'),
   'Message-ID' => sprintf("<%s.%s@%s>",
                                base_convert(microtime(), 10, 36),
                                base_convert(bin2hex(openssl_random_pseudo_bytes(8)), 16, 36),
                                'yourdomain.com')
                );

请注意,在php cli中使用$_SERVER['SERVER_NAME']而不是字面上的'yourdomain.com'是无效的,这一点由Oleg在另一个回答中注释了。

0

你漏掉了“<”和“>”括号。


0

我使用相同的MessageId来跟踪交换的消息。

我通过以下方式修复MessageId:

$mail->MessageID =sprintf('<%s@%s>', $myMessageID, 'myserver');

0

简而言之:发送电子邮件时不要使用25端口,而应使用587端口。

当我使用自己创建的golang电子邮件客户端通过25端口向我的本地postfix服务器发送出站电子邮件,并将目标电子邮件地址设置为gmail或google gsuite地址时,我发现

Message ID  <5be55db9.1c69fb81.d0444.d894SMTPIN_ADDED_MISSING@mx.google.com>

从Gmail中的目标电子邮件地址查看显示原始…但是,由于我在我的golang电子邮件客户端和本地postfix服务器中都使用了完整的TLS证书,因此当我在我的出站电子邮件客户端中替换为安全端口587(postfix已经使用TLS证书)时,我才能得到正确的结果。

Message ID  <20181109163255.F164D8E9588@mail.myexample.com>

注意 - 我从未定义过电子邮件头message-id,事实上我正在使用的golang repo没有API调用来定义该头


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接