通过JavaMail发送邮件时,将替换Message-Id

时间:2011-11-28 15:13:13

标签: message javamail sendmail

我试图找到解决方案,运气好,所以我决定在这里发布。

问题是,当我用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>

为什么会这样?

我感谢任何帮助

谢谢大家

- 编辑

根据sugestions我使用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生成方法有助于解决这个问题)

感谢您的回复

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分:0)

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