【问题标题】:How to avoid "message rejected with no message-id" when using Indy smtp使用 Indy smtp 时如何避免“没有消息 ID 的消息被拒绝”
【发布时间】:2014-07-10 14:55:09
【问题描述】:

在极少数情况下,我的电子邮件会在邮件中退回:

远程主机说:550-RFC2822 说所有邮件都应该有一个 Message-ID 标头。 550 大多数没有它的邮件都是垃圾邮件,因此您的邮件已被拒绝。

我尝试使用以下方法设置消息 ID 标头:

IdMessage1.Headers.Values['Message-ID'] := id;

在这种情况下,id 是 mydomain 中格式为 xxxxx 的字符串。但是,这不是如何设置 message-id 标头,或者它被我的 smtp 服务器(由我的 isp 托管)剥离。我注意到从 Outlook 发送的电子邮件确实获得了 message-id 并且它们没有被剥离。有没有人对如何提供 message-id 标头有任何建议,以免被剥离?我还应该包括其他标题吗?我还向我的 isp 发送了电子邮件,以防这是他们的设置,但 Outlook 必须以某种方式进行。

【问题讨论】:

    标签: smtp delphi-xe5 indy10


    【解决方案1】:

    要在发送保存电子邮件时提供自定义标题,您必须改用TIdMessage.ExtraHeaders 属性。 TIdMessage.Headers 属性在接收加载电子邮件时使用。

    TIdMessage 有一个 MsgId 属性,您可以使用它来代替。但是,当发送电子邮件时,MsgId 属性值被忽略,因此您必须求助于TIdMessage.ExtraHeaders 来发送自定义的Message-ID 标头。不过,保存电子邮件不会忽略TIdMessage.MsgId 值。


    编辑:

    作为对此的跟进 - TIdMessage 现在已经更新了它如何处理“Message-ID”和“In-Reply-To”标头的逻辑更改:

    http://indyproject.org/sockets/blogs/changelog/20160912.aspx

    简而言之,TIdMessage.MsgId 属性现在会在创建新电子邮件时生成“Message-ID”标头(您不再需要使用 TIdMessage.ExtraHeaders 属性,但如果需要,您仍然可以使用),并且当TIdMessage.InReplyTo 属性为空时,不再使用当前的“Message-ID”标头自动生成“In-Reply-To”标头。

    【讨论】:

    • 雷米,谢谢你的信息。我现在已经使用额外的标头设置了 message-id 并且它似乎可以工作,但是我也将 In-Reply-To: 设置为相同的值。有什么办法可以避免这种情况,或者这是否有意义?
    • 是的,我的意思是MsgId,对不起。我已经更新了我的答案。
    • 对于In-Reply-To标头,如果TIdMessage.InReplyTo属性为空,则设置为与Message-ID标头相同的值。这是硬编码的行为,无法避免。 TIdMessage 相信客户端永远不会生成自己的消息 ID,这应该是服务器的责任。这种信念多年来一直受到质疑,但TIdMessage 尚未相应更新。
    • 谢谢 Remy,我的 ISP 说他们不能改变服务器的行为(它似乎没有自动设置消息 ID。)你认为有额外的回复标题会引起问题?我想我也可以尝试修改 indy 代码(虽然我从未看过它。)
    • 我修改了我的 Indy 版本,不针对我的情况设置 in-reply-to。感谢您的帮助!
    猜你喜欢
    • 2013-10-16
    • 2017-01-25
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多