2017-02-13 47 views
0

代码设置页眉无法从多部分消息自定义标题在Java邮件

Message msg = new MimeMessage(session); 

if (fromName != null) { 
    addressFrom = new InternetAddress(fromAddress, fromName); 
} else { 
    addressFrom = new InternetAddress(fromAddress); 
} 

msg.setFrom(addressFrom); 

InternetAddress[] addressTo = new InternetAddress[1]; 

addressTo[0] = new InternetAddress(recipient.trim().replace(" ", "+")); 

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

msg.addFrom(InternetAddress.parse(from)); 

msg.setSubject(subject); 

InternetAddress[] replyTo = new InternetAddress[1]; 

replyTo[0] = new InternetAddress(replyAddress.trim().replace(" ", "+")); 

msg.setReplyTo(replyTo); 

Multipart multipart = new MimeMultipart("alternative"); 

if (plainMsg != null) { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    messageBodyPart.setContent(plainMsg, "text/plain ; charset=UTF-8"); 
    multipart.addBodyPart(messageBodyPart); 
} 

BodyPart messageBodyPart = new PreencodedMimeBodyPart("base64"); 
messageBodyPart.setHeader("charset", "utf-8"); 
messageBodyPart.setContent(htmlMsg, "text/html ; charset=UTF-8"); 
multipart.addBodyPart(messageBodyPart); 
msg.setContent(multipart); 
msg.setHeader("Precedence", "bulk"); 
msg.addHeader("trackerid", trackerId); 
msg.addHeader("emailMarketingid", emailMarketingid); 

我已经加入trackerid和emailMarketingid作为header.They也出现在Gmail邮件标题,但在获取收件箱我不能够获得这些标题。 下面的代码来获取标题 -

   Object content = message.getContent(); 
       String line = null; 
       String bounceStatus = ""; 
       String bounceReason = ""; 
       String trackerid = ""; 
       String emailMarketingid = ""; 
       BufferedReader bufReader = null; 
       if (content instanceof String) { 
        bufReader = new BufferedReader(new StringReader(message.getContent().toString())); 
        while ((line = bufReader.readLine()) != null) { 
         if (line.contains("trackerid")) { 
          trackerid = line.split(":")[1]; 
         } 
         if (line.contains("emailMarketingid")) { 
          emailMarketingid = line.split(":")[1]; 
         } 
         bounceStatus = get_status_code_from_text(line, bounceStatus); 
         bounceReason = line; 
        } 
       } else if (content instanceof Multipart) { 
        MimeMultipart mp = (MimeMultipart) (Multipart) content; 
        for (int j = 0; j < mp.getCount(); j++) { 
         bufReader = new BufferedReader(new StringReader(getTextFromMimeMultipart(mp))); 
         while ((line = bufReader.readLine()) != null) { 
          if (line.contains("trackerid")) { 
           trackerid = line.split(":")[1]; 
          } 
          if (line.contains("emailMarketingid")) { 
           emailMarketingid = line.split(":")[1]; 
          } 
          bounceStatus = get_status_code_from_text(line, bounceStatus); 
          bounceReason = line; 
         } 
        } 
       } 


String result = ""; 
int count = mimeMultipart.getCount(); 
for (int i = 0; i < count; i++) { 
    BodyPart bodyPart = mimeMultipart.getBodyPart(i); 
    if (bodyPart.isMimeType("text/plain")) { 
     result = result + "\n" + bodyPart.getContent(); 
     break; // without break same text appears twice in my tests 
    } else if (bodyPart.isMimeType("text/html")) { 
     String html = (String) bodyPart.getContent(); 
     result = result + "\n" + org.jsoup.Jsoup.parse(html).text(); 
    }else if (bodyPart.isMimeType("multipart/alternative")) { 

     Multipart mp = (Multipart) bodyPart.getContent(); 
     int partsCount = mp.getCount(); 
     for(int j=0;j<partsCount;j++){ 
      result= result +(String) mp.getBodyPart(j).getContent(); 
      Enumeration e = mp.getBodyPart(j).getAllHeaders(); 
      while (e.hasMoreElements()) { 
       Header h = (Header) e.nextElement(); 
       System.out.println("Name : " + h.getName() + " Value : " + h.getValue()); 
      } 
     } 
    }else if (bodyPart.isMimeType("multipart/mixed")) { 

     Multipart mp = (Multipart) bodyPart.getContent(); 
     int partsCount = mp.getCount(); 
     result= result +(String) mp.getBodyPart(partsCount - 1).getContent(); 

    }else if (bodyPart.getContent() instanceof MimeMultipart) { 
     result = result + getTextFromMimeMultipart((MimeMultipart) bodyPart.getContent()); 
    } 
} 

回答

0

标头是不是在消息内容。使用getHeader方法读取标题。

+0

已经尝试getHeader方法,该方法是给空值 – user3816288

+0

什么的[JavaMail的调试输出(http://www.oracle .com/technetwork/java/javamail/faq/index.html#debug)显示何时使用getHeader?如果你使用'msg.writeTo(new FileOutputStream(“msg.txt”));'你看到msg.txt文件中的头文件吗? –

0

尝试枚举所有多部分内容类型的标头。

bodyPart.isMimeType( “多部分/ *”)

Enumeration headers = part.getAllHeaders(); 
while (headers.hasMoreElements()) { 
    Header h = (Header) headers.nextElement(); 
     if ("trackerid".equals(h.getName())) { 
      log.info(h.getName() + ": " + h.getValue()); 
     } 
    }