我正在开发一个项目,该项目需要加载传入的电子邮件,处理仅通过过滤条件的电子邮件,最后标记电子邮件已被查看并修改主题。
我无法弄清楚有几个问题:
mail-filter-expression对我不起作用。我想查找主题以“AAA”开头的邮件,发件人的邮箱是“BBB@gmail.com”。
这是我的表达:
“(主题匹配'(?i)AAA。*')|(发件人匹配'(?i)。 BBB@gmail.com。')”
如何设置用户定义标志的方式非常慢。我必须从打开的文件夹中加载所有电子邮件,并找到与当前阅读邮件的消息ID匹配的电子邮件。有没有更好更快的方法呢?
弹簧的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();
}
}
答案 0 :(得分:0)
公用文件夹协议(IMAP,POP3)不允许您修改邮件。您可以使用IMAP设置SEEN标志,但访问该消息通常会自动为您设置。根据您尝试更改主题的原因,您最好在邮件上设置用户定义的标记。如果您确实需要更改主题,则需要使用MimeMessage复制构造函数复制邮件,修改副本,将副本附加到文件夹,然后删除原始文件。
此外,您上面的代码似乎使用的是与您要打开的文件夹无关的Message对象。你不应该这样做。关闭文件夹后,该文件夹中的所有Message对象都无效。如果您重新打开文件夹,则需要获取与您正在处理的邮件相对应的新邮件对象(例如,通过使用邮件的UID查找)。