发送电子邮件MVC#

发送电子邮件MVC#,c#,asp.net-mvc,html-email,C#,Asp.net Mvc,Html Email,我试图在一个动作中发送一封电子邮件。但是,该操作始终返回一个空白屏幕 视图: 类邮件引擎: 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

我试图在一个动作中发送一封电子邮件。但是,该操作始终返回一个空白屏幕

视图:

类邮件引擎:

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
    {

    }
}

您正在应用程序中使用空的catch块。这并不是一个好主意,要对此进行更深入的讨论,请参阅和相关问题

发生在你身上的事情如下:

  • Sendlink(FormCollection-FormCollection)
    方法的
    try
    块内的某个地方抛出异常。此异常似乎起源于
    RedirectToAction(“canvashare”)
    调用,因为该
    try
    块中的所有其他调用都不会生成异常。(特别是因为您抑制了
    mailnengine.Send
    方法引发的异常。)
  • 调用
    Sendlink(FormCollection-FormCollection)
    中的空
    catch
    块。这是您应该生成错误消息并将其显示给用户的地方。但是,您已决定将其留空,这样就没有人知道出现了什么问题以及是什么问题
  • 控制流达到
    返回空值Sendlink(FormCollection-FormCollection)
    方法中的code>语句。我猜你把它放在那里是因为编译器抱怨缺少返回值。现在返回空值,并导致呈现空视图
显而易见的解决方法是检查
重定向到操作
,并找出它引发异常的原因。此异常可能表示您的代码或应用程序中存在问题,您需要采取措施防止其发生

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


为了说明应用程序中的问题:如果未引发
重定向到操作
中的异常,您的电子邮件发送可能仍会失败。但是,您的UI无法发现出现了问题,因为您忽略了
MailClient.Send
方法中的异常。如果您将此邮件发送到生产部门,电子邮件发送将悄无声息地失败,您的客户将纳闷为什么他们从未收到过电子邮件。然后,您将很难找出实际问题是什么以及它发生在哪里。

toemail
将始终为空


您需要将输入的
name
属性设置为:
“toemail”
,以使其可绑定

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

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

首先,我不会使用FormCollection作为参数,而是使用SendLink(string-toemail)。查看ModelBinding了解更多信息。您的MailEngine.Send可能引发异常,导致SendLink操作返回null而不是返回af视图。当心空的catch块。您尝试过调试器吗?我将Formcollection更改为string toemail,在调试时,toemail为空。您需要将输入的
name
属性设置为:
“tomail”
,以使其可绑定。非常感谢Chris,在我的代码中实现这一点非常有用。虽然这对于发送电子邮件来说确实是个问题,但为什么会导致返回一个空白屏幕?@Chris:mail引擎很可能会在
toemail
为空时引发异常。因此,操作结果为空->空白屏幕。
mailnengine
永远不会引发异常,因为所有异常都在
mailnengine.Send中捕获。你说得对,我忽略了它。另一个抛出
NullReferenceException
的可能性是
string message=Session[“link”].ToString()
Yes,但在
input
标记上添加
name
属性仍然不会影响这一点。我想知道为什么这会促使人们改变行为。
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
    {

    }
}
<input type="text" id="toemail" name="toemail"  />
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...
        }
    }
}