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

SQL CLR存储过程调用Office365 SMTP发信失败 控制台程序正常

问题根因
  • 故障时间点与谷歌停用Gmail不安全SMTP访问仅为时间重合,二者无直接关联,实际触发原因是微软同期对Exchange Online(Office 365 SMTP服务)推送的两项强制安全策略正式生效,旧代码配置无法满足新的安全要求:
    1. 所有SMTP连接必须使用TLS 1.2及以上版本,直接拒绝TLS 1.0/1.1的连接请求
    2. 强制校验STARTTLS协商阶段的服务主体名称(SPN),SPN不匹配的连接会被服务端直接重置,返回net_io_connectionclosed错误
  • 代码本身存在三处适配缺陷:
    1. SmtpClient的TargetName属性配置错误:当前赋值为smtpServer变量,而Office 365 SMTP服务要求的固定SPN为SMTPSVC/smtp.office365.com。旧策略下服务端不严格校验SPN,错误配置不会触发故障,策略生效后会直接断开连接。如果使用企业自建SMTP中继对接Office365,将该值改为SMTPSVC/<你的SMTP中继域名>即可
    2. 未显式指定TLS协议版本:SQL Server托管的CLR运行在受限沙箱环境中,不会继承系统全局TLS配置,默认会优先使用旧版TLS 1.0/1.1协议,直接被Office 365服务拒绝
    3. 入参smtpPort未实际生效,代码硬编码写死Port = 587,后续端口调整时会直接触发连接错误
  • 控制台程序运行正常的原因:控制台程序运行在本地用户上下文,会自动继承系统默认启用的TLS 1.2配置,部分.NET Framework版本下SMTP组件会自动补全正确SPN,不受SQL CLR沙箱的权限和配置限制。
修复方案
  1. 调整CLR存储过程代码,修正核心配置,修改后的SmtpClient初始化逻辑如下:
// 显式指定使用TLS1.2,满足Office365安全要求
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

SmtpClient smtpClient = new SmtpClient
{
    Host = smtpServer,
    Port = smtpPort, // 移除硬编码,使用传入的端口参数
    UseDefaultCredentials = false,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    Credentials = new System.Net.NetworkCredential(smtpUser, smtpPassword),
    // 配置Office365 SMTP要求的正确SPN
    TargetName = "SMTPSVC/smtp.office365.com",
    EnableSsl = true
};
  1. 环境配置校验
    • 确认SQL Server所在服务器的.NET Framework版本支持TLS 1.2:.NET Framework 4.6及以上版本原生支持,低版本需要手动安装对应系统补丁
    • 确认SQL Server服务运行账号对系统机器证书存储有读取权限,避免STARTTLS阶段证书校验失败
    • 如果使用的Office365账号开启了多因素认证(MFA),不能直接使用账号登录密码,需要在Office365管理中心为该账号生成SMTP专用发送密码,替换原有密码配置
  2. CLR部署配置校验
    • 部署更新后的CLR程序集时,将程序集权限级别设置为EXTERNAL_ACCESS,SAFE权限级别下无法访问外部网络,也无法修改TLS相关全局网络配置
    • 若部署时提示权限不足,可将对应数据库的TRUSTWORTHY属性设置为ON,或通过非对称密钥为程序集授予对应外部访问权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:18:33