我已经实现了一个代码,允许我从我的网络应用程序发送电子邮件到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();
}
}
}
答案 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
媒体资源中的任何价值,因为它不允许您像其他用户一样发送电子邮件。