Serilog WriteTo.Email() 失败

Tom*_*gan 2 c# serilog mailkit .net-core .net-6.0

这是一个使用 Serilog.Sinks.Email 2.4.0 的 .Net Core 6 控制台应用程序。在同一个项目中,我引用了 MailKit 3.1.0 Nuget 包。我注意到 Serilog.Sinks.Email 还引用了 Mailkit 3.1.0。

我正在像这样配置记录器。我的目标是让 Serilog 在调用 Log.Fatal() 时发送电子邮件:

.WriteTo.Email(  
    new EmailConnectionInfo()
    {
        FromEmail = _appSettings.EmailFrom,
        ToEmail = _appSettings.EmailToOnError,
        MailServer = _appSettings.EmailHost,
        EmailSubject = $"Runtime error starting {_appSettings.ApplicationName}",
        ServerCertificateValidationCallback = (s, c, h, e) => true
    },
    restrictedToMinimumLevel: LogEventLevel.Fatal);
Run Code Online (Sandbox Code Playgroud)

我将 Serilog 消息记录到调试输出窗口,如下所示,这样我就可以看到 Serilog 本来(按设计)吞咽的错误消息:

Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));
Run Code Online (Sandbox Code Playgroud)

当我调用 Log.Fatal(),然后立即调用 Log.CloseAndFlush(),并查看“调试输出”窗口时,我可以看到 Serilog 尝试向我发送电子邮件,但失败了,说它找不到 MailKit 方法.MailTransport.SendAsync()。知道我缺少什么吗?以下是调试输出窗口中的完整错误消息:

Exception while emitting periodic batch from 
Serilog.Sinks.PeriodicBatching.PeriodicBatchingSink: System.MissingMethodException: 
Method not found: 'System.Threading.Tasks.Task 
MailKit.MailTransport.SendAsync(MimeKit.MimeMessage, System.Threading.CancellationToken, 
MailKit.ITransferProgress)'.
   at Serilog.Sinks.Email.EmailSink.EmitBatchAsync(IEnumerable`1 events)
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine] 
   (TStateMachine& stateMachine)
   at Serilog.Sinks.Email.EmailSink.EmitBatchAsync(IEnumerable`1 events)
   at Serilog.Sinks.PeriodicBatching.PeriodicBatchingSink.OnTick()
Run Code Online (Sandbox Code Playgroud)

jst*_*ast 5

MailKit 的 SmtpClient.SendAsync() 方法在 2.x 和 3.0 之间更改了其 API 签名。曾经回归Task,现在回归Task<string>

这会导致针对 2.x 构建的库无法在 3.0(或 3.1)程序集中找到该方法。

将您的 MailKit 降级到 2.15(或 2.15.1),它可能会起作用。

  • @TomRegan [Serilog.Sinks.Email](https://github.com/serilog/serilog-sinks-email/blob/dev/src/Serilog.Sinks.Email/Serilog.Sinks.Email.csproj)引用`MailKit 2.6 `。什么 `Serilog.Sinks.xxx` 引用了 `MailKit 3+`?FWIW,我刚刚遇到了同样的问题,并将 MailKit 的直接引用从 3+ 降级到 2.15;除了返回类型差异和一些新的“IDisposables”之外,回滚工作没有问题。 (4认同)