.NET 通过SmtpClient发送邮件 提示 4.7.1 service unavailable try again later 解决办法

最近用C#的SmtpClient发送电子邮件碰到这个错误:

正在处理错误。 服务器响应为:4.7.1 Service unavailable - try again later

换了其他的SMTP服务器,没有问题,唯独客户使用的这个服务器会报异常。

使用Foxmail也可以正常发送邮件,但是C#写程序,就不能发送。

非常好奇,到底是哪里出了问题。于是下载了Wireshark,跟踪了端口为25的TCP数据包(Filter处填:tcp port 25)。

点击Start开始捕捉数据包。

从图里可以发现这个服务器非常奇葩的会拒绝一次SMTP协议里的MAIL FROM指令,从而造成异常,再试一次就好了。

然而C#的SmtpClient类我们没法更改(System.dll),于是谷歌找到了System.Net.Mail.SmtpClient的mono实现,复制了下来,增加了一次登录时错误451的判断,然后重新发送一次去掉了@和域名的,只保留用户名的MAIL FROM信息,就可以成功发送了。

从Github的SmtpClient源码中,还知道了一个叫做MailKit的开源发送邮件代码,地址是 https://github.com/jstedfast/MailKit

这个功能比SmtpClient强大很多,但是我的程序都已经完成了,就不再花时间去改了,有时间可以再研究这个软件。

GitHub 的System.Net.Mail源码在这里:https://github.com/mono/mono/tree/master/mcs/class/System/System.Net.Mail

转载于:https://www.cnblogs.com/easyc/p/C_Sharp_SmtpClient_Server_Response_4_7_1_Service_unavailable.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 ASP.NET Core 中使用 MailKit 发送电子邮件,需要执行以下步骤: 1. 安装 MailKit 和 MimeKit NuGet 包。 2. 在 Startup.cs 文件中添加以下代码: ```csharp using MailKit.Net.Smtp; using MimeKit; public void ConfigureServices(IServiceCollection services) { // ... services.AddMailKit(optionBuilder => { optionBuilder.UseSmtp("smtp.gmail.com", 587); optionBuilder.EnableSsl = true; optionBuilder.AuthenticationOptions = AuthenticationOptions.DoNotAuthenticate; }); // ... } ``` 3. 在控制器或服务中注入 `IMailer` 接口。 ```csharp using MailKit.Net.Smtp; using MimeKit; public class MyController : Controller { private readonly IMailer _mailer; public MyController(IMailer mailer) { _mailer = mailer; } public async Task<IActionResult> SendEmail() { var message = new MimeMessage(); message.From.Add(new MailboxAddress("From Name", "from@example.com")); message.To.Add(new MailboxAddress("To Name", "to@example.com")); message.Subject = "Test Email"; message.Body = new TextPart("plain") { Text = "This is a test email." }; await _mailer.SendAsync(message); return Ok(); } } ``` 4. 通过 MailKit 发送电子邮件: ```csharp using MailKit.Net.Smtp; using MimeKit; public interface IMailer { Task SendAsync(MimeMessage message); } public class Mailer : IMailer { private readonly SmtpClient _smtpClient; public Mailer(SmtpClient smtpClient) { _smtpClient = smtpClient; } public async Task SendAsync(MimeMessage message) { await _smtpClient.SendAsync(message); } } ``` 现在,当执行 `SendEmail()` 方法时,将通过 MailKit 发送电子邮件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值