如何在发送带javax.mail
的邮件时设置SMTP邮件ID。我的邮件服务器报告的内容如下:
1 <= me@domain.com H=mail (host) [192.168.1.4] P=esmtp S=142014
id=2043289758.9.1322829290422.JavaMail.thor@developer.local
2 => sombodey@else R=dnslookup T=remote_smtp H=mx00.t-online.de [194.25.134.8]
3 Completed
我想在发送之前设置id=2043289758.9.1322829290422.JavaMail.thor@developer.local
。这可能吗?它创建的电子邮件如下:
Properties props = System.getProperties();
props.put("mail.smtp.host", "192.168.1.4");
Session session = Session.getDefaultInstance(props, null);
session.setDebug(false);
Message msg = createMsg();
Transport.send(msg);
答案 0 :(得分:23)
我相信JavaMail FAQ的这一部分回答了你的问题:
问:我为新邮件的Message-ID标头设置了一个特定值,但是当我发送此邮件时,标头会被重写。
A:调用saveChanges方法时会设置Message-ID字段的新值(通常在消息时隐式显示) 发送),覆盖你自己设定的任何价值。如果你需要设置你的 拥有自己的Message-ID并保留,您必须创建自己的 MimeMessage子类,覆盖updateMessageID方法并使用 这个子类的实例。
class MyMessage extends MimeMessage { ... protected void updateMessageID() throws MessagingException { setHeader("Message-ID", "my-message-id"); } ... }
答案 1 :(得分:11)
根据Oracle's FAQ,当您发送消息或调用saveChanges时,updateMessageID()方法设置的Message-Id标头将覆盖您可能已设置的任何值。
要设置自己的值,您需要创建一个MimeMessage的子类并实现自己的updateMessageID()函数:
class MyMimeMessage extends MimeMessage {
...
protected void updateMessageID() throws MessagingException {
setHeader("Message-ID", "my-message-id");
}
...
}
我能够使用此技术来抑制或消除Message-Id标头,如下所示:
@Override
protected void updateMessageID() throws MessagingException {
removeHeader("Message-Id");
}
这对Mailgun非常有用,如果您没有设置Message-Id,它会自行设置Message-Id。
答案 2 :(得分:3)
您还可以在发送之前保存邮件更改并设置自定义消息ID。 步骤:
MimeMessage message
并设置其数据。message.saveChanges();
message.setHeader("Message-ID", yourCustomMessageId);
这对于Spring JavaMailSender
或其他难以覆盖MimeMessage
的情况非常有用。
答案 3 :(得分:0)
MimeMessage msg = new MimeMessage(s) {
@Override
protected void updateMessageID() { } // Prevent MimeMessage from overwriting our Message-ID
};
msg.setHeader("Message-ID", "MyOwnMessageID");
答案 4 :(得分:0)
这是在消息
中实现自定义ID的完整代码public class SendMessage{
private String idMessage;
private void sendEmail() {
//...
// Create de session
//...
Message message = new MyMessage(session);
//...
// Prepare the body of the message, attachments, etc.
//...
// assign custom message id
this.idMessage = “My own ID”;
//send
Transport.send(message);
}
class MyMessage extends MimeMessage {
public MyMessage(Session session) {
super(session);
}
protected void updateMessageID() throws MessagingException {
setHeader("Message-ID", this.idMessage);
}
}
}