Ray*_*Ray 2 java email spring spring-integration gmail-imap
我花了一天时间试图找到一些解释这个例外.我尝试配置ImapMailReceiver和ImapIdleChannelAdapter programmatic.
我没有在Pro Spring Integration书中找到关于这个问题的任何教程.
public void loadMessages() {
ImapIdleChannelAdapter imapIdleChannelAdapter = null;
ImapMailReceiver imapMailReceiver = null;
try {
imapMailReceiver = new ImapMailReceiver("imaps://" + URLEncoder.encode(USERNAME, "UTF-8") + ":" + PASSWORD + "@imap.gmail.com:993/INBOX");
imapMailReceiver.setShouldMarkMessagesAsRead(true);
imapMailReceiver.setShouldDeleteMessages(false);
Properties javaMailProperties = new Properties();
javaMailProperties.put(MAIL_IMAP_SOCKET_FACTORY_CLASS, environment.getProperty(MAIL_IMAP_SOCKET_FACTORY_CLASS, SOCKET_FACTORY_CLASS));
javaMailProperties.put(MAIL_IMAP_SOCKET_FACTORY_FALLBACK, environment.getProperty(MAIL_IMAP_SOCKET_FACTORY_FALLBACK, Boolean.class, SOCKET_FACTORY_FALLBACK));
javaMailProperties.put(MAIL_STORE_PROTOCOL, environment.getProperty(MAIL_STORE_PROTOCOL, INBOX_MAIL_PROTOCOL));
javaMailProperties.put(MAIL_DEBUG, environment.getProperty(MAIL_DEBUG, Boolean.class, MAIL_DEBUG_VAL));
imapMailReceiver.setJavaMailProperties(javaMailProperties);
imapMailReceiver.setJavaMailAuthenticator(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(USERNAME, PASSWORD);
}
});
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(environment.getProperty(RECEIVE_MESSAGE_POOL_SIZE, Integer.class, DEFAULT_RECEIVE_MESSAGE_POOL_SIZE));
threadPoolTaskScheduler.afterPropertiesSet();
DirectChannel directChannel = new DirectChannel();
directChannel.subscribe(new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws org.springframework.messaging.MessagingException {
LOGGER.info("Message: " + message);
}
});
imapIdleChannelAdapter = new ImapIdleChannelAdapter(imapMailReceiver);
imapIdleChannelAdapter.setAutoStartup(true);
imapIdleChannelAdapter.setShouldReconnectAutomatically(true);
imapIdleChannelAdapter.setTaskScheduler(threadPoolTaskScheduler);
imapIdleChannelAdapter.setOutputChannel(directChannel);
imapIdleChannelAdapter.start();
} catch (IllegalStateException iex){
LOGGER.debug("Receiving messages failed", iex);
iex.printStackTrace();
imapIdleChannelAdapter.stop();
try{
imapMailReceiver.destroy();
} catch (Exception ex){
LOGGER.debug("Impossible destroy imapMailReceiver", ex);
ex.printStackTrace();
}
} catch (UnsupportedEncodingException uex) {
LOGGER.debug("UnsupportedEncoding Exception", uex);
uex.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我的堆栈跟踪
09:13:27,429 INFO ImapMailReceiver:251 - attempting to receive mail from folder [INBOX]
09:13:34,840 WARN ImapIdleChannelAdapter:230 - error occurred in idle task
javax.mail.MessagingException: A13 NO STORE attempt on READ-ONLY folder (Failure) [THROTTLED];
nested exception is:
com.sun.mail.iap.CommandFailedException: A13 NO STORE attempt on READ-ONLY folder (Failure) [THROTTLED]
at com.sun.mail.imap.IMAPMessage.setFlags(IMAPMessage.java:858)
at javax.mail.Message.setFlag(Message.java:574)
at org.springframework.integration.mail.AbstractMailReceiver.setMessageFlags(AbstractMailReceiver.java:317)
at org.springframework.integration.mail.AbstractMailReceiver.postProcessFilteredMessages(AbstractMailReceiver.java:283)
at org.springframework.integration.mail.AbstractMailReceiver.receive(AbstractMailReceiver.java:272)
at org.springframework.integration.mail.ImapIdleChannelAdapter$IdleTask.run(ImapIdleChannelAdapter.java:216)
at org.springframework.integration.mail.ImapIdleChannelAdapter$ReceivingTask.run(ImapIdleChannelAdapter.java:184)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Run Code Online (Sandbox Code Playgroud)
我也找到了这样的决定
http://harikrishnan83.wordpress.com/2009/01/24/access-gmail-with-imap-using-java-mail-api/ http://metoojava.wordpress.com/2010/03/21/java-码到接收邮件,使用-javamailapi /
但我无法理解为什么人们使用这种方式来获取消息(这个决定的主要来源因为我甚至无法在Spring Pro Integration和Spring文档中找到这种类型的解决方案)
请,任何人都可以解释我1)在这种情况下,我应该使用ImapIdleChannelAdapter,当只是Session获取存储和连接到邮箱.2)为什么我现在得到"READ-ONLY文件夹上的NO STORE尝试"异常
你应该打电话imapMailReceiver.afterPropertiesSet(),哪个开关this.folderOpenMode = Folder.READ_WRITE;.在你的情况下,它看起来在这里:
imapMailReceiver.setJavaMailAuthenticator(new Authenticator() {
...
});
imapMailReceiver.afterPropertiesSet();
Run Code Online (Sandbox Code Playgroud)
实际上几乎所有的Spring Integration组件都应该配置为Spring bean,而Container会关注它们的初始化.新的4.0版本为JavaConfig提供了足够的选项:https://spring.io/blog/2014/04/30/spring-integration-4-0-released .
我不清楚为什么默认情况下Folder.READ_ONLY并且没有关于此问题的制定者.
随意提出JIRA问题:https://jira.spring.io/browse/INT
在这种情况下,我应该使用ImapIdleChannelAdapter,当只是Session获取存储和连接到邮箱.
实际上这取决于您的邮件提供商.Spring Integration提供了两个组件:Pop3MailReceiver和ImapMailReceiver.当然Imap更好,因为它不会将消息提取到本地目录并支持Listener.Pop3你应该定期ping.
| 归档时间: |
|
| 查看次数: |
2063 次 |
| 最近记录: |