【问题标题】:Getting error when I send email using Postal MVC and SendAsync()使用 Postal MVC 和 SendAsync() 发送电子邮件时出错
【发布时间】:2012-12-21 11:23:22
【问题描述】:

我正在尝试在我的 MVC 控制器中使用 Postal MVC 发送电子邮件。我想异步发送电子邮件,不想在返回视图之前等待电子邮件发送。

这是我尝试使用的代码。

        try
        {
            dynamic email = new Email("TestEmail");  //I have an Email View by this name
            email.To = "myemailaddress@domain.com";
            email.From = "recipientsaddress@domain.com";
            email.SendAsync();                      //email.Send() works fine
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

但我收到此错误“发送邮件失败”。

Inner Exception System.InvalidOperationException:此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保该页面被标记为 。在 System.Web.AspNetSynchronizationContext.OperationStarted() 在 System.ComponentModel.AsyncOperation.CreateOperation(Object userSuppliedState,SynchronizationContext syncContext) 在 System.Net.Mail.SmtpClient.SendAsync(MailMessage message,Object userToken)

如果我将 SendAsync() 替换为 Send() 就可以了。

为了完整起见,这就是我的邮件设置在我的 Web.Config 中的样子

  <system.net>
    <mailSettings>
      <smtp deliveryMethod="Network">
        <network host="smtp.myisp.com" port="25" defaultCredentials="true" />
      </smtp>
    </mailSettings>
  </system.net>

异步发送电子邮件似乎有问题。有没有其他人提出过这个问题并有解决方案?

或者我应该使用像MvcMailer 这样的其他邮件程序吗?

请不要建议我不应该异步发送电子邮件。我希望我的网站能够快速响应,但我发现在注册过程中连接到电子邮件服务器以发送电子邮件有点无响应。

【问题讨论】:

  • 您能否更具体地了解异常类型而不仅仅是消息文本?
  • 请发布内部异常消息。也许堆栈跟踪...有用的东西。
  • 查看邮政编码,这实际上可能不起作用,除非电子邮件发送得非常快,看起来 mailMessage 可能在异步消息发送之前就被处理了......我可能不会工作。我的建议是使用 Postal 的解析器并直接调用 SmtpClient ..
  • 您可以通过在方法末尾添加System.Threading.Thread.Sleep(10000)来测试是否存在dispose问题。
  • InnerException=System.InvalidOperationException:此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果此异常发生在执行一个页面,确保该页面在 System.ComponentModel.AsyncOperation.CreateOperation(Object userSuppliedState,SynchronizationContext syncContext) 处的 System.Web.AspNetSynchronizationContext.OperationStarted() 标记为 .at System。 Net.Mail.SmtpClient.SendAsync(MailMessage message,Object userToken)

标签: c# email asynchronous asp.net-mvc-4 postal


【解决方案1】:

Postal MVC 似乎与 MVC4 的新异步机制不兼容。在 Postal MVC 的开发人员使其兼容之前,您有 2 个选择,降级到 MVC3,或者在您的应用程序中强制使用旧的 MVC3 功能。

要恢复到 MVC4 中的旧功能,您可以在 web.config 中应用以下设置:

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="false" /> 

不过,请注意不要这样做,这样做可能会对您的网站产生影响。我建议你研究一下其中的含义。

【讨论】:

  • 该键在我的 web.config 文件中不存在。
  • 您是否尝试过添加它,并将值更改为 false true。我不确定该设置的作用,但值得一试。另外,您能否确认它是 .NET 4.5/MVC4 还是 MVC3(尝试切换到 MVC3 看看是否有所不同)。
  • 谢谢马丁。我将该密钥放入 下的 web.config 中,并将其设置为“false”,它运行良好。现在,经过多次测试,我的页面加载速度快了大约 2 秒。
  • @Martin 只是出于好奇,不应该将操作方法​​声明为public async Task&lt;ActionResult&gt; actionName(...) 然后使用await Task.Run(() =&gt; email.SendAsync()); 吗?我遇到了同样的问题并找到了这个解决方案并且它有效。
  • 这可能行得通,老实说我不知道​​...弹出它作为答案,也许 Freejelly 可以尝试...
【解决方案2】:

确保您拥有 Postal 的 latest version。他们包括一个unit test of sending Async,它应该可以帮助您了解问题所在。这表明这不是 Postal 的问题。

测试还表明您​​可能必须使用SpecifiedPickupDirectory

【讨论】:

  • 我无法编译该单元测试。他正在使用一些我无法访问的库和参考资料,例如 Moq 和 Xunit。有没有更简单的例子来使用异步发送电子邮件?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
相关资源
最近更新 更多