ASP.NET项目中生成的邮件确认token未发送到用户邮箱问题
问题根因
你当前贴出的代码仅完成了邮箱确认token生成、确认链接拼接、日志写入三步操作,没有包含任何调用SMTP服务发送邮件的逻辑,邮件根本没有被发出,自然不存在被邮箱服务商拒收的情况,这是最核心的问题。
修复步骤
首先补全邮件发送逻辑,这里给出两种实现参考:
1. 临时测试简单实现(不推荐生产环境使用)
在你打日志的代码后补充以下发信逻辑:
// 需提前引入System.Net.Mail和System.Net命名空间 using var smtpClient = new SmtpClient("smtp.gmail.com", 587) { Credentials = new NetworkCredential("你的发信邮箱地址", "你的邮箱应用专用密码"), EnableSsl = true }; var mailContent = new MailMessage { From = new MailAddress("你的发信邮箱地址"), Subject = "账号邮箱确认", Body = $"<p>请点击以下链接完成邮箱验证:<a href=\"{confirmationLink}\">确认邮箱</a></p>", IsBodyHtml = true }; mailContent.To.Add(user.Email); await smtpClient.SendMailAsync(mailContent);
2. 生产环境推荐实现
使用官方推荐的MailKit库实现发信,避免原生SmtpClient的兼容与安全问题:
- 先通过NuGet安装
MailKit和MimeKit包 - 发信示例代码:
using MimeKit; using MailKit.Net.Smtp; var message = new MimeMessage(); message.From.Add(new MailboxAddress("站点名称", "你的发信邮箱地址")); message.To.Add(new MailboxAddress("", user.Email)); message.Subject = "账号邮箱确认"; message.Body = new TextPart("html") { Text = $"<p>请点击以下链接完成邮箱验证:<a href=\"{confirmationLink}\">确认邮箱</a></p>" }; using var client = new SmtpClient(); await client.ConnectAsync("smtp.gmail.com", 587, MailKit.Security.SecureSocketOptions.StartTls); await client.AuthenticateAsync("你的发信邮箱地址", "你的邮箱应用专用密码"); await client.SendAsync(message); await client.DisconnectAsync(true);
发信逻辑补全后仍收不到的排查方向
- 邮箱权限配置问题:Gmail自2022年起已完全停止支持「低安全性应用访问」开关,需要先给谷歌账号开启两步验证,随后在账号安全页面生成应用专用密码,用该密码作为SMTP认证密码而非账号主密码;Outlook邮箱同理,需要使用应用专用密码认证。
- 网络与端口问题:确认服务器/本地开发环境的587端口未被防火墙、运营商拦截,也可尝试切换465端口(SSL加密)测试。
- 反垃圾规则拦截:确保发信邮箱地址与SMTP认证地址完全一致,不要伪造发件人;邮件内容避免包含大量敏感词,可先发送纯文本内容测试;短时间内不要频繁向同一邮箱发信,避免被临时限流。
- 异常日志排查:给发信逻辑包裹
try-catch块,捕获SMTP通信过程中的所有异常并写入日志,可快速定位认证失败、连接超时等具体问题。
内容的提问来源于stack exchange,提问作者Yaakov Whise
相关产品推荐
相关产品推荐

