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

Java Mail使用smtp.office365.com 587端口发送带附件邮件异常

问题根因

报错和邮件附件本身没有关系,核心是SMTP配置存在TLS连接模式和端口的逻辑冲突,带附件时触发了新建连接的逻辑才把问题暴露出来。
具体冲突逻辑:

  • smtp.office365.com的587端口是标准的STARTTLS端口:TCP连接建立后先走明文协议交互,客户端发送STARTTLS指令得到服务端确认后,才会切换到TLS加密通道。
  • 配置中指定了mail.smtp.socketFactory.class为javax.net.ssl.SSLSocketFactory,会强制客户端在TCP连接刚建立时就直接发起SSL握手,完全跳过明文交互和STARTTLS指令发送步骤。Office365服务端此时还在等待明文SMTP命令,收到SSL握手的二进制报文会直接返回明文错误响应,客户端尝试把这段明文响应当成SSL协议报文解析,就会抛出Unsupported or unrecognized SSL message异常。
  • 无附件邮件能正常发送是因为JavaMail对小体积邮件会复用已建立的合法连接,不会触发新建连接的错误逻辑;Gmail的SMTP服务端对这类异常握手的容错性更高,所以相同配置没有报错。
修复方法

删除所有和自定义SocketFactory相关的错误配置即可,这些配置是给465端口的直连SSL(SMTPS)模式用的,和587端口的STARTTLS模式不兼容。修正后的配置代码如下:

Properties props = new Properties();
props.put("mail.smtp.host", "smtp.office365.com");
props.put("mail.smtp.port", "587");        
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.ssl.protocols","TLSv1.2");

补充注意点:

  • 如果后续要改用465端口走直连SSL模式,才需要添加SocketFactory相关配置,同时要关闭STARTTLS配置、开启mail.smtp.ssl.enable参数。
  • 如果调整配置后出现认证失败报错,需要检查对应Office365账号是否开启了多因素认证,开启状态下需要使用应用专用密码,或者替换为OAuth2认证方式,这类问题和当前SSL连接报错无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:18:07