Подтвердить что ты не робот

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

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

1 <= [email protected] H=mail (host) [192.168.1.4] P=esmtp S=142014
     [email protected]
2 => [email protected] R=dnslookup T=remote_smtp H=mx00.t-online.de [194.25.134.8]
3 Completed

Я хочу установить [email protected] перед отправкой. Это возможно? Электронная почта, созданная таким образом:

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

Ответ 1

Я считаю, что этот раздел Часто задаваемые вопросы по JavaMail отвечает на ваш вопрос:

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

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

class MyMessage extends MimeMessage {
    ...

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

Ответ 2

В соответствии с Часто задаваемые вопросы 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, который сам устанавливает идентификатор сообщения, если вы его не задали.

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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