2013-05-30 51 views
0

我正在使用Java邮件1.4.6来读取和解析Gmail邮箱的邮件。但问题是,当我绑解析emaill主题(例如主题字符串“建设失败詹金斯:appanalyti X»appanalyti X#51" )的声明使用java邮件在java中解析电子邮件主题的错误

String subjectStr=(String) mimeMessage.getSubject();

我越来越

subjectStr as“Jenkins的构建失败:appanaltix»appanal”而不是 “Jenkins的构建失败:appanalyti x»appanalyti x#51”。

我可以知道我哪里出错了吗?需要它来解码主题串

代码:

public boolean parseEmailSubject(String host,String userName,String password,String configurationStringToCheck,String saveDirectory){ 
.... 
Session session = Session.getDefaultInstance(properties); 
     try { 
      IMAPSSLStore store = (IMAPSSLStore)session.getStore(IMAP); 
      store.connect(host, userName, password) ; 
      Folder folderInbox =store.getFolder(IMAP_FOLDER); 
      folderInbox.open(Folder.READ_ONLY); 
      Message[] arrayMessages = folderInbox.getMessages(); 
      for (int i = 0; i < arrayMessages.length; i++) { 
       MimeMessage message = (MimeMessage) arrayMessages[i]; 
       ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
       message.writeTo(bos); 
       bos.close(); 
       SharedByteArrayInputStream bis =new SharedByteArrayInputStream(bos.toByteArray()); 
       MimeMessage cmsg = new MimeMessage(session, bis); 
       bis.close(); 

       String megSubject = cmsg.getSubject(); 
       if(megSubject.contains(configurationStringToCheck)){ 
        String contentType = cmsg.getContentType(); 

        if (contentType.contains(IMAP_CONTENT_TYPE)) { 
         Multipart multiPart = (Multipart) cmsg.getContent(); 
         int numberOfParts = multiPart.getCount(); 
         for (int partCount = 0; partCount < numberOfParts; partCount++) { 
          MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount); 
          if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) { 
           String fileName = part.getFileName(); 
           part.saveFile(saveDirectory + File.separator + fileName); 
          } 
         } 
        } 
        return true; 

       } 

      } 
      folderInbox.close(false); 
      store.close(); 

     }catch (Exception e) { 
     } 
} 

电子邮件样本 (以下主题行) 构建失败詹金斯:appanalyti X»appanalyti X#51

(下面身体部分) 变更:


< === [JENKINS远程处理CAPAC ITY] ===>频道开始 log4j:WARN记录器(org.apache.commons.beanutils.converters.BooleanConverter)找不到appender。 log4j:WARN请正确初始化log4j系统。

+0

我们可以看到您的代码和电子邮件示例(没有任何私人数据)吗? – Djon

+0

我编辑了上面的代码并添加了邮件样本 – user2215139

回答

0

的JavaMail你的主题进行解码。当然,如果主题编码不正确,它不会正确解码。

Subject标题中的原始文本是什么?

什么是JavaMail调试输出显示?

+0

“在Jenkins中构建失败:appanalyti x»appanalyti x#51”。这是我的主题包含和输出我得到的是“建设失败詹金斯:appanalytix»appanal”,当我运行junit测试用例我得到currect主题内容。 – user2215139

+0

是你从[msg.getHeader(“Subject”,null)](https://javamail.java.net/nonav/docs/api/javax/mail/internet/MimeMessage.html#getHeader(java) .lang.String,%20java.lang.String))?再一次,调试输出显示了什么? –

0

,如果你使用Gmail服务器,那么这是最好的代码只需输入您的用户名和密码,并运行它

import java.util.Properties; 

import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class SendMail { 

    public static void main(String[] args) { 

     final String username = "username"; 
     final String password = "fghdf"; 

     Properties props = new Properties(); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.smtp.starttls.enable", "true"); 
     props.put("mail.smtp.host", "smtp.gmail.com"); 
     props.put("mail.smtp.port", "587"); 

     Session session = Session.getInstance(props, 
      new javax.mail.Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(username, password); 
      } 
      }); 

     try { 

      Message message = new MimeMessage(session); 
      message.setFrom(new InternetAddress("username")); 
      message.setRecipients(Message.RecipientType.TO, 
       InternetAddress.parse("to email is")); 
      message.setSubject("Testing Subject"); 
      message.setText("Dear user ," 
       + "\n\n your username is xxx and pasword is yyy"); 

      Transport.send(message); 

      System.out.println("Done"); 

     } catch (MessagingException e) { 
      throw new RuntimeException(e); 
     } 
    } 
}