Как установить или изменить SMTP-идентификатор сообщения с помощью javax.mail? - PullRequest
17 голосов
/ 03 декабря 2011

Как установить идентификатор сообщения SMTP при отправке почты с помощью javax.mail. Мой почтовый сервер сообщает что-то вроде этого:

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 перед отправкой. Это возможно? E-mail, который он создал так:

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

Ответы [ 5 ]

23 голосов
/ 03 декабря 2011

Я полагаю, что этот раздел JavaMail FAQ отвечает на ваш вопрос:

Q: Я устанавливаю определенное значение для заголовка Message-ID моего нового сообщения, но при отправке этого сообщения этот заголовок переписывается.

A: Новое значение для поля Message-ID устанавливается при вызове метода saveChanges (обычно неявно, когда сообщение отправлено), перезаписывая любое значение, которое вы установили сами. Если вам нужно установить собственный Message-ID и сохраните его, вам придется создать свой собственный Подкласс MimeMessage, переопределите метод updateMessageID и используйте Экземпляр этого подкласса.

class MyMessage extends MimeMessage {
    ...

    protected void updateMessageID() throws MessagingException {
  setHeader("Message-ID", "my-message-id");
    }
    ...
}
11 голосов
/ 02 ноября 2012

Согласно FAQ Oracle , когда вы отправляете сообщение или вызываете saveChanges, заголовок Message-Id устанавливается методом updateMessageID (), который переопределяет любое значение, которое вы, возможно, уже установили.

Чтобы установить собственное значение, вам нужно создать подкласс 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, если вы его не установили.

3 голосов
/ 26 октября 2016

Вы также можете сохранить изменения сообщений и установить собственный идентификатор сообщения перед отправкой.Шаги:

  1. Создать MimeMessage message и установить его данные.
  2. message.saveChanges();
  3. message.setHeader("Message-ID", yourCustomMessageId);
  4. Отправить сообщение.

Это полезно с JavaMailSender Spring или в других ситуациях, когда трудно переопределить MimeMessage.

0 голосов
/ 22 октября 2017

это полный код для реализации пользовательского идентификатора в сообщении

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);
        }
    }
}
0 голосов
/ 08 декабря 2016
MimeMessage msg = new MimeMessage(s) {
    @Override
    protected void updateMessageID() { } // Prevent MimeMessage from overwriting our Message-ID
};
msg.setHeader("Message-ID", "MyOwnMessageID");
...