0

这是我尝试使用 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

                    }
                }
            }
        }
4

2 回答 2

11

您的using声明是SmtpClient在异步发送完成之前处理。
那是行不通的。

相反,您可以使用 C# 5await在语句内等待异步发送完成using,或者完全摆脱using异步发送并SmtpClient在完成事件中处理。

于 2013-04-19T16:56:02.523 回答
1

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

因为电子邮件是异步发送的,所以控制台应用程序将在不同的线程中启动该方法并继续其自己的执行。如果它在发送实际电子邮件的方法完成之前关闭,则电子邮件将无法发送,因为 Visual Studio 将终止该线程。尝试在呼叫后添加以下行以发送电子邮件以使控制台应用程序等待几秒钟:

System.Threading.Thread.Sleep(5000);

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

于 2013-04-25T20:25:11.957 回答