.NET Core项目服务器端Gmail邮件发送失败问题求助
解决.NET Core项目在服务器上无法通过Gmail发送邮件的问题
问题分析
本地运行正常,服务器上587端口TCP连接失败,465端口能连通但改代码后仍无法发送,核心问题在于:
- 服务器网络策略/防火墙封禁了587端口(STARTTLS端口)
- 465端口(Implicit SSL)的代码配置不符合Gmail要求,且
System.Net.Mail.SmtpClient对Implicit SSL的支持存在局限性
解决方案
1. 修正465端口的代码配置
System.Net.Mail.SmtpClient默认针对587的STARTTLS设计,使用465时需要显式指定SSL协议,并确保配置正确:
using (var message = new MailMessage()) { message.From = new MailAddress(mailSender); message.To.Add(toAddress); message.Subject = subject; message.Body = body; var pdfAttachment = new Attachment(new MemoryStream(pdfBytes), fileName); pdfAttachment.ContentType = new System.Net.Mime.ContentType("application/pdf"); message.Attachments.Add(pdfAttachment); using (var smtpClient = new SmtpClient("smtp.gmail.com", 465)) { smtpClient.Credentials = new NetworkCredential(mailSender, passwordSender); smtpClient.EnableSsl = true; // 指定符合Gmail要求的SSL协议 smtpClient.SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls13; smtpClient.UseDefaultCredentials = false; await smtpClient.SendMailAsync(message); } }
注意:必须设置UseDefaultCredentials = false,否则会覆盖你的专用密码配置。
2. 改用MailKit(推荐方案)
System.Net.Mail.SmtpClient在.NET Core中已被标记为过时,MailKit对SMTP协议的支持更稳定,尤其是Implicit SSL场景:
- 安装NuGet包:
Install-Package MailKit - 使用以下代码发送邮件:
using MailKit.Net.Smtp; using MimeKit; var message = new MimeMessage(); message.From.Add(new MailboxAddress("Sender Name", mailSender)); message.To.Add(new MailboxAddress("Recipient Name", toAddress)); message.Subject = subject; var bodyBuilder = new BodyBuilder { TextBody = body, Attachments = { new MemoryStream(pdfBytes), fileName, ContentType.Parse("application/pdf") } }; message.Body = bodyBuilder.ToMessageBody(); using (var client = new SmtpClient()) { // 连接465端口(Implicit SSL) await client.ConnectAsync("smtp.gmail.com", 465, true); await client.AuthenticateAsync(mailSender, passwordSender); await client.SendAsync(message); await client.DisconnectAsync(true); }
3. 服务器侧排查
- 确认服务器出站规则允许访问
smtp.gmail.com的465端口 - 检查服务器上的安全软件(如防火墙、杀毒软件)是否拦截了SMTP请求
- 添加try-catch块捕获异常并记录详细日志,排查无有效报错的问题:
try { // 邮件发送代码 } catch (Exception ex) { // 记录ex.Message、ex.StackTrace等详细信息 Console.WriteLine($"发送邮件失败:{ex.Message}\n{ex.StackTrace}"); }
内容的提问来源于stack exchange,提问作者Andrea Palermo
相关产品推荐
相关产品推荐

