ASP.NET MVC3使用SMTP

时间:2016-05-05 09:02:45

标签: c# asp.net asp.net-mvc-3 smtp

我已经实现了一个代码,允许我从我的网络应用程序发送电子邮件到gmail,我无法弄清楚它有什么问题......

当我按下“提交”按钮时没有任何反应,没有错误。我还在我的控制器中添加了断点,但它们没有被触发......

这是我的代码:

型号:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.ComponentModel.DataAnnotations;

namespace TripPlanner.Models
{
    public class EmailFormModel
    {
        [Required]
        [StringLength(20, MinimumLength = 5)]
        public string Name { get; set; }
        [Required]
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }
        [Required]
        public string Subject { get; set; }
        [Required]
        public string Message { get; set; }
    }
}

查看:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<TripPlanner.Models.EmailFormModel>" %>
<% using (Html.BeginForm()) {%>
    <form method="post">
        <%: Html.ValidationSummary("Please correct the errors and try again.") %>
        <p>Name: </p>
        <%: Html.TextBoxFor(m => m.Name)%>
        <p>Email: </p>
        <%: Html.TextBoxFor(m => m.Email)%>
        <p>Subject: </p>
        <%: Html.TextBoxFor(m => m.Subject)%>
        <p>Message: </p>
        <%: Html.TextBoxFor(m => m.Message)%>
        <input type ="submit" value ="Send" />
    </form>
<% } %>

控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net.Mail;
using System.Web.Mvc;
using System.IO;
using System.Net;
using TripPlanner.Models;

namespace TripPlanner.Controllers
{
    public class SendMailerController: Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            return View();
        }
        [HttpPost]
        public ActionResult Index(EmailFormModel vm)
        {
            if(ModelState.IsValid)
            {
                try
                {
                    MailMessage msz = new MailMessage();
                    msz.From = new MailAddress(vm.Email);//Email which you are getting from contact us page 
                    msz.To.Add("my_valid_email@gmail.com");//Where mail will be sent 
                    msz.Subject = vm.Subject;
                    msz.Body = vm.Message;
                    SmtpClient smtp = new SmtpClient();

                    smtp.Host = "smtp.gmail.com";
                    smtp.Port = 587;
                    smtp.Credentials = new System.Net.NetworkCredential("my_valid_email@gmail.com", "my_valid_pass");
                    smtp.EnableSsl = true;
                    smtp.Send(msz);

                    ModelState.Clear();
                }
                catch(Exception ex )
                {
                    ModelState.Clear();
                }              
            }

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

2 个答案:

答案 0 :(得分:1)

<% using (Html.BeginForm("Index", "SendMailer", FormMethod.Post)) {%>
<form method="post">
    <%: Html.ValidationSummary("Please correct the errors and try again.") %>
    <p>Name: </p>
    <%: Html.TextBoxFor(m => m.Name)%>
    <p>Email: </p>
    <%: Html.TextBoxFor(m => m.Email)%>
    <p>Subject: </p>
    <%: Html.TextBoxFor(m => m.Subject)%>
    <p>Message: </p>
    <%: Html.TextBoxFor(m => m.Message)%>
    <input type ="submit" value ="Send" />
</form>

请更改您的开始表单语法,您需要指定要在其上发布表单数据的操作和控制器名称。

答案 1 :(得分:0)

至少有一个问题是,在提供Gmail帐户的用户名和密码之前,您需要告诉SMTP客户端不要使用您的Windows凭据。

添加

smtp.UseDefaultCredentials = false;

在这行代码之上(不在之后)。

smtp.Credentials = new System.Net.NetworkCredential("my_valid_email@gmail.com", "my_valid_pass");

另一个明显的问题是你真的需要在你的阻止块中做一些有用的事情 - 现在你正在通过吞噬异常来积极破坏你的努力。

您需要记录异常,或者至少throw。完全删除try / catch也会比你现在正在做的更好。

此外,gmail会忽略您在MailMessage.From媒体资源中的任何价值,因为它不允许您像其他用户一样发送电子邮件。