Java MimeMessage.saveChanges does not call updateMessageID

I am developing an application that needs to send an email via JavaMail with a specific message id.

I extended the Java MimeMessage class to override the updateMessageID method to set the message ID myself. The problem is that when I call Transport.send (msg) method it doesn't call updateMessageID method. I thought I needed to call the saveChanges () method before calling Transport.send (msg). Even when I explicitly call msg.saveChanges () it does not call the called updateMessageID method.

What's even weirder is that when I convert my test app to JSP and run it, the Transport.send (msg) method is called by the updateMessageID method.

Both my server and my webserver I tested on run jdk1.7.0_71.

Extended MimeMessage class

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 = "javamailuser@localhost"; // worst-case default
    }
	
    if(messageID == null)
    {
      messageID = "987654321";
    }
    StringBuffer s = new StringBuffer();
	
    // 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() {
	return id++;
}
}
      

Run code


I am calling this MimeMessageClass from a mail wrapper called SimpleEmail. It's basically a bunch of get / set functions. All the meat is in the sendEmail method ...

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

Run code


So when I call from the JSP, I can see two print statements from the MyMimeMessage class

<%@ 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("cms_zippylube@gointranet.com");
         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>
      

Run code


In my logs I see:

Calling updateMessage()
RETURNING THE new ID: 8675309.0.1430500125923.FDDMail.javamailuser@localhost

      

When I check the email I received, the message id in the header matches the set.

Here's my problem: when running the standalone version, it still sends an email, but does not call the updateMessageID method and does not output debug statements.

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("dummy@test.com");
         se.setBody(body);
         se.setMessageID(mid);
         sendResult = se.sendEmail();
      }
      System.out.println("Done!");
   }
}
      

Run code


The only output I get on startup is:

Done!

      

whereas i expect

Calling updateMessage()
RETURNING THE new ID: 8675309.0.1430500125923.FDDMail.javamailuser@localhost
Done!

      

I have my entire team (sysadmin included) stumped on this issue. Any and all suggestions would be greatly appreciated!

+3


source to share


1 answer


It looks like you are testing two different servers, so I am assuming they are using different versions of JavaMail. What versions are they using? What does JavaMail's debug output show ?



0


source







All Articles