Java Mail API连接smtp.office365.com时卡在220 2.0.0 SMTP server ready
解决Office 365 SMTP连接卡在"220 2.0.0 SMTP server ready"的问题
我来帮你搞定这个卡在Office 365 SMTP服务器就绪响应后的问题。从你贴的JavaMail调试日志来看,连接已经建立并收到了服务器的就绪信号,但后续流程卡壳了,通常这几个方向能解决问题:
1. 强制启用加密连接
Office 365的SMTP服务要求加密传输,默认的smtp协议(端口25)需要通过STARTTLS升级连接,或者直接使用smtps协议(端口587或465)。你需要在配置中明确添加加密相关属性:
// 方案1:使用smtp协议+STARTTLS(推荐端口587) props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.port", "587"); props.put("mail.smtp.auth", "true"); // 方案2:直接使用smtps协议(端口465) props.put("mail.transport.protocol", "smtps"); props.put("mail.smtps.port", "465"); props.put("mail.smtps.auth", "true");
2. 确保认证配置正确
Office 365要求严格的身份认证:
- 如果你的邮箱开启了多因素认证(MFA),不能直接用登录密码,必须使用应用专用密码
- 未开启MFA的账号可以直接使用登录密码
- 一定要在Session中传入认证信息:
Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("your-enterprise-email@domain.com", "your-password-or-app-password"); } });
3. 升级JavaMail版本
你当前使用的是JavaMail 1.5.1,这个版本比较老旧,可能和Office 365的最新SMTP协议支持存在兼容性问题。建议升级到最新的Jakarta Mail(原JavaMail)版本,比如2.0.x系列。以Maven依赖为例:
<dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> <version>2.0.1</version> </dependency>
4. 排查网络环境限制
很多企业内网的防火墙、代理会拦截SMTP流量,或者限制端口访问:
- 测试能否正常访问
smtp.office365.com的587或465端口(可以用telnet命令:telnet smtp.office365.com 587) - 检查是否需要配置代理服务器信息到JavaMail属性中:
props.put("mail.smtp.proxy.host", "your-proxy-host"); props.put("mail.smtp.proxy.port", "your-proxy-port");
5. 补全调试日志定位问题
你提供的日志被截断了,建议开启完整的调试模式,这样能看到后续是否发送了EHLO命令、服务器的响应细节,帮助精准定位卡壳点:
props.put("mail.debug", "true");
内容的提问来源于stack exchange,提问作者Tuhin Bagh
相关产品推荐
相关产品推荐

