2

我在通过 SmtpMailClient.SendAsync() 发送邮件时遇到问题,即如果应用程序在 SmtpMailClient.SendAsync() 之后立即关闭,则不会发送邮件。

那么如何强制应用在回调之前不关闭呢?

谢谢 !!

4

4 回答 4

0

我认为问题是:如何拦截退出命令并根据应用程序状态推迟它?

对于 WinForms:

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    if (isSending) 
    { 
        quitOnSent = true; // make it so the quit will eventually happen
        e.Cancel = true; // prevent the quit for now
    } 
    base.OnFormClosing(e); 
} 

void SmtpClient_OnCompleted(object sender, AsyncCompletedEventArgs e)
{
    if(quitOnSent) this.Close(); // now quit
}
于 2011-08-26T04:47:33.847 回答
0

SmtpClient 有一个 SendCompleted 事件。这是有关如何实现它的示例代码:http ://www.systemnetmail.com/faq/4.6.aspx

根据您的平台,您需要实现某种 Application 对象,该对象计算挂起的 SendAsync 操作,并且仅在它们为 0 时才允许应用程序结束。

于 2011-08-25T17:46:47.433 回答
0

将 SendCompleted http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.sendcompleted.aspx事件处理程序添加到您的 SmtpClient 对象。

于 2011-08-25T17:47:23.003 回答
0

最后通过使用 bool 变量来查找邮件是否已发送。

代码:

   public static bool mailsent ;

   // I am not posting the mail sending code as its available every where.

    private void sendMailComplete(Object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {

        MailMessage msd = e.UserState as MailMessage;

        if (!e.Cancelled) 
        {
            MessageBox.Show("Cancelled");
        }
         if (e.Error != null)
        {
            MessageBox.Show("Error");

        }

        else
        {
            mailsent = true;
        }

    }

现在在 FormClosing 事件中

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e){

        if (!mailsent)
        {
            MessageBox.Show("Please wait, Mail Sending in Process !!! ");
            e.Cancel = true;
        }
    }

希望能帮助到你 !!

于 2011-08-26T04:28:41.407 回答