You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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场景:

  1. 安装NuGet包:Install-Package MailKit
  2. 使用以下代码发送邮件:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:36:13