2015-02-05 105 views
1

我正在處理一個項目,該項目需要加載傳入的電子郵件,處理僅通過過濾條件的電子郵件,最後標記該電子郵件已經SEEN並修改學科。無法使用spring框架修改郵件(郵件接收)

有幾個問題我無法弄清楚:

  1. 郵件過濾器表達式是不是爲我工作。我想找出主題以「AAA」開頭並且發件人的電子郵件爲「[email protected]」的郵件。

    這裏是我的表情: 「( '?。(我)AAA *' 主題相符)|( '?。(我)[email protected]' 發件人匹配)」

  2. 如何設置用戶定義標誌的方式非常慢。我必須從打開的文件夾中加載所有電子郵件,並找到與當前閱讀消息的消息ID匹配的電子郵件。有沒有更好更快的方法來做到這一點?

彈簧的context.xml

<int-mail:imap-idle-channel-adapter id="customAdapter" 
             store-uri="imaps://XXXX:[email protected]:993/inbox" 
             channel="receiveChannel" 
             auto-startup="true" 
             should-delete-messages="false" 
             should-mark-messages-as-read="true" 
             java-mail-properties="mailProperties" 
             mail-filter-expression="(subject matches '(?i)AAA.*')|(sender matches '(?i).*[email protected]*')"/>/> 

    <bean id="mailReceiver" class="com.mfr.email.EmailReceiver"/> 
    <int:service-activator input-channel="receiveChannel" ref="mailReceiver" method="process"/> 

EmailReceiver.java

public void process(Message message) { 
     System.out.println("Got mail match with filter criteria!"); 
     try { 
      String subject = message.getSubject(); 
      ......... 

     Folder folder = message.getFolder(); 
      folder.open(Folder.READ_WRITE); 
      String messageId = ((MimeMessage)message).getMessageID(); 

      Message[] messages = folder.getMessages(); 
      FetchProfile contentsProfile = new FetchProfile(); 
      contentsProfile.add(FetchProfile.Item.ENVELOPE); 
      contentsProfile.add(FetchProfile.Item.CONTENT_INFO); 
      contentsProfile.add(FetchProfile.Item.FLAGS); 
      folder.fetch(messages, contentsProfile); 
      for (int i = 0; i < messages.length; i++) { 
       Message loopMsg = messages[i]; 
       String loopMsgId = ((MimeMessage)loopMsg).getMessageID(); 

       if (loopMsgId.equals(messageId)) { 
        Flags processedFlag = new Flags(); 
        processedFlag.add(Flags.Flag.ANSWERED); 
        processedFlag.add(Flags.Flag.SEEN); 
        loopMsg.setFlags(processedFlag, true); 

        break; 
       } 
      } 

      folder.expunge(); 
      folder.close(true); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
+0

我建議你在你的javamail屬性中設置'mail.debug = true',看看它是否提供了任何線索。 – 2015-02-05 17:50:59

+0

謝謝加里。我設置了mail.debug = true,但沒有返回有用的信息。當我調用mail.saveChanges()時,沒有例外,沒有日誌。我想那時候,文件夾已經關閉了,因此不會有任何更改會被應用。 – user1601373 2015-02-05 19:46:16

回答

0

公共文件夾的協議(IMAP,POP3)不允許你修改的消息。您可以使用IMAP設置SEEN標誌,儘管訪問該消息通常會自動爲您設置。根據您嘗試更改主題的原因,您最好在郵件上設置用戶定義的標誌。如果確實需要更改主題,則需要使用MimeMessage複製構造函數複製消息,修改副本,將副本追加到文件夾,然後刪除原始副本。

此外,上面的代碼似乎使用與您打開的文件夾無關的消息對象。你不應該那樣做。關閉文件夾後,該文件夾中的所有消息對象都將無效。如果重新打開文件夾,則需要獲取與正在處理的消息相對應的新Message對象(例如,通過使用消息的UID查找它)。

+0

謝謝比爾。用戶定義的標誌比改變整個主題更好。但是要做到這一點,需要做些什麼才能做到這一點?我嘗試了以下代碼,但仍然無法正常工作。我錯過了什麼嗎? \t標誌processedFlag =新標誌(「已處理」); \t mail.setFlags(processedFlag,true); \t mail.saveChanges(); – user1601373 2015-02-05 19:37:16

+0

你是否解決了我描述的其他問題?另外,您不需要saveChanges調用。 – 2015-02-06 00:27:53

+0

是的,我修復了其他問題。現在我可以設置SEEN和用戶定義的標誌。我也意識到使用IMAP自動設置SEEN標誌是個好主意。但我需要先使用imap-idle-channel-adapter.mail-filter-expression來實現過濾規則。我該如何編寫這樣的表達式:主題以「客戶查詢」開頭,發件人電子郵件爲###@gmail.com。 是否這樣? mail-filter-expression =「(subject matches'(?i)Customer inquiry。*')(sender matches'(?i)。* ### @ gmail.com。*')「我不熟悉正則表達式請幫忙 – user1601373 2015-02-06 16:18:41