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

JavaMail账号密码连接Outlook365失败,寻求非XOAUTH读邮件方案

账号密码方式连接Outlook365读取邮件的问题及替代方案咨询

我需要通过账号密码(非XOAUTH方式)连接Outlook365仅读取邮件,用于集成开发。已尝试多种Java 17代码均未成功,相关代码如下:


2023年11月19日更新

@MAX回复称此方式不可行。

因此想咨询:

  • 是否存在其他可通过账号密码程序化登录的邮箱,且能在Java中正常使用?
  • 能否在主邮箱中设置规则,将邮件自动转发至另一支持程序化访问的邮箱?例如:Outlook收到邮件后自动转发至Yahoo,再通过Java访问Yahoo邮箱(但目前Yahoo的第三方访问流程已禁用)。

MailConnector.java

package br.com.myproject.utils;

import java.util.Properties;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;

public class MailConnector {

    static String user = "myEmailFromCompanyOffice365Enterprise";
    static String senha = "password";
    
    
    public static void connect() throws Exception {
        
    
        Properties prop = new Properties();
        prop.setProperty("mail.imap.starttls.enable", "true");
        prop.setProperty("ssl.SocketFactory.provider", "mypackage.utils.ExchangeSSLSocketFactory");
        prop.setProperty("mail.imap.socketFactory.class", "mypackage.utils.ExchangeSSLSocketFactory");
        prop.setProperty("mail.store.protocol", "imap");
        prop.setProperty("mail.imap.ssl.enable", "true");
      
          //prop.setProperty("mail.imaps.partialfetch", "false");
          //添加此行报A3错误,移除此行报A1错误

        Session session = Session.getDefaultInstance(prop, null);
        session.setDebug(true);
        Store store = session.getStore("imap");

        store.connect("outlook.office365.com", user, senha);

        Folder folder = store.getFolder("INBOX");
        folder.open(Folder.READ_ONLY);

        System.out.println("Total Message:" + folder.getMessageCount());
        System.out.println("Unread Message:" + folder.getUnreadMessageCount());

        Message messages[] = folder.getMessages();

        for (Message mail : messages) {

            System.out.println("*********************************");
            System.out.println("MESSAGE : \n");

            System.out.println("Subject: " + mail.getSubject());
            System.out.println("From: " + mail.getFrom()[0]);
            System.out.println("To: " + mail.getAllRecipients()[0]);
            System.out.println("Date: " + mail.getReceivedDate());
            System.out.println("Size: " + mail.getSize());
            System.out.println("Flags: " + mail.getFlags());
            System.out.println("ContentType: " + mail.getContentType());
            System.out.println("*******************************");

        }
    }

    public static void main(String[] args) throws Exception {
        connect();
    }
}

ExchangeSSLSocketFactory.java

package br.com.myproject.utils;

import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.*;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class ExchangeSSLSocketFactory extends SSLSocketFactory {

private SSLSocketFactory sslSocketFactory;
private SocketFactory socketFactory;

public ExchangeSSLSocketFactory() {
    try {
        socketFactory = SocketFactory.getDefault();

        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, new TrustManager[] { new EmptyTrustManager() }, null);
        sslSocketFactory = (SSLSocketFactory)context.getSocketFactory();
    }
    catch (Exception e) {
        throw new RuntimeException(e);
    }
}

private final class EmptyTrustManager implements X509TrustManager {
    public void checkClientTrusted(X509Certificate[] cert, String authType) throws CertificateException {}

    public void checkServerTrusted(X509Certificate[] cert, String authType) throws CertificateException {}

    public X509Certificate[] getAcceptedIssuers() {
        return new java.security.cert.X509Certificate[0];
    }
}

public static SocketFactory getDefault() {
    return new ExchangeSSLSocketFactory();
}

@Override
public Socket createSocket(Socket socket, String s, int i, boolean flag) throws IOException {
    return sslSocketFactory.createSocket(socket, s, i, flag);
}

@Override
public Socket createSocket(InetAddress inaddr, int i, InetAddress inaddr1, int j) throws IOException {
    return socketFactory.createSocket(inaddr, i, inaddr1, j);
}

@Override
public Socket createSocket(InetAddress inaddr, int i) throws IOException {
    return socketFactory.createSocket(inaddr, i);
}

@Override
public Socket createSocket(String s, int i, InetAddress inaddr, int j) throws IOException {
    return socketFactory.createSocket(s, i, inaddr, j);
}

@Override
public Socket createSocket(String s, int i) throws IOException {
    return socketFactory.createSocket(s, i);
}

@Override
public Socket createSocket() throws IOException {
    return socketFactory.createSocket();
}

@Override
public String[] getDefaultCipherSuites() {
    return sslSocketFactory.getSupportedCipherSuites();
}

@Override
public String[] getSupportedCipherSuites() {
    return sslSocketFactory.getSupportedCipherSuites();
}

}

若有人了解相关协议,或能提供可行的集成方案(必须使用账号密码,不可用XOAUTH),将不胜感激。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:07:11