2015-02-05 121 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