我正在处理一个项目,该项目需要加载传入的电子邮件,处理仅通过过滤条件的电子邮件,最后标记该电子邮件已经SEEN并修改学科。无法使用spring框架修改邮件(邮件接收)
有几个问题我无法弄清楚:
邮件过滤器表达式是不是为我工作。我想找出主题以“AAA”开头并且发件人的电子邮件为“[email protected]”的邮件。
这里是我的表情: “( '?。(我)AAA *' 主题相符)|( '?。(我)[email protected]' 发件人匹配)”
如何设置用户定义标志的方式非常慢。我必须从打开的文件夹中加载所有电子邮件,并找到与当前阅读消息的消息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();
}
}
我建议你在你的javamail属性中设置'mail.debug = true',看看它是否提供了任何线索。 – 2015-02-05 17:50:59
谢谢加里。我设置了mail.debug = true,但没有返回有用的信息。当我调用mail.saveChanges()时,没有例外,没有日志。我想那时候,文件夹已经关闭了,因此不会有任何更改会被应用。 – user1601373 2015-02-05 19:46:16