改成O365邮件服务器后SSRS报订阅错误

SSRS Report subscription error after change to O365 mail server

我们有一个订阅,它会向每位顾问发送一封邮件,告知他们未来几周的计划。 两周前,我们已经从本地邮件服务器更改为 O365 邮件服务器。 自此更改以来,我注意到一些顾问没有收到他们应该收到的邮件。 这让我查看了 RS 日志,两周前我有 6 个人没有收到他们的电子邮件,而上周是 9。 我检查了他们邮件地址中的任何拼写错误的数据,但一切都很好,因为我没有更改设置的这一部分(当我们仍然有本地邮件服务器时,这工作正常)。

    notification!WindowsService_1!24f8!03/26/2021-16:00:13:: i INFO: Notification 84547a5f-930f-45e6-8085-0e738664c590 completed.  Success: True, Status: Mail sent to a********.d******@*******.com, DeliveryExtension: Report Server Email, Report: OPS Individual Planning For Subscription, Attempt 0
emailextension!WindowsService_1!1a38!03/26/2021-16:00:13:: e 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.
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
   at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Mail.SmtpConnection.Flush()
   at System.Net.Mail.ReadLinesCommand.Send(SmtpConnection conn)
   at System.Net.Mail.EHelloCommand.Send(SmtpConnection conn, String domain)
   at System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint)
   at System.Net.Mail.SmtpClient.GetConnection()
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   --- End of inner exception stack trace ---
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at Microsoft.ReportingServices.EmailDeliveryProvider.EmailProvider.Deliver(Notification notification)
notification!WindowsService_1!1a38!03/26/2021-16:00:13:: e ERROR: Error occurred processing subscription 4ee16cfe-5e77-4da9-8433-d62a99d11ea2: Failure sending mail: Failure sending mail.

在第一行你可以看到一个成功的操作,但是之后你可以看到一个失败。 “身份验证失败,因为远程方已关闭传输流” 截至上周,我们还为 SQL Server 2016 SP2 运行 CU15。

从我在网上找到的是它与TLS相关,但我已经检查过这个并且在我们的案例中检查了1.2。另外,如果它是 TLS,我会觉得有点奇怪,因为这是一个浏览器设置,订阅由 SQL 服务器本身管理。

如果有人对此有解决方案,请告诉我!

亲切的问候, 凯文

我遇到了同样的问题和同样的错误消息。根据评论,我也对为什么有些电子邮件失败而其他电子邮件失败感到困惑。

this article 解释原因:

Starting in September 2021, we will reject a small percentage of connections that use TLS1.0 for SMTP AUTH. Clients should retry as with any other temporary errors that can occur during submission. Over time we will increase the percentage of rejected connections, causing delays in sending that more and more customers should notice

您确定已设置 TLS 1.2 吗?

我可以确认,根据我对 SEarle1986 的回答的评论,Microsoft guide on enable TLS 1.2 解决了我的 SSRS 服务器问题。

我验证了安装我的 SSRS 实例(不是数据库*)的服务器只有 .NET Framework 版本 4.5,并且我有待处理的 Windows 更新以将其升级到 4.8。

我还必须遵循 Configure for strong cryptography 部分并将推荐的注册表项添加到我的服务器。完成这两件事并重新启动服务器后,我所有的 SSRS 订阅电子邮件又恢复正常了。

因为这是一个间歇性的问题,并且一些电子邮件已经发送出去,所以我能够在修复之前查看其中一封电子邮件中的 header 并确认它使用的是 TLS 1.0(header 表示“TLS1_0”)。修复后,我订阅的所有电子邮件在 header.

中都有 TLS 1.2(现在说“TLS1_2”)