如何使用 SMTP 循环发送电子邮件?

How to send email within in a loop with SMTP?

我有一个在线程内发送邮件的控制台应用程序。

在这个线程方法中,我有一个循环,可以将电子邮件发送给每个收件人。

我遇到了问题,因为我试图在之前的邮件有机会发送之前发送多封邮件。

我的代码:

            foreach(var m in mailModel.Recipients)
            {
                Mailmanager.SendMessageS(mailModel.DomainName, mailModel.Severity, DateTime.Now, m);
            }

以及发送方法:

public static async Task SendMessageS(string domainName, ErrorSeverity severity, DateTime errorTime, Recipient recipient)
{

    try
    {
        string error = "";

        string fromEmail = "OwerWatch@mydomain.com";
        string toEmail = recipient.SendEmailTo;

        MailMessage message = new MailMessage(fromEmail, toEmail);
        Guid guid = Guid.NewGuid();
        SmtpClient smtpClient = new SmtpClient(server, port);

        /*if (_useAuthentication)*/
        smtpClient.Credentials = new NetworkCredential("", "");
        smtpClient.EnableSsl = false;

        //mail.Subject = subject;
        //mail.Body = body;

        message.Subject = "Problem ( " + severity + ") " + domainName;
        message.Body = BuildMessage(error, recipient.RecipientName, domainName, errorTime, severity);

        smtpClient.SendCompleted += SendCompletedCallback;

        await smtpClient.SendMailAsync(fromEmail, toEmail, message.Subject, message.Body  /* user state, can be any object*/);

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

我收到此警告:

because this call is not awaited execution of the current method continues before the call is completed. Consider applying the await opeartor to the result of the call

我理解警告,但我不知道如何完成此操作,因为我有一个循环遍历我的所有收件人。

我怎样才能正确地做到这一点?

这里最好的办法是使用队列。

您应该将所有消息添加到一个队列中,而不是一条一条地处理它们,如果您愿意,甚至可以使用多个线程。

检查 this 答案中的几个示例。

这是一个快速修复(在您对 Mailmanager.SendMessageS 的调用中添加了 await 关键字),因为您的实用程序方法正在执行异步操作。

foreach(var m in mailModel.Recipients)
{
    await Mailmanager.SendMessageS(mailModel.DomainName, mailModel.Severity, DateTime.Now, m);
}

作为一个整体过程,可能有更好的方法。