NET Core Mailkit 无法发送多封电子邮件

NET Core Mailkit Cannot send multiple email

我正在使用 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 [Error] An unhandled exception has occurred while executing the request.
MailKit.Security.SslHandshakeException: An error occurred while attempting to establish an SSL or TLS connection.

This usually means that the SSL certificate presented by the server is not trusted by the system for one or more 
of the following reasons:

1. The server is using a self-signed certificate which cannot be verified.
2. The local system is missing a Root or Intermediate certificate needed to verify the server's certificate.
3. A Certificate Authority CRL server for one or more of the certificates in the chain is temporarily unavailable.
4. The certificate presented by the server is expired or invalid.

然后我将 SecureSocketOptions 更改为 SecureSocketOptions.Auto:smtp.Connect("smtp.office365.com", 587, SecureSocketOptions.Auto); 第一个 SendEmail(发送到 Email1)有效,但第二个(发送到 Email2)得到了与使用 SecureSocketOptions.StartTls 时相同的错误。 然后我再次运行函数,第一个SendEmail也报同样的错误。我等了几分钟,运行 函数再次运行,第一个 SendEmail 成功了,第二个邮件出错了。

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

谢谢。

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

你需要做的是re-use同一个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);
}