java发送邮件 不登陆_Java邮件到Exchange Server“不支持登录方法”

我正在尝试实现Java Mail servlet,第一步是连接到IMAP服务器。

我可以在端口143(默认IMAP端口)上telnet到服务器,telnet说:OK Microsoft Exchange IMAP4服务已准备就绪。

现在我尝试使用Java Mail API连接到服务器,如下所示:

Properties props = new Properties();

session = Session.getDefaultInstance(props, null);

store = session.getStore("imap");

store.connect("host","user","password");

而且我可以使用现有的Outlook Webapp连接到同一个服务器,并且使用与我在java中传递给它相同的凭据。

但是使用session.setDebug(true)运行此命令会产生以下输出:

DEBUG: setDebug: JavaMail version 1.4.5

DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc]

DEBUG: mail.imap.fetchsize: 16384

DEBUG: mail.imap.statuscachetimeout: 1000

DEBUG: mail.imap.appendbuffersize: -1

DEBUG: mail.imap.minidletime: 10

DEBUG: trying to connect to host "myHost", port 143, isSSL false

* OK The Microsoft Exchange IMAP4 service is ready.

A0 CAPABILITY

* CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED STARTTLS UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+

A0 OK CAPABILITY completed.

DEBUG: protocolConnect login, host=myHost, user=myUser, password=

javax.mail.MessagingException: No login methods supported!;

编辑:

我建议添加prop.setProperty(“mail.imap.starttls.enable”,“true”)。

但是,我开始得到这个调试输出:

DEBUG: setDebug: JavaMail version 1.4.5

DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc]

DEBUG: mail.imap.fetchsize: 16384

DEBUG: mail.imap.statuscachetimeout: 1000

DEBUG: mail.imap.appendbuffersize: -1

DEBUG: mail.imap.minidletime: 10

DEBUG: enable STARTTLS

DEBUG: trying to connect to host "myHost", port 143, isSSL false

* OK The Microsoft Exchange IMAP4 service is ready.

A0 CAPABILITY

* CAPABILITY IMAP4 IMAP4rev1 LOGINDISABLED STARTTLS UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+

A0 OK CAPABILITY completed.

DEBUG: protocolConnect login, host=myHost, user=myUser, password=

A1 STARTTLS

A1 OK Begin TLS negotiation now.

DEBUG IMAP: STARTTLS Exception: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

假设这是一个证书问题,我跟着these instructions,并将邮件服务器添加到我的cacerts文件。包含的测试程序完全正常,可以使用SSL网址进行连接,但运行Java邮件类时仍然有异常。

我也尝试改变为“imaps”与:session.getStore(“imaps”)(而不是“imap”),甚至不能得到“Microsoft Exchange Server现在就绪”消息。我想是因为当指定“imaps”时,它尝试连接端口993。但是使用telnet到端口993不显示与电子邮件服务器的任何连接。

那么接下来我试图强制程序在端口143上使用SSL,如下所示:

// Use SSL

prop.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

prop.setProperty("mail.imap.socketFactory.fallback", "false");

// Use port 143

prop.setProperty("mail.imap.port", "143");

prop.setProperty("mail.imap.socketFactory.port", "143");

只有收到这个异常,所以我不认为它需要与SSL有关:

DEBUG: mail.imap.fetchsize: 16384

DEBUG: mail.imap.statuscachetimeout: 1000

DEBUG: mail.imap.appendbuffersize: -1

DEBUG: mail.imap.minidletime: 10

DEBUG: trying to connect to host "myHost", port 143, isSSL false

Not able to process the mail reading.

javax.mail.MessagingException: Unrecognized SSL message, plaintext connection?;

上面的TLS异常(DEBUG IMAP:STARTTLS异常:javax.net.ssl.SSLHandshakeException :)是否来自Exchange Server上未启用的TLS?

我没有准备好访问电子邮件服务器,但我可能会让某人让我进入。

解:

HulkingUnicorn在他的答案下面的评论指出了this answer这是需要的确切处理。显然MS Exchange Server有这个问题。除了将答案中列出的类添加到我的包之外,我简单地实现了我这样的邮件连接,一切都很好:

Properties prop = new Properties();

prop.setProperty("mail.imap.starttls.enable", "true");

prop.setProperty("ssl.SocketFactory.provider", "my.package.name.ExchangeSSLSocketFactory");

prop.setProperty("mail.imap.socketFactory.class", "my.package.name.ExchangeSSLSocketFactory");

session = Session.getDefaultInstance(prop, null);

session.setDebug(true);

store = session.getStore("imap");

store.connect("myHost","myUser","myPassword");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值