2012-12-21 10 views
9

Sto utilizzando org.springframework.mail.javamail.JavaMailSender per inviare e-mail utilizzando SMTP e nel senso che ho bisogno di recuperare l'intestazione Message-ID. Il seguente codiceRichiamare l'ID messaggio generato prima di inviare l'e-mail utilizzando Spring JavaMail

message.getMimeMessage().getMessageID() 

restituisce null. Come recuperare l'ID messaggio?

public void notifyByMail(final NotificationRequest request) 
{ 
    MimeMessagePreparator preparator = new MimeMessagePreparator() 
    { 
     public void prepare(MimeMessage mimeMessage) throws Exception 
     { 
      MimeMessageHelper message = null; 
      message = new MimeMessageHelper(mimeMessage, UTF_8); 
      message.setTo(request.getTo()); 
      message.setCc(request.getCc()); 
      message.setFrom(request.getFrom()); 
      message.setReplyTo(request.getReplyTo()); 
      message.setSubject(request.getSubject()); 
      message.setText("some text", true); 

      //Need to retrieve the Message-ID here 
      System.out.println("Message - ID : " + message.getMimeMessage().getMessageID()); 
     } 

    }; 
    getMailSender().send(preparator); 
} 
+0

È sempre possibile generare il proprio "ID X-Message" e aggiungerlo come intestazione nella posta. –

risposta

13

Provare message.getMimeMessage().saveChanges() prima del message.getMimeMessage().getMessageID().

È inoltre bisogno di questo quando si crea il messaggio:

 MimeMessage msg = new MimeMessage(session) { 
      protected void updateMessageID() throws MessagingException { 
       if (getHeader("Message-ID") == null) 
        super.updateMessageID(); 
      } 
     }; 

che causa l'intestazione Message-ID da impostare solo la prima volta, se non è già impostato.

+0

Qualcuno ha verificato che questo approccio funzioni? Ricevo un ID messaggio dopo saveChanges e un altro ID messaggio quando il messaggio viene effettivamente inviato. – Olaf

+0

Forse Spring sta modificando il messaggio dopo aver fatto quanto sopra e prima che il messaggio venga effettivamente inviato? Potresti saltare semplicemente Spring e usare direttamente JavaMail. –

+0

In realtà sto utilizzando JavaMail diretto. Gli ID generati hanno formato: . . .JavaMail. @. Il numero di sequenza viene incrementato di 1 tra il numero che ottengo e il numero che vedo nel client di posta elettronica sulla destinazione. Il timestamp in millisimali è esattamente lo stesso o è spento di 1. – Olaf

4

Il messaggioID non viene impostato fino a quando il messaggio non viene inviato.

Se si desidera impostare un messaggio personalizzato, credo è necessario eseguire l'override MIMEMessage in questo modo:

public class MyMimeMessage extends MimeMessage { 
    private String messageID; 

    public MyMimeMessage(Session session, String messageID) { 
     super(session); 
     this.messageID = messageID; 
    } 

    @Override 
    protected void updateMessageID() throws MessagingException { 
     setHeader("Message-ID", messageID); 
    } 
} 

Inoltre, alcuni servizi di posta elettronica (ad esempio Gmail) richiedono l'messageID per adattarsi a una certa sintassi (quasi come un indirizzo e-mail) che è possibile consultare here

Problemi correlati