asp.net-mvc 如何从 MVC 5 应用程序发送电子邮件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26784366/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to send email from MVC 5 application
提问by dc922
I have a form that a customer is required to fill out. Once the form is submitted, I'd like to send the basic information from the form's Index view (First Name, Last Name, Phone Number, etc..) to an email. I'm currently using GoDaddy for my hosting site. Does this matter, or can I send the email directly from my MVC application? I have the following for my Model, View, Controller. I've never done this before and am really not sure how to go about it.
我有一个客户需要填写的表格。提交表单后,我想将表单索引视图中的基本信息(名字、姓氏、电话号码等)发送到电子邮件。我目前在我的托管网站上使用 GoDaddy。这是否重要,或者我可以直接从我的 MVC 应用程序发送电子邮件吗?我的模型、视图、控制器有以下内容。我以前从未这样做过,我真的不知道该怎么做。
Model:
模型:
public class Application
{
public int Id { get; set; }
[DisplayName("Marital Status")]
public bool? MaritalStatus { get; set; }
[Required]
[DisplayName("First Name")]
public string FirstName { get; set; }
[DisplayName("Middle Initial")]
public string MiddleInitial { get; set; }
[Required]
[DisplayName("Last Name")]
public string LastName { get; set; }
}
Controller:
控制器:
public ActionResult Index()
{
return View();
}
// POST: Applications/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index([Bind(Include = "Id,FirstName,MiddleInitial,LastName")] Application application)
{
ViewBag.SubmitDate = DateTime.Now;
if (ModelState.IsValid)
{
application.GetDate = DateTime.Now;
db.Applications.Add(application);
db.SaveChanges();
return RedirectToAction("Thanks");
}
return View(application);
}
View
看法
<table class="table table-striped">
<tr>
<th>
@Html.ActionLink("First Name", "Index", new { sortOrder = ViewBag.NameSortParm })
</th>
<th>
@Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm })
</th>
<th>
@Html.ActionLink("Date Submitted", "Index", new { sortOrder = ViewBag.NameSortParm})
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.GetDate)
</td>
</tr>
}
回答by DavidG
You will need an SMTP server to send email from. No idea how GoDaddy works but I'm sure they will provide something.
您将需要一个 SMTP 服务器来发送电子邮件。不知道 GoDaddy 是如何工作的,但我相信他们会提供一些东西。
To send emails from an MVC app you either specify you SMTP details in code or in the web.config. I recommend in the config file as it means it's much easier to change. With everything in the web.config:
要从 MVC 应用程序发送电子邮件,您可以在代码或web.config. 我推荐在配置文件中,因为这意味着它更容易更改。使用 web.config 中的所有内容:
SmtpClient client=new SmtpClient();
Otherwise, do it in code:
否则,在代码中执行:
SmtpClient client=new SmtpClient("some.server.com");
//If you need to authenticate
client.Credentials=new NetworkCredential("username", "password");
Now you create your message:
现在你创建你的消息:
MailMessage mailMessage = new MailMessage();
mailMessage.From = "[email protected]";
mailMessage.To.Add("[email protected]");
mailMessage.Subject = "Hello There";
mailMessage.Body = "Hello my friend!";
Finally send it:
最后发送:
client.Send(mailMessage);
An example for the web.configset up:
web.config设置示例:
<system.net>
<mailSettings>
<smtp>
<network host="your.smtp.server.com" port="25" />
</smtp>
</mailSettings>
</system.net>
回答by Matshili Aluwani
You can try this
你可以试试这个
Controller
控制器
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ContactDees(FormCollection form)
{
EmailBusiness me = new EmailBusiness();
//string message = Session["Urgent Message"].ToString();
string from = form["from"];
string subj = form["sub"];
string body = form["body"];
me.from = new MailAddress(from);
me.sub = subj;
me.body = body;
me.ToAdmin();
return RedirectToAction("Feedback", "First");}
Business Logic
商业逻辑
public class EmailBusiness
{
public MailAddress to { get; set; }
public MailAddress from { get; set; }
public string sub { get; set; }
public string body { get; set; }
public string ToAdmin()
{
string feedback = "";
EmailBusiness me = new EmailBusiness();
var m = new MailMessage()
{
Subject = sub,
Body = body,
IsBodyHtml = true
};
to = new MailAddress("[email protected]", "Administrator");
m.To.Add(to);
m.From = new MailAddress(from.ToString());
m.Sender = to;
SmtpClient smtp = new SmtpClient
{
Host = "pod51014.outlook.com",
Port = 587,
Credentials = new NetworkCredential("[email protected]", "Dut930611"),
EnableSsl = true
};
try
{
smtp.Send(m);
feedback = "Message sent to insurance";
}
catch (Exception e)
{
feedback = "Message not sent retry" + e.Message;
}
return feedback;
}
}
View
看法
<div class="form-horizontal">
<div class="form-group">
@Html.LabelFor(m => m.From, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.From, new { @class = "form-control MakeWidth" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Subject, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Subject, new { @class = "form-control MakeWidth" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Body, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextAreaFor(m => m.Body, new { @class = "form-control MakeWidth" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-primary" value="Send Email" />
</div>
</div>
</div>
Web Config
网页配置
回答by Anup Shetty
Web Config:
网页配置:
<system.net>
<mailSettings>
<smtp from="[email protected]">
<network host="smtp-mail.outlook.com"
port="587"
userName="[email protected]"
password="password"
enableSsl="true" />
</smtp>
</mailSettings>
</system.net>
Controller:
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Contact(EmailFormModel model)
{
if (ModelState.IsValid)
{
var body = "<p>Email From: {0} ({1})</p><p>Message:</p><p>{2}</p>";
var message = new MailMessage();
message.To.Add(new MailAddress("[email protected]")); //replace with valid value
message.Subject = "Your email subject";
message.Body = string.Format(body, model.FromName, model.FromEmail, model.Message);
message.IsBodyHtml = true;
using (var smtp = new SmtpClient())
{
await smtp.SendMailAsync(message);
return RedirectToAction("Sent");
}
}
return View(model);
}
回答by Jim Kay
// This example uses SendGrid SMTP via Microsoft Azure
// The SendGrid userid and password are hidden as environment variables
private async Task configSendGridasyncAsync(IdentityMessage message)
{
SmtpClient client = new SmtpClient("smtp.sendgrid.net");
var password = Environment.GetEnvironmentVariable("SendGridAzurePassword");
var user = Environment.GetEnvironmentVariable("SendGridAzureUser");
client.Credentials = new NetworkCredential(user, password);
var mailMessage = new MailMessage();
mailMessage.From = new MailAddress("[email protected]", "It's Me"); ;
mailMessage.To.Add(message.Destination);
mailMessage.Subject = message.Subject;
mailMessage.Body = message.Body;
mailMessage.IsBodyHtml = true;
await client.SendMailAsync(mailMessage);
await Task.FromResult(0);
}
回答by user9817675
public static async Task SendMail(string to, string subject, string body)
{
var message = new MailMessage();
message.To.Add(new MailAddress(to));
message.From = new MailAddress(WebConfigurationManager.AppSettings["AdminUser"]);
message.Subject = subject;
message.Body = body;
message.IsBodyHtml = true;
using (var smtp = new SmtpClient())
{
var credential = new NetworkCredential
{
UserName = WebConfigurationManager.AppSettings["AdminUser"],
Password = WebConfigurationManager.AppSettings["AdminPassWord"]
};
smtp.Credentials = credential;
smtp.Host = WebConfigurationManager.AppSettings["SMTPName"];
smtp.Port = int.Parse(WebConfigurationManager.AppSettings["SMTPPort"]);
smtp.EnableSsl = true;
await smtp.SendMailAsync(message);
}
}

