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
相关产品推荐
相关产品推荐

