You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java连接Outlook邮箱遇javax.mail.AuthenticationFailedException求助

问题描述

我用下面的Java程序和配置读取Outlook收件箱失败了,程序在store.connect(imapHost,993, username, password)行抛出javax.mail.AuthenticationFailedException: AUTHENTICATE failed异常。试过把协议改成imaps也没用,调配置后还出现javax.mail.MessagingException: Connection dropped by server?错误,求解决。

程序代码

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Flags.Flag;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.MimeMessage;
import javax.mail.search.FlagTerm;

import org.apache.log4j.Logger;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Whitelist;

import com.nexera.blustream.batch.constants.CommonConstants;
import com.nexera.blustream.batch.entity.SubscriberDetails;

public class EmailScanner {

    private String protocol;
    private String imapHost;
    private String username;
    private String password;
    private String folderName;
    private String excelFilePath;

    Properties prop;
    InputStream inputStream = null;

    private static final Logger LOG = Logger.getLogger(EmailScanner.class);

    public EmailScanner() {
        try {
            prop = new Properties();
            String propFileName = "config.properties";
            prop.load(EmailScanner.class.getClassLoader()
                    .getResourceAsStream(propFileName));
            this.setProtocol(prop.getProperty("PROTOCOL"));
            this.setImapHost(prop.getProperty("IMAP_HOST"));
            this.setUsername(prop.getProperty("USERNAME"));
            this.setPassword(prop.getProperty("PASSWORD"));
            this.setFolderName(prop.getProperty("FOLDER_NAME"));
            this.setExcelFilePath(prop.getProperty("EXCEL_PATH"));
        } catch (Exception e) {
            LOG.error("Exception: " + e);
        }
    }

    /**
     * configureEmail() - used to connect to mailbox using properties mentioned
     * in config.properties.
     * passes the control to fetchUnReadMails.
     */
    public void configureEmail() {
        LOG.info("Entering method : configureEmail");
        // Download Attachment First
        Properties properties = new Properties();
        properties.setProperty("mail.store.protocol", this.getProtocol());
        properties.setProperty("mail.imap.partialfetch", "false");
        properties.put("mail.mime.base64.ignoreerrors", "true");
        properties.put("mail.imap.tls.enable", "true");
        properties.put("mail.imap.auth.plain.disable", "true");
        Folder inbox = null;
        Store store = null;
        Session session = null;
        try {
            LOG.info("Creating session for email with properties "
                    + properties.getProperty("mail.store.protocol"));

            session = Session.getDefaultInstance(properties, null);
            store = session.getStore(this.getProtocol());
            LOG.info("Checking if store is connected " + store.isConnected());
            if (!store.isConnected()) {
                LOG.info("Store not connected, connecting");
                try {
                    store.connect(imapHost,993, username, password);
                } catch (Exception ex) {
                    LOG.error("Exception caught while connecting : "
                            + ex.getMessage());
                }

            } else {
                LOG.info("Store already connected, reading emails");
            }

            LOG.info("Reading emails");
            inbox = store.getFolder(folderName);
            inbox.open(Folder.READ_WRITE);
            LOG.info("Opening Inbox in readWrite");
            fetchUnReadMails(inbox);

        } catch (MessagingException e) {
            LOG.error("Exception Thrown while reading mails :  " + e);
        } catch (Exception ex) {
            LOG.error("Exception Thrown  while reading mails : " + ex);
        } finally {

            if (inbox != null) {
                if (inbox.isOpen())
                    try {
                        inbox.close(true);
                    } catch (MessagingException e) {
                        LOG.error("Exception Thrown " + e.getMessage());
                    }
            }
            if (store != null) {
                if (store.isConnected())
                    try {
                        store.close();
                    } catch (MessagingException e) {
                        LOG.error(
                                "Unable to close the store " + e.getMessage());
                    }
            }
        }
        LOG.info("Exiting method : configureEmail");
    }

  public static void main(String[] args) {
        LOG.info("Starting Execution");
        EmailScanner emailBatchJob = new EmailScanner();
        emailBatchJob.configureEmail();
        LOG.info("Finished Execution");
    }
}

配置信息

# MAIL BOX DETAILS FOR READING
PROTOCOL=imap
IMAP_HOST=outlook.office365.com
USERNAME=subscriptions@test.com
PASSWORD=<password>
FOLDER_NAME=Inbox

异常信息

javax.mail.AuthenticationFailedException: AUTHENTICATE failed.
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:708)
    at javax.mail.Service.connect(Service.java:342)
    at javax.mail.Service.connect(Service.java:222)
    at javax.mail.Service.connect(Service.java:243)
    at com.email.demo.RetrieveEmailsUsingIMAP.getEmails(RetrieveEmailsUsingIMAP.java:46)
    at com.email.demo.RetrieveEmailsUsingIMAP.main(RetrieveEmailsUsingIMAP.java:241)
解决方案

针对Outlook 365的IMAP连接问题,按以下步骤排查修复:

  • 确认账号认证方式
    Outlook 365默认禁用普通密码认证,需启用应用专用密码:登录微软账号进入「安全设置」,开启两步验证后生成应用专用密码,替换配置里的PASSWORD值。若未开两步验证,可临时允许「不安全应用访问」(不推荐生产环境),或改用OAuth2认证。

  • 修正IMAP配置参数
    协议改为imaps,调整邮件属性:

    properties.setProperty("mail.store.protocol", "imaps");
    properties.put("mail.imaps.host", "outlook.office365.com");
    properties.put("mail.imaps.port", "993");
    properties.put("mail.imaps.starttls.enable", "true");
    properties.put("mail.imaps.auth", "true");
    // 移除mail.imap.auth.plain.disable配置,允许PLAIN认证
    

    连接简化为store.connect(username, password),无需手动指定端口(imaps默认993)。

  • 排查连接中断问题
    若出现连接被服务器断开,检查:是否有防火墙/代理拦截IMAPS端口993;邮件服务器是否限制IP访问;确保使用JavaMail API 1.6.2及以上版本,旧版本存在协议兼容性问题。

  • 代码优化点
    用Session.getInstance()替代Session.getDefaultInstance(),避免全局会话冲突;连接时单独捕获AuthenticationFailedException,精准定位认证问题。


内容的提问来源于stack exchange,提问作者suresh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:00:54