3

我正在使用 apache commons smtp 库使用我的 gmail 帐户发送电子邮件。一切正常,但是 Message-Id 标头已发送,我希望将其删除(未发送)。挖网我在 oracle 文档上找到了一些东西:http ://www.oracle.com/technetwork/java/faq-135477.html#msgid

class MyMessage extends MimeMessage {
    ...

    protected void updateMessageID() throws MessagingException {
    setHeader("Message-ID", "my-message-id");
    }
    ...
}

但是我不知道如何在 apache commons 中实现这一点。

这是我的代码:

Email email = new SimpleEmail();
email.setHostName("smtp.googlemail.com");
email.setSmtpPort(465);
email.setAuthenticator(new DefaultAuthenticator("username", "password"));
email.setSSLOnConnect(true);
email.setFrom("user@gmail.com");
email.setSubject("TestMail");
email.setMsg("This is a test mail ... :-)");
email.addTo("foo@bar.com");
email.send();

基本上我需要类似的东西email.setMimeMessage(...),但没有这样的方法,只有email.getMimeMessage()

更新 - 找到解决方案

public class MyEmail extends SimpleEmail{

    protected MimeMessage createMimeMessage(Session aSession)
    {
        return new MyMessage(aSession);
    }
}

您只需覆盖createMimeMessage方法并确保它返回您自己的MimeMessage实现(在这种情况下MyMessage

4

2 回答 2

3

Email 类有一个Factory 方法来创建自定义的MimeMessage,它可以由派生类实现,例如设置消息ID。

您可以扩展此方法以设置您的消息 ID。下一个代码创建一个带有自定义消息 ID 的 htmlEmail 消息。

HtmlEmail email = new HtmlEmail()
                    {
                        protected MimeMessage createMimeMessage(Session aSession)
                        {
                            return new MimeMessage(aSession)
                                    {
                                        protected void updateHeaders () throws MessagingException
                                        {                     
                                            super.updateHeaders ();
                                            super.setHeader ("Message-ID", "my-message-id");
                                        }
                                    };
                        }
                    };
于 2014-12-01T13:11:05.743 回答
2

可能的问题是“电子邮件”调用saveChanges()底层代码MimeMessage以提交标头,该标头调用该updateHeaders()方法,该方法又调用该方法,该方法updateMessageID()将插入一个 Message-ID 标头。

为什么不尝试仅使用 java.mail API 发送电子邮件,您可以在其中控制 MimeMessage ?该代码甚至已经可用

于 2013-03-28T16:40:01.740 回答