2015-05-01 70 views
3

我正在開發一個應用程序,需要通過JavaMail發送一封具有特定消息ID的電子郵件。Java MimeMessage.saveChanges not calling updateMessageID

我已經擴展了Java MimeMessage類來覆蓋updateMessageID方法,以便我可以自己設置消息ID。問題是,當我調用Transport.send(msg)方法時,它不調用updateMessageID方法。我想也許我需要在調用Transport.send(msg)之前調用saveChanges()方法。即使當我顯式調用msg.saveChanges()時,也不會觸發updateMessageID方法被調用。

是什麼讓這更古怪是因爲,當我將測試應用程序轉換爲JSP並運行它時,Transport.send(msg)方法會調用updateMessageID方法。

我測試的服務器和web服務器都運行jdk1.7.0_71。

擴展的MimeMessage類

package com.my.framework; 
 
import javax.mail.MessagingException; 
 
import javax.mail.Session; 
 
import javax.mail.internet.InternetAddress; 
 
import javax.mail.internet.MimeMessage; 
 

 
public class MYMimeMessage extends MimeMessage { 
 
Session session; 
 
private static int id = 0; 
 
private static String messageID = null; 
 

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

 
protected void updateMessageID() throws MessagingException { 
 
    System.out.println("Calling updateMessageID()"); 
 
    setHeader("Message-ID", "<" + getUniqueMessageIDValue(session) + ">"); 
 
} 
 

 
/* Added to pass message id in */ 
 
public static void setMessageID(String cid) 
 
{ 
 
    messageID = cid; 
 
} 
 

 
public static String getUniqueMessageIDValue(Session ssn) { 
 
    String suffix = null; 
 

 
    InternetAddress addr = InternetAddress.getLocalAddress(ssn); 
 
    if (addr != null) 
 
     suffix = addr.getAddress(); 
 
    else { 
 
     suffix = "[email protected]"; // worst-case default 
 
    } 
 
\t 
 
    if(messageID == null) 
 
    { 
 
     messageID = "987654321"; 
 
    } 
 
    StringBuffer s = new StringBuffer(); 
 
\t 
 
    // Unique string is <messageID>.<id>.<currentTime>.FDDMail.<suffix> 
 
    s.append(messageID).append('.').append(getUniqueId()).append('.'). 
 
     append(System.currentTimeMillis()).append('.'). 
 
     append("FDDMail."). 
 
     append(suffix); 
 
    System.out.println("RETURNING THE new ID: " + s.toString()"); 
 
    return s.toString(); 
 
} 
 

 
private static synchronized int getUniqueId() { 
 
\t return id++; 
 
} 
 
}

我打電話從名爲SimpleEmail郵件包裝這個MimeMessageClass。它主要是一堆get/set函數。所有的肉是在sendEmail方法...

public String sendEmail() 
 
{ 
 
    String msgText1 = this.getBody(); 
 
    // Create some properties and get the default Session 
 
    Properties props = System.getProperties(); 
 
    props.put("mail.smtp.host", this.getSmtpClient()); 
 
    props.put("mail.from", ""); 
 

 
    Session session = Session.getDefaultInstance(props, null); 
 

 
    try 
 
    { 
 
     // Create a message 
 
     MyMimeMessage msg = new MyMimeMessage(session); 
 

 
     if (null != sender && sender.length() > 0) 
 
     { 
 
     msg.setSender(new InternetAddress(sender)); 
 
     } 
 

 
     if((this.getReply_to() != null) && (this.getReply_to().length() > 0)) 
 
     { 
 
     Address emailReplyTo[] = new Address[1]; 
 
     emailReplyTo[0] = new InternetAddress(this.getReply_to()); 
 
     msg.setReplyTo(emailReplyTo); 
 
     } 
 

 
     msg.setFrom(new InternetAddress(this.getFrom())); 
 

 
     if(this.to == null || this.to.size() <= 0) 
 
     { 
 
     return "Error: No To to send"; 
 
     } 
 

 
     int toIndex = 0; 
 
     InternetAddress [] address = new InternetAddress [this.to.size()]; 
 
     while(this.HasNextTo()) 
 
     { 
 
     address[toIndex] = new InternetAddress(this.nextTo()); 
 
     toIndex++; 
 
     } 
 

 
     msg.setRecipients(Message.RecipientType.TO, address); 
 

 
     if(this.subject == null) 
 
     { 
 
     this.subject = "<no subject>"; 
 
     } 
 
     msg.setSubject(this.subject); 
 
     if(!useTextHeader) 
 
     { 
 
     //Create and fill the first message part 
 
     MimeBodyPart mbp1 = new MimeBodyPart(); 
 
     mbp1.setDataHandler(new DataHandler(new HTMLDataSource(msgText1))); 
 

 
     Multipart mp = new MimeMultipart(); 
 
     mp.addBodyPart(mbp1); 
 
     // Create the second message part 
 
     MimeBodyPart mbp2; 
 
     FileDataSource fds; 
 
     String filename; 
 
     if(this.attachments != null) { 
 
      Set attachmentPathAndNames = this.attachments.keySet(); 
 
      Iterator attachmentIterator = attachmentPathAndNames.iterator(); 
 
      while(attachmentIterator.hasNext()) { 
 
       String attachmentPathAndName = (String)attachmentIterator.next(); 
 
       filename = (String)this.attachments.get(attachmentPathAndName); 
 
       if(filename == null) { 
 
        String[] dirs = attachmentPathAndName.split("\\/"); 
 
        filename = dirs[dirs.length - 1]; 
 
       } 
 

 
       mbp2 = new MimeBodyPart(); 
 
       fds = new FileDataSource(attachmentPathAndName); 
 
       mbp2.setDataHandler(new DataHandler(fds)); 
 
       mbp2.setFileName(filename); 
 
       //Create the Multipart and its parts to it 
 
       mp.addBodyPart(mbp2); 
 
      } 
 
     } 
 

 
     //add the Multipart to the message 
 
     msg.setContent(mp); 
 
     } 
 
     else 
 
     { 
 
     msg.setText(msgText1); 
 
     } 
 

 
     //set the Date: header 
 
     msg.setSentDate(new Date()); 
 

 
     //set the MessageID Header 
 
     msg.setMessageID(this.messageID); 
 
     //send the message 
 
     try 
 
     { 
 
     Transport.send(msg); 
 
     } 
 
     catch(Exception e) 
 
     { 
 
     System.out.println("STOP WE THREW AN ERROR!!!!!!!!!!!!!!!"); 
 
     } 
 
    } 
 
    catch (MessagingException mex) 
 
    { 
 
     mex.printStackTrace(); 
 
     System.out.println("Error: SimpleEmail.SendEmail() = Caught MessagingException: " + mex.toString()); 
 
     return "Error: SimpleEmail.SendEmail() = Caught MessagingException: " + mex.toString(); 
 
    } 
 
    return this.SUCESS_MESSAGE; 
 
}

所以,當我從一個JSP叫我可以看到從MyMimeMessage類兩個打印語句

<%@ page import="com.ifx.framework.SimpleEmail" %> 
 
<% 
 
     String toAddr = request.getParameter("emailAddr"); 
 
     String mid = request.getParameter("customID"); 
 
     String SMTP_CLIENT = "myserver.mydomain.com"; 
 

 
     String body = "Hi " + toAddr + "!<br>Today we are testing to see if the setting messageID to " + mid + " works!"; 
 

 
     String sendResult = "No Email Sent"; 
 
     if(toAddr != null) 
 
     { 
 
     SimpleEmail se = new SimpleEmail(); 
 
     se.addTo(toAddr); 
 
     se.setSubject("Testing Headers"); 
 
     se.setSmtpClient(SMTP_CLIENT); 
 
     se.setFrom("[email protected]"); 
 
     se.setBody(body); 
 
     se.setMessageID(mid); 
 
     sendResult = se.sendEmail(); 
 
     } 
 
%> 
 
<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
     <title> 
 
     Test Page 
 
     </title> 
 
     <style> 
 
     label { 
 
      width: 200px; 
 
      display: inline-block; 
 
      margin-bottom: 5px; 
 
     } 
 
     </style> 
 
    </head> 
 
    <body> 
 
     <p style="background-color: #ADD8E6; border: solid 2px #000080;"> 
 
     <%=sendResult%> 
 
     </p> 
 
     <form action="#" method="post"> 
 
     <label for=emailAddr>Email Address:</label><input id="emailAddr" name="emailAddr" type="email"/> <br> 
 
     <label for=customValue>Custom Message ID:</label><input id="customID" name="customID" type="text"/> <br> 
 
     <input type="submit" value="Submit"/> 
 
     </form> 
 
    </body> 
 
</html>

在我的日誌中我看到:

Calling updateMessage() 
RETURNING THE new ID: [email protected] 

當我檢查生成的電子郵件時,標題中的Message-ID與設置的內容匹配。

這裏是我的問題所在,當我運行獨立版本時,它仍然發送電子郵件,但不調用updateMessageID方法,並且不打印出調試語句。

import com.ifx.framework.SimpleEmail; 
 

 
public class headerTest 
 
{ 
 
    public static void main(String args[]) 
 
    { 
 
     String toAddr = args[0]; 
 
     String mid = args[1]; 
 
     String SMTP_CLIENT = "myserver.mydomain.com"; 
 

 
     String body = "Hi " + toAddr + "!<br>Today we are testing to see if the header message id is retained"; 
 

 
     String sendResult = "No Email Sent"; 
 
     if(toAddr != null) 
 
     { 
 
     SimpleEmail se = new SimpleEmail(); 
 
     se.addTo(toAddr); 
 
     se.setSubject("Testing Headers"); 
 
     se.setSmtpClient(SMTP_CLIENT); 
 
     se.setFrom("[email protected]"); 
 
     se.setBody(body); 
 
     se.setMessageID(mid); 
 
     sendResult = se.sendEmail(); 
 
     } 
 
     System.out.println("Done!"); 
 
    } 
 
}

,我得到的唯一的輸出,當我運行是這樣的:

Done! 

,而我期待

Calling updateMessage() 
RETURNING THE new ID: [email protected] 
Done! 

我有我的整個團隊(包括系統管理員)難住這個問題。任何和所有的建議將不勝感激!

回答

0

這聽起來像你正在測試兩臺不同的服務器,所以我猜測他們正在使用不同版本的JavaMail。他們使用什麼版本? JavaMail debug output顯示什麼?