如何使用javax.mail设置或更改SMTP邮件ID?

如何使用javax.mail设置或更改SMTP邮件ID?,java,smtp,jakarta-mail,Java,Smtp,Jakarta Mail,使用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 [19

使用
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
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);
@Override
protected void updateMessageID() throws MessagingException {
    removeHeader("Message-Id");
}

我相信这一部分回答了你的问题:

Q:我为新邮件的邮件ID头设置了一个特定值,但当我发送此邮件时,该头会被重写

A:调用saveChanges方法时,会为Message ID字段设置一个新值(通常在调用消息时隐式设置) 已发送),覆盖您自己设置的任何值。如果您需要设置 如果您拥有自己的邮件ID并保留它,则必须创建自己的邮件ID mimessage子类,重写updateMessageID方法并使用 此子类的实例

class MyMessage extends MimeMessage {
    ...

    protected void updateMessageID() throws MessagingException {
  setHeader("Message-ID", "my-message-id");
    }
    ...
}
根据,当您发送消息或调用saveChanges时,updateMessageID()方法设置的消息Id标头将覆盖您可能已经设置的任何值

要设置自己的值,您需要创建mimessage的子类并实现自己的updateMessageID()函数:

class MyMimeMessage extends MimeMessage {
    ...
    protected void updateMessageID() throws MessagingException {
        setHeader("Message-ID", "my-message-id");
    }
    ...
}
我能够使用此技术抑制或消除消息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
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);
@Override
protected void updateMessageID() throws MessagingException {
    removeHeader("Message-Id");
}

这对Mailgun很有用,如果您没有设置邮件Id,它会自行设置邮件Id。

您还可以保存邮件更改并在发送前设置自定义邮件Id。 步骤:

  • 创建
    MimeMessage message
    并设置其数据
  • message.saveChanges()
  • message.setHeader(“message ID”,yourcustomessageid)
  • 发送消息
    这对于Spring的
    JavaMailSender
    或其他难以覆盖
    MimeMessage

    的情况非常有用。这是在消息中实现自定义id的完整代码

    MimeMessage msg = new MimeMessage(s) {
        @Override
        protected void updateMessageID() { } // Prevent MimeMessage from overwriting our Message-ID
    };
    msg.setHeader("Message-ID", "MyOwnMessageID");
    
    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);
            }
        }
    }
    

    这是正确的答案。不需要新的类。。。刚刚在调用
    .send()方法之前创建。