【问题标题】:Send mail with smtp SendAsync使用 smtp SendAsync 发送邮件
【发布时间】:2017-01-23 09:46:49
【问题描述】:

这就是我需要发送电子邮件时给我的错误。但是自从给我的错误是这样的:

此时无法启动异步操作。异步 操作只能在异步处理程序中启动或 模块或页面生命周期中的某些事件期间。如果这 执行页面时发生异常,请确保该页面是 标记为 。此异常也可能表明 尝试调用通常不受支持的“async void”方法 在 ASP.NET 请求处理中。相反,异步方法 应该返回一个任务,调用者应该等待它。

我从 MVC 开始积累,并使用类来跟踪页面的 ie 区域。我使用 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

【问题讨论】:

  • 据我了解,异步方法需要一个返回类型——无论是 void 还是其他类型。

标签: c# asp.net email asynchronous


【解决方案1】:

将您的方法更改为:

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();

看看这里Asynchronously sending Emails in C#? 在这里How to call asynchronous method from synchronous method in C#?

【讨论】:

  • 给我一个错误:方法'SendAsync'没有重载需要1个参数
  • 你在哪里使用 SendAsynch?
  • 将 SendAsync 更改为 SendMailAsync。并添加等待
  • 谢谢。但是当我需要使用给我一个新错误的方法时,也许你可以快速告诉我它是什么?错误是:非静态字段、方法或属性“HelperMail.NewPassword(string, string, string)”需要对象引用
  • 我现在完成了吗!
【解决方案2】:

您也可以尝试在单独的线程中定义异步选项。 我相信您已经在页面中插入了 async 标签。 如果一切正常,请尝试将您的代码放在下面的代码块中。

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

【讨论】:

  • 与您编写的内容相比,我理解的不仅仅是构建您所做的方式以及如何将其插入到我的代码中。
【解决方案3】:

并没有真正回答您最初的问题,只是想强调您最好在不让调用线程等待的情况下调用电子邮件发送代码。尽管您使用的是 async/await,但从用户的角度来看,您仍在浏览器中等待服务器完成发送电子邮件。可能需要几毫秒,但最好还是让后台工作人员来处理。

所以 IMO,使用 HostingEnvironment.QueueBackgroundWorkItem(x=&gt; SendEmail()); 会是更好的方法。

话虽如此,如果应用程序域在中间回收,您仍然存在异步任务被终止的轻微风险。但我会说,在你的情况下,这是极不可能的。即使发生这种情况,您也可以使用取消令牌并自行解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2010-12-06
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多