AspNet Core应用配置Serilog邮件Sink无法发送邮件,求排查
我之前配置Serilog邮件日志的时候也踩过类似的坑,结合你的代码和Gmail SMTP的特性,给你梳理几个关键排查方向:
先确认Serilog.Email Sink包已安装
这个邮件输出组件不是Serilog核心自带的,一定要通过NuGet安装Serilog.Sinks.Email包。如果没装,代码不会报错,但邮件发送的逻辑根本不会执行——这是很多人一开始容易忽略的点。重点检查Gmail的SMTP安全配置
Gmail现在对SMTP登录的限制非常严格,普通密码基本无法直接使用:- 如果你开启了两步验证,必须创建应用专用密码(App Password),用这个密码替换你配置里的
Password,普通账号密码会被直接拒绝。 - 确认
NetworkCredentials.UserName是你的完整Gmail地址(比如xxx@gmail.com),而不是代码里的user——这个小细节错了的话,认证肯定失败。 - 现在Gmail已经移除了“允许不太安全的应用”选项,所以两步验证+应用专用密码是目前唯一可行的SMTP登录方式。
- 如果你开启了两步验证,必须创建应用专用密码(App Password),用这个密码替换你配置里的
验证是否真的触发了Error级别的日志
你的配置里限制了只有LogEventLevel.Error及以上级别的日志才会发邮件,所以先手动触发一条错误日志测试:Log.Error("测试邮件发送的错误日志");运行程序后,先确认这条日志已经写入了文件,再去查邮件——如果连文件里都没有这条错误日志,那根本不会触发邮件逻辑。
开启Serilog的SelfLog查看内部错误
Serilog默认不会输出自身的运行错误,你可以在初始化Logger之前加上这行代码,查看邮件发送时的异常信息:Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));运行后看控制台输出,就能直接看到是认证失败、连接超时还是其他问题,这是定位问题最快的方法。
核对SMTP配置细节
你的代码里EnableSsl = true、Port = 587是正确的Gmail SMTP配置,但可以再检查:FromEmail是不是和NetworkCredentials.UserName一致?Gmail一般要求发件人账号和登录账号匹配。batchPostingLimit = 1是正确的(有一条错误就发邮件),不需要调整,但可以暂时去掉restrictedToMinimumLevel,用Info级别的日志测试,排除级别限制的问题。
测试SMTP连接的可用性
可以用Telnet或者SMTP测试工具,先验证你的Gmail账号能不能通过smtp.gmail.com:587正常发送邮件,排除网络环境或者账号本身的问题。比如用Telnet连接后,输入EHLO localhost,再尝试AUTH LOGIN,输入用户名和应用专用密码的Base64编码,看能不能认证成功。
按照这些步骤排查,基本就能找到问题所在了——我之前就是因为没使用应用专用密码,折腾了好久才搞定。
内容的提问来源于stack exchange,提问作者Evgeni

