2015-10-18 116 views
1

當我嘗試使用Postal.mvc5發送電子郵件時,遇到此錯誤消息「值不能爲空。參數名稱:httpContext」。值不能爲空。參數名稱:httpContext

嘗試調用Postal.EmailService.CreateMailMessage(電子郵件電子郵件)時發生此錯誤。

任何人都可以幫忙嗎?謝謝。

以下是錯誤的詳細信息。

at System.Web.HttpContextWrapper..ctor(HttpContext httpContext) 
at System.Web.Optimization.Styles.get_Context() 
at System.Web.Optimization.Styles.get_Manager() 
at System.Web.Optimization.Styles.RenderFormat(String tagFormat, String[] paths) 
at System.Web.Optimization.Styles.Render(String[] paths) 
at ASP._Page_Views_Shared__Layout_cshtml.Execute() in c:\XXX\Views\Shared\_Layout.cshtml:line 19 
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy() 
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy() 
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) 
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer) 
at System.Web.WebPages.WebPageBase.<>c__DisplayClass3.<RenderPageCore>b__2(TextWriter writer) 
at System.Web.WebPages.HelperResult.WriteTo(TextWriter writer) 
at System.Web.WebPages.WebPageExecutingBase.WriteTo(TextWriter writer, HelperResult content) 
at System.Web.WebPages.WebPageBase.Write(HelperResult result) 
at System.Web.WebPages.WebPageBase.RenderSurrounding(String partialViewName, Action`1 body) 
at System.Web.WebPages.WebPageBase.PopContext() 
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) 
at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) 
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) 
at Postal.EmailViewRenderer.RenderView(IView view, ViewDataDictionary viewData, ControllerContext controllerContext, ImageEmbedder imageEmbedder) 
at Postal.EmailViewRenderer.Render(Email email, String viewName) 
at Postal.EmailService.CreateMailMessage(Email email) 

ForgotPassword觸發通過電子郵件助手發送電子郵件:

public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = await UserManager.FindByNameAsync(model.Email); 
      if (user == null) 
      { 
       // Don't reveal that the user does not exist or is not confirmed 
       return View("ForgotPasswordConfirmation"); 
      } 

      // Check if email confirm required 
      if (CacheHelper.Settings.EmailConfirmedRequired && !(await UserManager.IsEmailConfirmedAsync(user.Id))) 
      { 
       return View("ForgotPasswordConfirmation"); 
      }     

      string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
      var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 

      var emailTemplateQuery = await _emailTemplateService.Query(x => x.Slug.ToLower() == "forgotpassword").SelectAsync(); 
      var emailTemplate = emailTemplateQuery.Single(); 

      dynamic email = new Postal.Email("Email"); 
      email.To = CacheHelper.Settings.EmailContact; 
      email.From = CacheHelper.Settings.EmailContact; 
      email.Subject = emailTemplate.Subject; 
      email.Body = emailTemplate.Body; 
      email.CallbackUrl = callbackUrl; 
      EmailHelper.SendEmail(email); 

      return RedirectToAction("ForgotPasswordConfirmation", "Account"); 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

電子郵件Helper類:在EmailService.CreateMailMessage(電子郵件)時發生的錯誤 ;

 public static IEmailService EmailService = Postal.Email.CreateEmailService(); 

    public static void SendEmail(Email email, bool preMailer = true) 
    { 

     Task.Factory.StartNew(() => 
     { 
      try 
      { 
       //skip email if there is no settings 
       if (string.IsNullOrEmpty(CacheHelper.Settings.SmtpHost) && string.IsNullOrEmpty(CacheHelper.Settings.SmtpPassword)) 
        return; 

       //Error encountered when call create mail message 
       var message = EmailService.CreateMailMessage(email); 

       using (var smtpClient = new SmtpClient()) 
       { 
        smtpClient.UseDefaultCredentials = false; 

        // set credential if there is one 
        if (!string.IsNullOrEmpty(CacheHelper.Settings.SmtpUserName) && !string.IsNullOrEmpty(CacheHelper.Settings.SmtpPassword)) 
        { 
         var credential = new NetworkCredential 
         { 
          UserName = CacheHelper.Settings.SmtpUserName, 
          Password = CacheHelper.Settings.SmtpPassword 
         }; 
         smtpClient.Credentials = credential; 
        } 
        smtpClient.Host = CacheHelper.Settings.SmtpHost; 
        smtpClient.EnableSsl = CacheHelper.Settings.SmtpSSL; 

        if (CacheHelper.Settings.SmtpPort.HasValue) 
         smtpClient.Port = CacheHelper.Settings.SmtpPort.Value; 

        //moving CSS to inline style attributes, to gain maximum E-mail client compatibility. 
        if (preMailer) 
         message.Body = PreMailer.Net.PreMailer.MoveCssInline(message.Body).Html; 

        smtpClient.Send(message); 
       } 
      } 
      catch (Exception ex) 
      { 
       Elmah.ErrorSignal.FromCurrentContext().Raise(ex); 
      } 
     }); 
    } 
+1

我們需要看到一些源代碼。 – Dai

+0

添加了一些源代碼。 – cheng

+0

它可能與Task.Factory.StartNew(()=>(例如另一個線程)有關,因爲新線程中的上下文始終爲空。嘗試傳遞上下文以使其工作,首先可以嘗試查看是否在你的SendEmail函數的開頭和結尾註釋掉線程工廠就是這個問題。 –

回答

0

我在嘗試使用SmtpClient發送電子郵件時遇到了一些問題。在大多數情況下,除非您擁有自己的電子郵件服務器(例如,只能在生產環境中工作),否則無法使其工作,因爲僅允許在主機/服務器上進行發送以防止發送垃圾郵件。上下文異常可能與上述問題有關。我認爲你應該嘗試類似於這個(簡化):

public static bool Email(string subject, string fromEmail, string toEmail, string fromName, string toName) 
{ 
    bool result = false; 
    bool useDefaultCredentials = true; 

    var credentials = new NetworkCredential 
    { 
     UserName = CacheHelper.Settings.SmtpUserName, 
     Password = CacheHelper.Settings.SmtpPassword 
    }; 

    if (!string.IsNullOrEmpty(CacheHelper.Settings.SmtpUserName) && !string.IsNullOrEmpty(CacheHelper.Settings.SmtpPassword)) 
    { 
     useDefaultCredentials = false; 
    } 

    SmtpClient smtp = new SmtpClient() 
    { 
     Host = CacheHelper.Settings.SmtpHost, 
     Port = CacheHelper.Settings.SmtpPort.HasValue ? CacheHelper.Settings.SmtpPort.Value : 25, 
     EnableSsl = CacheHelper.Settings.SmtpSSL, 
     DeliveryMethod = SmtpDeliveryMethod.Network, 
     UseDefaultCredentials = useDefaultCredentials, 
     Credentials = useDefaultCredentials ? CredentialCache.DefaultNetworkCredentials : credentials, 
     Timeout = 10000 
    }; 

    MailAddress from = new MailAddress(fromEmail, fromName); 
    MailAddress to = new MailAddress(toEmail, toName); 
    string body = PreMailer.Net.PreMailer.MoveCssInline(message.Body).Html; 

    using (MailMessage message = new MailMessage(from, to) { Subject = subject, IsBodyHtml = true, Body = body }) 
    { 
     smtp.Send(message); //you might need to use try catch here (it can blow up) 
     result = true; 
    } 
    smtp.Dispose(); 

    return result; 
} 
+0

嗨Gillsoft AB。謝謝你回覆。目前的解決方法是使用你建議的方法。 – cheng

相關問題