SSRS 2016计划订阅偶发邮件发送SmtpException异常求助
报错信息:ERROR: Error sending email. Exception: System.Net.Mail.SmtpException: Failure sending mail. ---> System.IO.IOException: Authentication failed because the remote party has closed the transport stream.
根因说明
该报错本质是SSRS作为客户端向SMTP服务器发起连接时,双方TLS版本协商失败导致连接被中断,偶发成功是因为重试时恰好协商到了双方都支持的TLS版本。升级.NET Framework 4.8后未生效,是因为未配置.NET运行时的强TLS开关以及操作系统级的TLS协议优先级。
具体解决方案
1. 修改SSRS服务运行时配置
找到SSRS服务对应的配置文件,默认路径为:C:\Program Files\Microsoft SQL Server\MSRS13.MSSQLSERVER\Reporting Services\ReportServer\bin\ReportingServicesService.exe.config
注:如果SSRS为非默认实例,配置文件路径中的MSRS13.MSSQLSERVER需替换为你的实际实例名
在<configuration>根节点下添加如下配置段:
<runtime> <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false;Switch.System.Net.DontEnableSystemDefaultTlsVersions=false" /> </runtime>
保存配置后,重启SQL Server Reporting Services服务生效。
2. 操作系统级启用TLS 1.2强制配置
打开注册表编辑器,依次修改如下项:
- 64位.NET Framework 强TLS配置:定位到路径
HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319,新建两个DWORD(32位)值,SchUseStrongCrypto赋值为1,SystemDefaultTlsVersions赋值为1 - 32位.NET Framework 强TLS配置:定位到路径
HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319,新建和上述相同的两个DWORD值,赋值均为1 - Schannel层启用TLS 1.2客户端协议:定位到路径
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client(如果对应路径不存在则手动新建层级),新建两个DWORD值,DisabledByDefault赋值为0,Enabled赋值为1
所有注册表项修改完成后,重启Windows Server服务器生效。
3. 邮件服务侧适配验证
- 联系邮件服务器管理员确认服务端是否已禁用TLS 1.0/1.1,同时排查对应报错时段是否存在IP限流、连接数超限导致的主动断连情况
- 如果使用的是要求多重认证的邮件服务(如Office 365、企业自研邮件系统),需确认SSRS配置的发件人密码为服务专用的应用密码,而非账号的普通登录密码
内容的提问来源于stack exchange,提问作者mark jerrom

