我正在尝试使用IMAP协议从Exchange服务器读取邮件。我已经实现了代码。但是在执行代码时发生以下异常。偶然发生这种异常,我没有理解为什么会发生这种情况。
javax.mail.MessagingException:A3 BAD用户已通过身份验证但未连接。嵌套异常是:com.sun.mail.iap.BadCommandException:A3 BAD用户已通过身份验证但未连接。 at com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:958)at agent.client.attributeGroups.SendReceive.readMailAndReply(SendReceive.java:115)at agent.client.attributeGroups.MailQueue.calculateTime(MailQueue.java) :45)atat.client.MainClass $ 1.run(MainClass.java:72)at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)at java.util.concurrent.FutureTask.runAndReset(FutureTask .java:304)at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301(ScheduledThreadPoolExecutor.java:178)java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)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:745)
码:
Properties props = new Properties();
props.put("mail.imap.auth", "true");
props.put("mail.imap.ssl.enable", "true");
props.put("mail.imap.host", "outlook.office365.com");
props.put("mail.imap.port", "993");
props.put("mail.transport.protocol", "imap");
props.put("mail.imap.auth.plain.disable", true);
props.put("mail.imap.auth.ntlm.disable", true);
props.put("mail.imap.auth.gssapi.disable", true);
//Get session object by passing credentials.
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
mailId, mailPass);}});
//Creating IMAP store and connecting it to Mailbox using credentials.
store = session.getStore("imap");
store.connect(mailId, mailPass);
//Getting mailbox mails.
inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);
int totalMailCount = inbox.getMessageCount();
//Reading all mails to Message array.
Message[] messages = inbox.getMessages(1, totalMailCount);
for (Message mail : messages)
{
Address[] fromAddresses = mail.getFrom();
String mailFrom = fromAddresses[0].toString();
String mailSubject = mail.getSubject();
System.out.println(mailFrom);
System.out.println(mailSubject);
mail.setFlag(Flags.Flag.DELETED,true);
}
}
}
请建议我解决此异常的建议。
我的问题是因为我使用进程将电子邮件从收件箱移动到另一个不同的文件夹。我是分批进行的,因为移动大量的电子邮件会抛出Timeout异常,所以我尝试移动小的cquantities,我避免了Timeout异常但开始得到BadCommandException:A2 BAD User已经过身份验证但没有连接Exception。所以我看了一个对我有用的数量。我的想法基于这篇文章https://github.com/mscdex/node-imap/issues/689
我也遇到过这个问题你没有关闭连接,它总是处于打开状态。
如果您使用Store和Inbox,它始终经过身份验证但未连接它是身份验证成功但未连接,因为会话是天堂。
您需要在代码中添加以下行。
首先在阅读后关闭收件箱
inbox.close(真);
接下来关闭商店Connection
store.close();
如果正确关闭已建立的连接,则它将根据会话连接。
希望这对你真的很有帮助
IMAPS
我希望这些属性的片段可以帮助许多想要接收邮件的人。
sysProperties.put("mail.imap.starttls.enable", true);
MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
} catch (GeneralSecurityException e1) {
e1.printStackTrace();
}
sf.setTrustAllHosts(true);
sysProperties.setProperty("mail.imaps.auth.plain.disable", "true");
sysProperties.setProperty("mail.imaps.auth.ntlm.disable", "true");
sysProperties.put("mail.imap.ssl.socketFactory", sf);
sysProperties.setProperty("mail.imap.port", instance.getConfigPropertiesValue(configProperties, "mail.imap.port"));
sysProperties.setProperty("mail.imap.ssl.socketFactory.port", "993");
Session session = Session.getDefaultInstance(sysProperties, null);
Store store = null;
store = session.getStore("imaps");
store.connect("mail.serverhost", "mail.serverport"), "mail.username,"mail.password"));
它似乎是一个bug in the office365 server。它告诉你你的密码错了。