【问题标题】:NET Core Mailkit Cannot send multiple emailNET Core Mailkit 无法发送多封电子邮件
【发布时间】:2021-01-30 14:30:19
【问题描述】:

我正在使用 MailKit 在 .NET Core 3.1 项目中发送电子邮件。

public void SendEmail(string fromEmail, string fromEmailPassword, string toEmail, string subject, string html)
{
    var email = new MimeMessage();
    email.Sender = MailboxAddress.Parse(fromEmail);
    email.To.Add(MailboxAddress.Parse(toEmail));
    email.Subject = subject;
    email.Body = new TextPart(TextFormat.Html) { Text = html };

    using var smtp = new SmtpClient();
    smtp.Connect("smtp.office365.com", 587, SecureSocketOptions.StartTls);
    smtp.Authenticate(fromEmail, fromEmailPassword);
    smtp.Send(email);            
    smtp.Disconnect(true);
}

public void SendEmail()
{
    ...
    SendEmail(fromEmail, fromEmailPassword, toEmail1, subject, html);
    SendEmail(fromEmail, fromEmailPassword, toEmail2, subject, html);
}

功能是等待一分钟然后在这一行得到错误:smtp.Connect("smtp.office365.com", 587, SecureSocketOptions.StartTls);

2020-10-15 15:20:31.457 +07:00 [错误] 执行请求时发生未处理的异常。 MailKit.Security.SslHandshakeException:尝试建立 SSL 或 TLS 连接时出错。 这通常意味着服务器提供的 SSL 证书在一个或多个时间里不被系统信任 出于以下原因: 1. 服务器正在使用无法验证的自签名证书。 2. 本地系统缺少验证服务器证书所需的根证书或中间证书。 3. 链中一个或多个证书的证书颁发机构 CRL 服务器暂时不可用。 4、服务器出示的证书过期或无效。

然后我将 SecureSocketOptions 更改为 SecureSocketOptions.Auto:smtp.Connect("smtp.office365.com", 587, SecureSocketOptions.Auto); 第一个 SendEmail (send toEmail1) 有效,但第二个 (send toEmail2) 得到了与使用 SecureSocketOptions.StartTls 时相同的错误。 然后我再次运行该函数,第一个 SendEmail 也得到了同样的错误。我等了几分钟,然后再次运行该函数,第一封 SendEmail 工作,第二封电子邮件出错。

有人可以提出解决方案吗?

谢谢。

【问题讨论】:

    标签: c# .net-core smtp mailkit


    【解决方案1】:

    您面临的问题是 SMTP 服务器不喜欢您如此快速地连接和重新连接。

    你需要做的是重复使用同一个 SmtpClient 连接来发送多条消息,像这样:

    public void SendEmail(SmtpClient smtp, string fromEmail, string toEmail, string subject, string html)
    {
        var email = new MimeMessage();
        email.Sender = MailboxAddress.Parse(fromEmail);
        email.To.Add(MailboxAddress.Parse(toEmail));
        email.Subject = subject;
        email.Body = new TextPart(TextFormat.Html) { Text = html };
    
        smtp.Send(email);
    }
    
    public void SendEmail()
    {
        using var smtp = new SmtpClient();
        smtp.Connect("smtp.office365.com", 587, SecureSocketOptions.StartTls);
        smtp.Authenticate(fromEmail, fromEmailPassword);
    
        SendEmail(smtp, fromEmail, toEmail1, subject, html);
        SendEmail(smtp, fromEmail, toEmail2, subject, html);
    
        smtp.Disconnect(true);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-08
      • 2018-03-04
      • 2020-01-17
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多