javax.mail.MessagingException:A3 BAD用户已通过身份验证但未连接

问题描述 投票:3回答:4

我正在尝试使用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);

                   }                       
                }

             }

请建议我解决此异常的建议。

javamail exchange-server office365
4个回答
2
投票

我的问题是因为我使用进程将电子邮件从收件箱移动到另一个不同的文件夹。我是分批进行的,因为移动大量的电子邮件会抛出Timeout异常,所以我尝试移动小的cquantities,我避免了Timeout异常但开始得到BadCommandException:A2 BAD User已经过身份验证但没有连接Exception。所以我看了一个对我有用的数量。我的想法基于这篇文章https://github.com/mscdex/node-imap/issues/689

  1. 这是微软关闭聊天客户端的机制。解决方案是不太频繁地登录此帐户。
  2. 这是由于IMAP实施中的一个错误。如果客户端提供有效的用户名但密码无效,则服务器接受登录,但后续命令将失败,并显示上述错误消息。
  3. 它是一个共享邮箱,您使用的登录方案不正确。 O53使用Username @ DomainName \ SharedMailboxAlias

1
投票

我也遇到过这个问题你没有关闭连接,它总是处于打开状态。

如果您使用Store和Inbox,它始终经过身份验证但未连接它是身份验证成功但未连接,因为会话是天堂。

您需要在代码中添加以下行。

首先在阅读后关闭收件箱

inbox.close(真);

接下来关闭商店Connection

store.close();

如果正确关闭已建立的连接,则它将根据会话连接。

希望这对你真的很有帮助


1
投票
  • 首先,您应该检查mail.imap.host值是否等同于电子邮件地址的服务器。 If you use outlook OC
  • 如果为true,则可以尝试将协议更改为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"));

0
投票

它似乎是一个bug in the office365 server。它告诉你你的密码错了。

© www.soinside.com 2019 - 2024. All rights reserved.