2015-12-19 46 views
2

我一直在做計數的電子郵件是閱讀 - 收到,NotRead,AutoReplied,離開辦公室,回覆交付和未交付的郵件與下面的代碼。但我想要電子郵件郵件未送達的ID。java- undelivered郵件:獲取哪些電子郵件未收到的電子郵件ID

要獲取未交付的郵件的電子郵件,我可以通過分析該電子郵件的內容去做,但是這將是非常漫長的task.Please幫助我更好的解決方案

 JSONObject jo = new JSONObject(); 
     JSONArray dataCollection = new JSONArray(); 
     JSONObject data = null; 
     try { 

      Session session = Session.getDefaultInstance(props, null); 
      Store store = session.getStore("imaps"); 

      store.connect(props.getProperty("mail.smtp.host"), userid, password); 

      Folder inbox = store.getFolder("inbox"); 
      inbox.open(Folder.READ_WRITE); 
      int countDelivered = 0; 
      int countUndelivered = 0; 
      int countRead = 0; 
      int countAutoReply = 0; 
      int countUnRead = 0; 
      int countReplied = 0; 

      jo.put("TotalMessage", inbox.getMessageCount()); 

      Message[] messages = inbox.getMessages(0,50); 

      for (Message message : messages) { 

       boolean undelMsgs = message.getFrom()[0].toString().contains("Mail Delivery") 
         || message.getFrom()[0].toString().contains("Postmaster") 
         || message.getFrom()[0].toString().contains("Failed") 
         || message.getFrom()[0].toString().contains("Failure") 
         || message.getSubject().contains("(Failure)") 
         || message.getSubject().contains("Undeliverable:"); 

       boolean readMsgs = message.getSubject().contains("Read:") 
         && !message.getSubject().contains("Not read:") 
         && !message.getSubject().contains("Un-Read:") 
         && !message.getSubject().contains("UnRead:") ; 

       boolean unreadMsgs = message.getSubject().contains("Un-Read:") 
         || message.getSubject().contains("UnRead:") 
         || message.getSubject().contains("Not read:"); 

       boolean autoReply = message.getSubject().contains("Automatic") 
         || message.getSubject().contains("Reply:") 
         || message.getSubject().contains("[Auto-Reply]") 
         || message.getSubject().contains("Out of Office"); 

       boolean replied = message.getSubject().contains("RE:"); 
       data = new JSONObject(); 

       if (undelMsgs) 
        countUndelivered++; 
       else 
        countDelivered++; 

       if (readMsgs) 
        countRead++; 
       if (unreadMsgs) 
        countUnRead++; 

       if (autoReply) 
        countAutoReply++; 

       if (replied) 
        countReplied++; 
       data = new JSONObject(); 
       data.put("subject=", message.getAllHeaders()); 
       data.put("from=", message.getFrom()[0]); 

       dataCollection.put(data); 
      } 

      inbox.close(true); 
      System.out.println("Done...."); 
      store.close(); 
      data = new JSONObject(); 
      data.put("Delivered=", countDelivered); 
      data.put("Undelivered=", countUndelivered); 
      data.put("Read=", countRead); 
      data.put("AutoReply=", countAutoReply); 
      data.put("Replied=", countReplied); 
      data.put("UnRead=", countUnRead); 

      dataCollection.put(data); 

      jo.put("tableData", dataCollection); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return jo; 

你會發現這個代碼很威利和目的導向,但爲了獲得這一點,我也沒有任何可用的在線解決方案。

+0

message.getHeader(「X-Failed-Recipients」)是一個解決方案 –

回答

1

不幸的是,這沒有黃金法則。這取決於失敗的SMTP服務器選擇將您發回的內容。

但還有希望:MultipartReport

如果你得到的這個保持你的消息內的其他SMTP選擇添加(至少的頭)的原始郵件,你可以使用這種方法訪問它:

for (Message message : messages) { 
    if(message instanceof MimeMessage) { 
     MimeMessage mime = (MimeMessage)message; 
     Object content = mime.getContent(); 
     if(content instanceof MultipartReport) { 
      MultipartReport dsn = (MultipartReport)content; 
      MimeMessage m = dsn.getReturnedMessage(); 
      if(m != null) { 
       String originalMessageId = m.getMessageID(); 
       //TADAA! 
      } 
     } 
    } 
    } 

在所有其他情況下,您必須訴諸其他想法。

  • 的MultiPartReport.getReport()可能是一個DeliveryNotification和頭可能包含您的郵件,身份證原件,信封-ID字段。

  • 也許有一個「In-Reply-To」標題?

  • 也許有一個「參考」標題?

兩者都可以包含您的原始消息ID。但甚至可能沒有設置,所以你可能只是在解析報告文本本身。

+0

我可以發送我自己的消息ID來標識回覆和通知,就像回覆哪個郵件是 –

+0

在這裏檢查如何獲取消息ID:http ://stackoverflow.com/a/8366888/3480246。實際上,你可以在send()之後使用getMessageID()並存儲該值, – Jan

相關問題