发送电子邮件MVC4 C#

时间:2013-06-21 06:26:23

标签: c# asp.net-mvc html-email

我正在尝试在动作中发送电子邮件。但是,操作始终返回空白屏幕。

查看:

<% using(Html.BeginForm("Sendlink", "Home")) %>
    <% { %>
     <input type="text" id="toemail" value="" />
        <input type="submit" value="Send" />
    <% } %>

控制器:

public ActionResult Sendlink()
{
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Sendlink(FormCollection formCollection)
{
    try
    {
        string message = Session["link"].ToString();
        string toemail = formCollection["toemail"];
        MailEngine.Send("mail@mail.com", toemail, "link", message);
        return RedirectToAction("CanvasShare");
    }
    catch
    {

    }
    return null;
}

Class MailEngine:

public static void Send(string from, string to, string subject, string body)
{
    try
    {
        MailMessage mail = new MailMessage(from, to, subject, body);
        SmtpClient client = new SmtpClient("smtp.mymail.com");
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.EnableSsl = false;
        client.Send(mail);
    }
    catch
    {

    }
}

2 个答案:

答案 0 :(得分:3)

您在应用程序中使用空catch块。这不是一个好主意,有关此问题的更深入讨论,请参阅Why are empty catch blocks a bad idea?及相关问题。

您似乎正在发生的事情如下:

  • try方法的Sendlink(FormCollection formCollection)块内某处抛出异常。此异常似乎源于RedirectToAction("CanvasShare")调用,因为try块内的所有其他调用都不会生成异常。 (特别是因为您抑制了MailEngine.Send方法抛出的异常。)
  • 调用catch中的空Sendlink(FormCollection formCollection)块。这是您应该生成错误消息并将其显示给用户的位置。但是,你已经决定将它留空,所以没有人知道出了什么问题以及它是什么。
  • 控制流到达return null;方法中的Sendlink(FormCollection formCollection)语句。我的猜测是你把它放在那里因为编译器抱怨缺少返回值。现在返回此null并导致呈现空视图。

明显的解决方法是检查RedirectToAction并找出它抛出异常的原因。此异常可能表示您的代码或应用中存在问题,您需要采取措施防止其发生。

下一个修复是在您的应用程序中实际实现错误处理。删除所有空的catch块,并考虑是否要抛出异常,或者是否要立即处理它。然而,忽略它几乎不是一个好主意。

说明您的应用中的问题:如果未引发RedirectToAction中的异常,您的电子邮件发送可能仍会失败。但是,您的UI无法找到出错的原因,因为您在MailClient.Send方法中忽略了异常。如果您将其发送到生产中,电子邮件发送将无声地失败,您的客户会想知道为什么他们从未收到过电子邮件。那么你很难找出实际问题是什么以及它发生在哪里。

答案 1 :(得分:2)

toemail将始终为空。

您需要将输入的name属性设置为:"toemail"才能使其可绑定。

<input type="text" id="toemail" name="toemail"  />

正如其他人所说的那样,使用空的catch语句真的不是一个好主意。它隐藏了一个潜在的错误。与您的情况一样,try catch块中存在隐藏的异常,导致空行动结果,因此出现空白屏幕。

有几个选项,如何在ASP MVC中处理异常。我最喜欢的是异常过滤器和<CustomErrors mode="On"/> web.config设置的组合。

protected override void OnException(ExceptionContext filterContext)
{
    base.OnException(filterContext);

    if (filterContext.HttpContext.IsCustomErrorEnabled)
    {
        if (filterContext.Exception is SecurityException)
        {
            filterContext.ExceptionHandled = true;
            filterContext.Result = View("FriendlyError");
            //log the exception etc...
        }
    }
}

因此,当启用自定义错误时,您可以在生产时返回友好的错误屏幕,或者在调试时禁用它以查看实际的异常。