使用Postal MVC和SendAsync()发送电子邮件时出错

时间:2012-12-21 11:23:23

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

我正在尝试使用Postal MVC在我的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);
        }

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

内部异常System.InvalidOperationException:此时无法启动异步操作。异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保页面标记为<%@ Page Async =“true”%>。在System.Web.AspNetSynchronizationContext.OperationStarted()处于System.Net.Mail.SmtpClient.SendAsync(MailMessage消息,Object userToken)的System.ComponentModel.AsyncOperation.CreateOperation(Object userSuppliedState,SynchronizationContext syncContext)

如果我用Send()替换SendAsync(),它可以正常工作。

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

请注意,只是这样做,您的网站可能会有这样的影响。我建议你研究其含义。

答案 1 :(得分:0)

确保您拥有邮政的latest version。它们包含unit test of sending Async,可以帮助您了解错误。这表明它不是邮政的问题。

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