【问题标题】:Message-Id is being replaced when sending mail via JavaMail通过 JavaMail 发送邮件时,Message-Id 被替换
【发布时间】:2011-11-28 15:13:13
【问题描述】:

幸运的是,我试图找到一个解决方案,所以我决定在这里发布它。

问题是,当我使用 javaMail 发送消息时,它会自动生成一个 Message-Id(我存储到我的数据库中以识别对该消息的回复),但由于某种原因它正在被 smpt 服务器更改当消息发送时,我将无法跟踪与此消息相关的任何内容。

例如

我首先通过 gmail 向一个使用我的邮件客户端同步的帐户发送一条消息,然后我使用我的消息客户端检查该消息,一切正常,Message-Id 是

<CAPDSfCN1qPAhBCRmFK-zwP=MM=KjgpYuvhVRFAPwz1PjOqtnFA@mail.gmail.com>

然后我通过我的消息客户端回复这条消息,javaMail生成的id是

<1907960987.0.1322086080735.JavaMail.root@smtp.live.com>

最后,当我去查看我的电子邮件帐户中的回复时,它的标题中有以下值

Message-ID: <BLU0-SMTP33091BE2B32A7F46E370665C2C90@phx.gbl>失败

In-Reply-To: <CAPDSfCN1qPAhBCRmFK-zwP=MM=KjgpYuvhVRFAPwz1PjOqtnFA@mail.gmail.com>好的

如您所见,Message-Id 已更改,我期待它是

<1907960987.0.1322086080735.JavaMail.root@smtp.live.com>

为什么会这样?

感谢您的帮助

谢谢大家

--编辑

根据建议,我使用 javaMail 中的 smtpsend 演示进行了测试(我实现了 MimeMessage 的子类来生成我自己的 Message-Id)。

java -jar -Dmail.smtp.starttls.enable=true -Dmail.smtp.port=587 SMTPSend.jar -d -M smtp.live.com -U myaccount@hotmail.com -P mypass -o myaccount@hotmail.com -A anotheraccount@gmail.com

在发送消息时的 smtpsend 输出之间,生成了 Message-Id

<60eea6ae-2657-41bd-b475-3a57eff885ac@mydomain.com>

但是,当我在 anotheraccount@gmail.com 上查看此消息时,Message-Id 不同

<BLU0-SMTP109215E6BB99B93FC106B1E88B00@phx.gbl>

为什么它会即时更改我的 Message-Id...我不明白

--编辑2

我注意到问题正在发生,就在我从 hotmail 帐户发送邮件时 当我从 gmail 帐户发送邮件时,message-id 不再改变(我认为实现我自己的 Message-Id 生成方法有助于解决这个问题)

感谢回复

【问题讨论】:

  • 我现在在使用 C# 和 OpenPop 的 Outlook/hotmail 中看到了同样的情况。 Message-ID 被至少部分基于发送它的 SMTP 服务器的 ID 覆盖。例如...Message-ID: <BLU0-SMTP238B4936E5D12FDCC43512755CE0@phx.gbl> Received: from myBox ([111.111.111.111]) by BLU0-SMTP238.phx.gbl over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); 两者都是BLU0-SMTP238。 /sigh 我最终在电子邮件中添加了另一个标题,其中包含我已知的用于 hotmail/outlook 的唯一字符串。
  • 我从微软电子邮件帐户发送时遇到了同样的问题。你有没有解决过你的问题?

标签: message jakarta-mail sendmail


【解决方案1】:

我知道这是一个旧线程,但这个答案仍然可能对人们有所帮助。

您需要否决 MimeMessage 中的 updateMessageID(),因为它在每次发送电子邮件之前都会被调用。

class MyMessage extends MimeMessage {

    public MyMessage(Session session) {
        super(session);
    }

    protected void updateMessageID() throws MessagingException {
        setHeader("Message-ID", "<your-message-id@domain.nl>");
    }
}

如果您想为每个 MyMessage 传递唯一的 id...

class MyMessage extends MimeMessage {
        String uniqueMessageId;     

        public MyMessage(Session session, String uniqueMessageId) {
            super(session);
            this.uniqueMessageId = uniqueMessageId;

        }

        protected void updateMessageID() throws MessagingException {
            setHeader("Message-ID", "<" + uniqueMessageId + ">");
        }
    }

然后调用它,例如:

MyMessage message = new MyMessage(session, "201610131428_newsletter1@domain.nl");

【讨论】:

  • 不,这是您通常在客户端设置 MessageID 的方式。但是在某些情况下,例如 OP,SMTP SERVER 在发送后会更改它。您不能从客户端覆盖此行为。只能用返回的 ID 捕获 205 OK。
【解决方案2】:

encountered 与 Simple Java Mail 有同样的问题,据我所知,捕获 SMTP 服务器分配的实际 ID 的唯一方法是解析包含它的 250 OK 响应(如果是 MS交换)。

正如比尔(原始 JavaMail 的主要作者)在下面提到的,SMTP 服务器实际上不应该更改消息 ID,但某些服务器(如 MS Exchange)明确允许进行其他配置。例如参见:https://social.technet.microsoft.com/Forums/en-US/132df54c-871b-4e9d-98c9-5b5caa993322/custom-message-id-replaced-by-outlook-smtp-server?forum=exchangesvrclients

如果您在连接到的所有服务器上都看到此行为,则可能是您没有以正确的方式设置 MessageID(Java/Jakarta Mail 对此有点迟钝)。在这种情况下,请参阅other answer

【讨论】:

    【解决方案3】:

    您的邮件服务器已损坏。它不应该更改 Message-ID 标头。 将问题报告给您的邮件服务器的所有者。

    【讨论】:

    • 我不认为它是服务器问题,因为我已经使用不同的帐户(gmail 和 hotmail 帐户)对其进行了测试,这可能是 javaMail 生成此 Message-Id 的格式,所以当它到达 smtp服务器将这种格式检测为无效然后重新生成它?谢谢
    • 如果您在使用不同的邮件服务器时看到相同的行为,则可能是其他问题。我可以确认,当我使用 JavaMail 通过 Gmail 发送邮件时,会保留 Message-ID 标头。也许您有一些防火墙或防病毒软件会在发送消息时对其进行修改?告诉我们更多关于您测试的确切内容以及您如何连接到邮件服务器的详细信息。您能否使用 JavaMail 中包含的 smtpsend.java 演示程序重现该问题?
    • 感谢回复,看看我对原帖所做的修改
    • 不应该,但有些服务器特别允许配置其他方式(如 MS Exhange 服务器)。见social.technet.microsoft.com/Forums/en-US/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2016-07-31
    • 1970-01-01
    • 2012-04-19
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多