Apache Commons SMTP更改/删除Message-Id头部

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)。

2个回答

3

Email类有一个工厂方法,可以创建一个定制的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");
                                        }
                                    };
                        }
                    };

2
可能的问题是,“Email”在底层的“MimeMessage”上调用saveChanges()来提交标题,这会调用updateHeaders()方法,进而调用updateMessageID(),从而插入一个Message-ID标题。
为什么不尝试仅使用java.mail API发送电子邮件,在那里您可以控制MimeMessage?代码已经可用了。

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