簡體   English   中英

使用smtp SendAsync發送郵件

[英]Send mail with smtp SendAsync

這是當我需要發送電子郵件給我錯誤。 但是從那以后的錯誤是這樣的:

此時無法啟動異步操作。 異步操作只能在異步處理程序或模塊中啟動,或者在頁面生命周期中的某些事件中啟動。 如果在執行頁面時發生此異常,請確保將頁面標記為<%@ Page Async =“true”%>。 此異常還可能表示嘗試調用“異步void”方法,該方法通常在ASP.NET請求處理中不受支持。 相反,異步方法應該返回一個Task,調用者應該等待它。

我從MVC開始積累並使用類來跟蹤頁面的區域。 我使用SendAsync的原因恰恰是發送電子郵件等更快一些。

僅當我嘗試向用戶發送電子郵件時才會出現此錯誤。

public static void NewPassword(string mail, string name, string password)
    {
        MailDefinition oMailDefinition = new MailDefinition();
        oMailDefinition.BodyFileName = "~/MailList/emailskabelon/NewPassword.html";
        oMailDefinition.From = FromMail;

        Dictionary<string, string> oReplacements = new Dictionary<string, string>();
        oReplacements.Add("<<navn>>", name);
        oReplacements.Add("<<password>>", password);

        System.Net.Mail.MailMessage oMailMessage = oMailDefinition.CreateMailMessage(mail, oReplacements, new LiteralControl());
        oMailMessage.Subject = NewpasswordTitle + WebsiteName;
        oMailMessage.IsBodyHtml = true;

        SmtpClient smtp = new SmtpClient(AzureApi);
        System.Net.NetworkCredential netcred = new System.Net.NetworkCredential(AzureName, AzurePassword);
        smtp.UseDefaultCredentials = false;
        smtp.EnableSsl = true;

        smtp.Credentials = netcred;
        smtp.Port = Convert.ToInt32("25");
        smtp.DeliveryMethod = SmtpDeliveryMethod.Network;

        using (var smtpClient = new SmtpClient())
        {
            smtp.SendAsync(oMailMessage, null);
        }
    }

我試過這樣做:

public static async NewPassword(string mail, string name, string password)
        {
            ....
            using (var smtpClient = new SmtpClient())
            {
                await smtp.SendAsync(oMailMessage, null);
            }

我在這里看到: https//stackoverflow.com/a/35212320/7391454

將您的方法更改為:

public async Task SendEmail(string toEmailAddress, string emailSubject, string emailMessage)
{
var message = new MailMessage();
message.To.Add(toEmailAddress);

message.Subject = emailSubject;
message.Body = emailMessage;

using (var smtpClient = new SmtpClient())
{
    await smtpClient.SendMailAsync(message);
}
}

稱之為:

var task = SendEmail(toEmailAddress, emailSubject, emailMessage);
var result = task.WaitAndUnwrapException();

看看這里異步發送C#中的電子郵件? 在這里如何從C#中的同步方法調用異步方法?

您還可以嘗試在單獨的線程中定義異步選項。 我相信您已經在頁面中插入了異步標記。 如果一切正常,那么嘗試將您的代碼放在下面的塊中。

 this.Page.RegisterAsyncTask(new PageAsyncTask(async ctoken => {
      var result = await SomeOperationAsync(ctoken);
      // result operations.
}));

並沒有真正回復你原來的問題,但只是想強調你最好不要在不保持調用線程等待的情況下調用發送代碼的電子郵件。 雖然您正在使用async / await,但從用戶的角度來看,當服務器完成發送電子郵件時,您仍在瀏覽器中等待。 它可能是幾毫秒,但仍然最好讓后台工作人員處理它。

所以IMO,使用HostingEnvironment.QueueBackgroundWorkItem(x=> SendEmail()); 會是一個更好的方法。

話雖如此,如果app域在中間回收,你仍然有可能終止異步任務的風險。 但在我看來,這種情況極不可能。 即使發生這種情況,您也可以使用取消令牌並繞過它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM