NET Core Mailkit Cannot send multiple email

I am using MailKit to send email in a .NET Core 3.1 project.

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);
}

The function is wait for a minute then get error at this line: 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.

Then I changed the SecureSocketOptions to SecureSocketOptions.Auto: smtp.Connect("smtp.office365.com", 587, SecureSocketOptions.Auto); The first SendEmail (send toEmail1) worked, but the second (send toEmail2) got the same error as when using SecureSocketOptions.StartTls. Then I run again the function, the first SendEmail also got the same error. I wait for few minutes and run the function again, the first SendEmail worked, the second email got error.

Could someone please suggest a solution?

Thank you.

1 answer

  • answered 2020-10-16 13:03 jstedfast

    The problem that you are facing is that the SMTP server does not like you connecting and reconnecting so quickly.

    What you need to do is to re-use the same SmtpClient connection to send multiple messages, like this:

    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);
    }