我正在尝试使用IMAP协议从Exchange服务器读取邮件。我已经实现了代码。但是在执行代码时发生以下异常。偶然发生这种异常,我没有理解为什么会发生这种情况。
javax.mail.MessagingException:A3 BAD用户已通过身份验证但未连接。 嵌套异常是: com.sun.mail.iap.BadCommandException:A3 BAD用户已通过身份验证但未连接。 在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) at agent.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) at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) 在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);
}
}
}
请建议我解决此例外的建议。
答案 0 :(得分:1)
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"));
答案 1 :(得分:1)
我的问题是因为我使用一个过程将电子邮件从收件箱移动到另一个不同的文件夹。我分批执行此操作,因为移动大量电子邮件会引发Timeout异常,因此我尝试移动较小的数量,并且避免了Timeout异常,但开始获取BadCommandException:A2 BAD用户已通过身份验证,但未连接Exception。所以我看对我有用的数量。我从这篇文章中得到了想法 https://github.com/mscdex/node-imap/issues/689
这是Microsoft用来关闭聊天客户端的机制。的 解决方案是减少登录该帐户的频率。
这是由于IMAP实现中的错误所致。如果客户端提供的用户名有效但密码无效,则服务器 接受登录,但是随后的命令失败,并且 上述错误消息。
这是一个共享邮箱,并且您使用的登录方案不正确。将Username @ DomainName \ SharedMailboxAlias用于O365
答案 2 :(得分:0)
它似乎是bug in the office365 server。它告诉你密码错误。
答案 3 :(得分:0)
我也遇到过这个问题 您没有关闭连接,它始终处于打开状态。
如果您使用Store和Inbox,它始终经过身份验证但未连接 它是成功的身份验证,但没有连接,因为会话是天堂。
您需要在代码中添加以下行。
首先在阅读后关闭收件箱
<强> inbox.close(真); 强>
接下来关闭商店连接
<强> store.close(); 强>
如果您正确关闭已建立的连接,则它将根据会话连接。
希望这对你有用