2013-05-20 32 views
0

我想修改或删除“Message-ID”标头时,回复一封带有Javamail的电子邮件。经过一番研究,我发现我需要创建一个扩展MimeMessage的自定义类。这是我创建的课程。Javamail回复删除或修改消息ID标头

import javax.mail.MessagingException; 
import javax.mail.Session; 
import javax.mail.internet.MimeMessage; 

class MyMessage extends MimeMessage 
{ 

    public MyMessage(Session session) 
    { 
     super(session); 
    } 

    @Override 
    protected void updateMessageID() throws MessagingException { 
     removeHeader("Message-Id"); 
    } 

} 

下面的代码与获取消息

public List<EmailSenderInfo> checkEmail() throws Exception 
{ 
    String host = "HOST"; 
    String username = "MYUSERNAME"; 
    String password = "MYPASS"; 

    List<EmailSenderInfo> emailSenderList = new ArrayList<EmailSenderInfo>(); 

    Properties properties = System.getProperties(); 
    properties.setProperty("mail.store.protocol", "imaps"); 
    Session session = Session.getDefaultInstance(properties); 

    Store store = session.getStore("imaps"); 
    store.connect(host, username, password); 

    /* 
    * Folder[] f = store.getDefaultFolder().list(); for (Folder fd : f) 
    * System.out.println(">> " + fd.getName()); 
    */ 
    Folder folder = store.getFolder("INBOX"); 

    if (!folder.exists()) 
    { 
     System.out.println("No INBOX..."); 
     System.exit(0); 
    } 
    folder.open(Folder.READ_WRITE); 
    Message[] msg = folder.getMessages(); 

    if (msg.length < 1) 
    { 
     System.out.println("No new messages!"); 
     throw new Exception("No new messages!"); 
    } 

    for (int i = 0; i < msg.length; i++) 
    { 
     if (!msg[i].isSet(Flag.SEEN)) 
     { 
      EmailSenderInfo emailSenderInfo = new EmailSenderInfo(); 
      emailSenderInfo.message = msg[i]; 
      System.out.println("------------ Message " + (i + 1) + " ------------"); 

      // String from = InternetAddress.toString(msg[i].getFrom()); 
      Address[] fromArray = msg[i].getFrom(); 
      InternetAddress fromInternetAddress = (InternetAddress) fromArray[0]; 
      String from = fromInternetAddress.getAddress(); 
      String fromName = fromInternetAddress.getPersonal(); 

      if (fromName != null) 
      { 
       emailSenderInfo.fromName = fromName; 
      } 

      if (from != null) 
      { 
       // System.out.println("From: " + from); 
       emailSenderInfo.from = from; 
      } 

      // String replyTo = InternetAddress.toString(msg[i].getReplyTo()); 
      Address[] replyToArray = msg[i].getFrom(); 
      InternetAddress ReplyToInternetAddress = (InternetAddress) replyToArray[0]; 
      String replyTo = ReplyToInternetAddress.getAddress(); 
      String replyToName = ReplyToInternetAddress.getPersonal(); 

      if (replyTo != null) 
      { 
       // System.out.println("Reply-to: " + replyTo); 
       emailSenderInfo.replyTo = replyTo; 
      } 

      if (replyToName != null) 
      { 
       // System.out.println("Reply-to: " + replyTo); 
       emailSenderInfo.replyToName = replyToName; 
      } 

      String to = InternetAddress.toString(msg[i].getRecipients(Message.RecipientType.TO)); 
      if (to != null) 
      { 
       // System.out.println("To: " + to); 
       emailSenderInfo.to = to; 
      } 

      String subject = msg[i].getSubject(); 
      if (subject != null) 
      { 
       // System.out.println("Subject: " + subject); 
       emailSenderInfo.subject = subject; 
      } 

      Date sentDate = msg[i].getSentDate(); 
      if (sentDate != null) 
      { 
       System.out.println("Sent: " + sentDate); 
       emailSenderInfo.sentDate = sentDate; 
      } 

      String bodyHtml = ""; 

      // get content 
      Multipart multipart = (Multipart) msg[i].getContent(); 
      for (int x = 0; x < multipart.getCount(); x++) 
      { 

       BodyPart bodyPart = multipart.getBodyPart(x); 

       String disposition = bodyPart.getDisposition(); 

       if (Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) 
       { 
        // dealing with attachments only 
        System.out.println("Mail has some attachment : "); 
        DataHandler handler = bodyPart.getDataHandler(); 
        System.out.println("file name : " + handler.getName()); 
        System.out.println("ddddd: " + bodyPart.getContent().toString()); 
       } 
       else 
       { 
        String classType = bodyPart.getContent().getClass().toString(); 

        if (classType.contains("java.lang.String")) 
        { 
         bodyHtml = bodyPart.getContent().toString(); 
        } 
        else if (classType.contains("javax.mail.internet.MimeMultipart")) 
        { 
         MimeMultipart bodyContent = (MimeMultipart) bodyPart.getContent(); 
         for (int b = 0; b < bodyContent.getCount(); b++) 
         { 
          IMAPBodyPart imapBody = (IMAPBodyPart) bodyContent.getBodyPart(b); 
          System.out.println("1: " + imapBody.getContent()); 
          bodyHtml = imapBody.getContent().toString(); 
          // System.out.println("2: " + bodyContent.getBodyPart(b)); 
          // System.out.println("3: " + bodyPart.getContent().toString()); 
         } 
        } 
       } 
       emailSenderInfo.bodyHtml = bodyHtml; 
      } 


      MyMessage reply = (MyMessage) msg[i].reply(false); 
      emailSenderInfo.reply = reply; 
      // reply.setFrom(msg[i].getFrom()[0]); 
      MimeMessage orig = (MimeMessage) msg[i]; 
      StringBuffer buffer = new StringBuffer("Thanks\n\n"); 
      if (orig.isMimeType("text/plain")) 
      { 
       String content = (String) orig.getContent(); 
       StringReader contentReader = new StringReader(content); 
       BufferedReader br = new BufferedReader(contentReader); 
       String contentLine; 
       while ((contentLine = br.readLine()) != null) 
       { 
        buffer.append("> "); 
        buffer.append(contentLine); 
        buffer.append("\r\n"); 
       } 
      } 
      // Set the reply content 
      // reply.setText(buffer.toString()); 
      // emailSenderInfo.reply = reply; 

      emailSenderList.add(emailSenderInfo); 
      // System.out.println(); 
     }// end if unread 
    } 
    folder.close(true); 
    store.close(); 

    return emailSenderList; 
} 

我在我的程序的两种方法。其中一人检查邮件,另一人回复邮件。

Message reply = msg[i].reply(false); 

“答复”与其他参数一起传递给此方法。

我必须使用MyMessage类来删除“Message-ID”标题。我曾尝试以下

MyMessage mimeReply = (MyMessage) reply; 

但我得到的运行时出现以下错误

java.lang.ClassCastException: javax.mail.internet.MimeMessage cannot be cast to javamailer.MyMessage 

如何使用“MyMessage”类,所以我可以回复邮件删除“邮件ID”头?

+0

考虑加入,你读消息从会议 –

回答

0

你可以尝试以下方法:

在答复邮件:

当你创建一个消息创建,现在它应该是这样的:

MimeMessage msg = new MimeMessage(session); 

将其更改为,

MyMessage msg = new MyMessage(session); 

当检查电子邮件您不必删除标题,该消息已经在邮箱,我认为你需要做的是在该实例回复时邮件的名称邮件实例化,如:

MyMessage msg = new MyMessage(session); 
msg.updateMessageID(); 

既然你使用参考现有的消息:

你可以这样做:

创建一个新的构造:

public MyMessage (MimeMessage message) { 
    super(message); 
} 

回答时:

MyMessage mimeReply = new MyMessage(reply); 
mimeReply.updateMessageID(); 

然后发送mimeReply NOT回复。

+0

不幸的是我得到了同样的错误消息 – Arya

+0

你可以发布的代码,你在哪里得到的异常,后堆栈跟踪太 –

+0

我已经编辑职位,包括对checkEmail那部分代码()方法。这就是你的建议后我改变了“MyMessage reply =(MyMessage)msg [i] .reply(false);”这就是错误发生的地方。 – Arya