如何使用Mailkit发送邮件?Asp.net Core中收发件人显示相同问题排查
问题原因
你遇到的发件人地址被篡改的核心原因是Gmail SMTP服务的反垃圾策略限制:
Gmail为了防范伪造发件人的垃圾邮件,会强制将所有通过其SMTP接口发送的邮件的发件人地址,替换为你在smtp.Authenticate方法中传入的认证账号邮箱。你代码中虽然给emailMessage.From设置了_userIdentity.Email对应的值,但只要这个地址没有在你认证用的Gmail账号中完成发件人验证,就会被自动覆盖为认证用的邮箱。如果此时你设置的收件人地址刚好和认证邮箱一致,就会出现发件人和收件人完全相同的情况。
解决方法
- 如果你确实需要使用
_userIdentity.Email作为发件人地址,需要先在认证用的Gmail账号中添加该邮箱为发件别名:- 登录用来做SMTP认证的Gmail账号,进入设置页面
- 切换到「账号和导入」标签页
- 找到「发送邮件为」板块,点击「添加其他电子邮件地址」
- 按照页面指引完成该邮箱的所有权验证流程
验证通过后Gmail就不会再覆盖你代码中设置的发件人地址
- 如果你只是测试功能,也可以直接将
smtp.Authenticate的第一个参数改为和_userIdentity.Email一致的邮箱,即可避免地址被覆盖 - 如果不需要使用Gmail的发件能力,也可以更换为支持自定义发件人地址的其他邮件服务商SMTP服务
你的现有代码逻辑无问题,核心结构无需调整
MimeMessage emailMessage = new MimeMessage() ; emailMessage.From.Add(MailboxAddress.Parse(_userIdentity.Email)); emailMessage.To.Add(MailboxAddress.Parse("my email")); emailMessage.Subject = "Support email"; BodyBuilder emailBodyBuilder = new BodyBuilder(); emailBodyBuilder.TextBody = message; emailMessage.Body = emailBodyBuilder.ToMessageBody(); var smtp = new MailKit.Net.Smtp.SmtpClient(); smtp.Connect("smtp.gmail.com" , 587, SecureSocketOptions.StartTls); smtp.Authenticate("my email", "*********"); await smtp.SendAsync(emailMessage); smtp.Disconnect(true);
内容的提问来源于stack exchange,提问作者Lujain Alskran
相关产品推荐
相关产品推荐

