无法使用spring框架修改电子邮件(邮件接收)

时间:2015-02-05 17:00:10

标签: spring email javamail spring-integration email-integration

我正在开发一个项目,该项目需要加载传入的电子邮件,处理仅通过过滤条件的电子邮件,最后标记电子邮件已被查看并修改主题。

我无法弄清楚有几个问题:

  1. mail-filter-expression对我不起作用。我想查找主题以“AAA”开头的邮件,发件人的邮箱是“BBB@gmail.com”。

    这是我的表达:

    “(主题匹配'(?i)AAA。*')|(发件人匹配'(?i)。 BBB@gmail.com。')”

  2. 如何设置用户定义标志的方式非常慢。我必须从打开的文件夹中加载所有电子邮件,并找到与当前阅读邮件的消息ID匹配的电子邮件。有没有更好更快的方法呢?

  3. 弹簧的context.xml         

        <int-mail:imap-idle-channel-adapter id="customAdapter"
                                            store-uri="imaps://XXXX:XXXX@imap.gmail.com: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).*BBB@gmail.com.*')"/>/>
    
        <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();
            }
        }
    

1 个答案:

答案 0 :(得分:0)

公用文件夹协议(IMAP,POP3)不允许您修改邮件。您可以使用IMAP设置SEEN标志,但访问该消息通常会自动为您设置。根据您尝试更改主题的原因,您最好在邮件上设置用户定义的标记。如果您确实需要更改主题,则需要使用MimeMessage复制构造函数复制邮件,修改副本,将副本附加到文件夹,然后删除原始文件。

此外,您上面的代码似乎使用的是与您要打开的文件夹无关的Message对象。你不应该这样做。关闭文件夹后,该文件夹中的所有Message对象都无效。如果您重新打开文件夹,则需要获取与您正在处理的邮件相对应的新邮件对象(例如,通过使用邮件的UID查找)。