发送电子邮件异步

时间:2013-04-19 16:54:28

标签: c# asp.net email asynchronous

这是我尝试使用SendAsync()方法发送电子邮件的方法。通过bool发送常规电子邮件时,它工作正常。使用SendAsync方法发送时没有骰子。如果你在这里看到错误,只是寻找一些提示。提前致谢。

private static void SendEmail(System.Net.Mail.MailMessage m, Boolean Async)
    {

    using (var smtpClient = new System.Net.Mail.SmtpClient(EmailList.SMTP_GOOGLE, 587))
            {
                smtpClient.EnableSsl = true;
                smtpClient.UseDefaultCredentials = false;
                smtpClient.Credentials = new NetworkCredential("email@domain.com","password");
                smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
                smtpClient.Timeout = 3000000;


                if (Async)
                {
                    object userState = m;
                    smtpClient.SendCompleted += new SendCompletedEventHandler(Smtp_OnComplete);
                    try
                    {
                        smtpClient.SendAsync(m, userState);
                    }
                    catch (Exception ex)
                    {
                            //Logging

                    }
                }
                else
                {
                    try
                    {
                        smtpClient.Send(m);
                    }
                    catch (Exception ex)
                        //Logging

                    }
                }
            }
        }

2 个答案:

答案 0 :(得分:11)

您的using语句在异步发送完成之前处理SmtpClient 那不行。

相反,您可以使用C#5 await等待异步发送在using语句内完成,或者完全删除using以进行异步发送并处理{完成事件中的{1}}。

答案 1 :(得分:1)

  

我只是设置了一个简单的控制台应用程序来运行测试方法

由于电子邮件是异步发送的,因此控制台应用程序会将方法启动到另一个线程并继续执行自己的操作。如果在发送实际电子邮件的方法完成之前关闭,则电子邮件将无法发送,因为Visual Studio将终止该线程。在通话后尝试添加以下行以发送电子邮件以使控制台应用等待几秒钟:

System.Threading.Thread.Sleep(5000);

这应该足够长,电子邮件方法可以在控制台应用关闭并且Visual Studio终止所有进程之前发送电子邮件并完成。代码应该可以在Web服务器上正常工作。