如何从Asp.net Mvc-3发送电子邮件?

36

如何使用C#通过mvc-3 asp.net发送邮件?

我需要发送忘记密码邮件,我该怎么做? 我的代码如下。

模型代码...

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

namespace TelerikLogin.Models.ViewModels
{
    public class ForgotPassword
    {
        public int user_id { get; set; }
        public string user_login_name { get; set; }
        public string user_password { get; set; }

        [Required]
        [Display(Name="Email Address : ")]
        public string user_email_address { get; set; }
    }
}

控制器代码..

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

        [HttpPost]
        public ActionResult ForgotPassword(string user_email_address)
        {
            SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\MVC3\TelerikLogin\TelerikLogin\App_Data\Login.mdf;Integrated Security=True;User Instance=True");

            DataTable dt1 = new DataTable();

            string strQuery = string.Format("SELECT user_password FROM [user_master] WHERE user_email_address='{0}'",user_email_address);
            conn.Open();
            SqlDataAdapter da1 = new SqlDataAdapter(strQuery, conn);
            da1.Fill(dt1);
            conn.Close();

            if (dt1.Rows.Count > 0)
            {

MailMessage msg = new MailMessage();

            msg.From = new MailAddress("abc@gmail.com");
            msg.To.Add(user_email_address);
            msg.Subject = "Password";
            msg.Body = "Test1";
            msg.Priority = MailPriority.High;

            SmtpClient client = new SmtpClient();




            client.Credentials = new NetworkCredential("abc@gmail.com", "dip", "smtp.gmail.com");
            client.Host = "smtp.gmail.com";
            client.Port = 587;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.EnableSsl = true;
            client.UseDefaultCredentials = true;

            client.Send(msg);


               return RedirectToAction("About", "Home");
            }
            return View();
        }

我通过输入的电子邮件地址从数据库中获取了用户的密码。

查看代码...

<% using (Html.BeginForm("ForgotPassword", "Account", FormMethod.Post))
   { %>

   <%: Html.LabelFor(m => m.user_email_address) %>
   <%: Html.TextBox("user_email_address")%>
      <%: Html.ValidationSummary(true) %>

<input type="submit" value="Submit"/>

   <%} %>

这些行给我报错了

 client.Send(msg);

错误信息为:

The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first. x1sm1264662igc.16

如何解决这个问题?谢谢提前。


32
请考虑不要通过电子邮件发送恢复密码。您应该在您的网站上提供重置密码的链接。 - Mike Bailey
5
是的,你应该将密码存储在散列化且不可解密的格式中。请查看Troy Hunt的“Everything you ever wanted to know about building a secure password reset feature”文章。 - Akos Lukacs
4
OT,但是这段代码存在一个巨大的SQL注入漏洞。考虑一下当我POST时使用user_email_address=my_address_not_in_your_database@domain.com,' OR 'admin@yoursite.com会发生什么... - gregmac
9个回答

69

导入System.Net.Mail命名空间。

代码会类似于这样:

MailMessage mail = new MailMessage();

SmtpClient smtpServer = new SmtpClient("smtp.gmail.com");
smtpServer.Credentials = new System.Net.NetworkCredential("userName", "password");
smtpServer.Port = 587; // Gmail works on this port

mail.From = new MailAddress("myemail@gmail.com");
mail.To.Add("recepient@gmail.com");
mail.Subject = "Password recovery";
mail.Body = "Recovering the password";

smtpServer.Send(mail);

附言:您的示例代码存在SQL注入漏洞。请使用SqlCommand对象与参数,而不是String.Format()

使用SqlDataReader检查记录将比填充DataSet更有效。


嘿,@Dmitry 我实现了你的代码,但是在smtpServer.send(mail);这一行上出现了错误,错误信息如下: SMTP服务器需要安全连接或客户端未经身份验证。服务器响应为:5.7.0 必须首先发出STARTTLS命令。ub10sm724863igb.7 - Dip
你需要为一些服务器添加适当的端口和凭据。您需要以下信息来使用Gmail SMTP服务器: - Dmitry S.
5
SmtpServer.Credentials = new System.Net.NetworkCredential(userName, password); SmtpServer.Port = 587; // Gmail使用此端口 - Dmitry S.
我不理解这里的评论者。我更新了代码,添加了关于网络凭据的重要信息(因为它对个人电子邮件帐户和服务电子邮件帐户的工作方式不同很重要)。然而,有3位评论者拒绝了这个更新。@War10ck - Rohit
1
你应该使用using()语句来包装MailMessage和SmtpClient变量声明,以便在完成时正确处理它们。 - Auri Rahimzadeh
关于SQL注入问题,您应该使用参数化查询并使用ExecuteScalar()。 - Auri Rahimzadeh

16

请查看MvcMailer

MvcMailer为ASP.NET MVC 3/4提供ActionMailer风格的电子邮件发送NuGet包。因此,您可以使用ViewBag组成您的MVC主页面和视图,制作专业外观的电子邮件。


10

你可以使用这个...

    public void SendEmail(string address, string subject, string message)
    {
        string email = "-your-id-@gmail.com";
        string password = "put-your-GMAIL-password-here";

        var loginInfo = new NetworkCredential(email, password);
        var msg = new MailMessage();
        var smtpClient = new SmtpClient("smtp.gmail.com", 587);

        msg.From = new MailAddress(email);
        msg.To.Add(new MailAddress(address));
        msg.Subject = subject;
        msg.Body = message;
        msg.IsBodyHtml = true;

        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = false;
        smtpClient.Credentials = loginInfo;
        smtpClient.Send(msg);
    }

1

我正在使用这个来发送电子邮件,在ASP.net MVC3中

System.Web.Helpers.WebMail.SmtpServer = smtp_server;
            System.Web.Helpers.WebMail.SmtpPort = smtp_port;
            System.Web.Helpers.WebMail.EnableSsl = true;
            System.Web.Helpers.WebMail.From = "fromaddress";
            StringBuilder sb = new StringBuilder();
            sb.Append("<table><tr><td>");            
            sb.Append(msg);                     
            sb.Append("</td></tr></table>");
            string body = sb.ToString();
            string To = toemail;
            System.Web.Helpers.WebMail.Send(To,subject, body);

1
    Using Systems.Net.Mail;
// POST: /Account/Register
//Here's a simple Mail(MVC4)

        public async Task<ActionResult> Register(RegisterViewModel model)
        {
            Mail email= new Mail();
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser() { UserName = model.UserName, Email = model.Email };
                var result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    email.to = new MailAddress(model.Email);
                    email.body = "Hello " + model.Firstname + " your account has been created <br/> Username: " + model.UserName + " <br/>Password: " + model.Password.ToString() + " <br/> change it on first loggin";
                    ViewBag.Feed = email.reg();


                    await SignInAsync(user, isPersistent: false);


                     return RedirectToAction("Index", "Home");

                }
                else
                {
                    AddErrors(result);
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }




//Business Logic(this Is you Email Class)




Using Systems.Net.Mail;


 public class Mail

    {
        public MailAddress to { get; set; }
        public MailAddress from { get; set; }
        public string sub { get; set; }
        public string body { get; set; }




        public string reg()
        {
            string feed = "Registration Successful";
            var m = new System.Net.Mail.MailMessage()
            {
                Subject = "",
                Body = body,
                IsBodyHtml = true
            };
            m.From = new MailAddress("Mxolisi@gmail.com  ", "Administrator");
            m.To.Add(to);
            SmtpClient smtp = new SmtpClient
            {
                Host = "pod51014.outlook.com",
                //Host = "smtp-mail.outlook.com",
                Port = 587,
                Credentials = new System.Net.NetworkCredential("Mxolisi@gmail.com ", " Dut324232"),
                EnableSsl = true
            };

            try
            {
                smtp.Send(m);
                // feed = "";
            }
            catch (Exception e)
            {

            }

            return feed;

        }
        public string fogot()
        {
            string feedback = "";

            var m = new System.Net.Mail.MailMessage()
            {
                Subject = "Reset Password PIN",
                Body = body,
                IsBodyHtml = true
            };
            m.From = new MailAddress("Mxolisi@gmail.com ", "Administrator");
            m.To.Add(to);
            SmtpClient smtp = new SmtpClient
            {
                Host = "pod51014.outlook.com",
                Port = 587,
                Credentials = new System.Net.NetworkCredential("Mxolisi@gmail.com ", "Dut324232"),
                EnableSsl = true
            };

            try
            {
                smtp.Send(m);
                feedback = "Check your email for PIN";
            }
            catch (Exception e)
            {
                feedback = "Message not sent" + e.Message;
            }
            return feedback;

        }

    }
}

0

看起来你正在尝试通过GMail的SMTP服务发送电子邮件,这个SO问题已经涵盖了:在.NET中通过Gmail发送电子邮件

你的代码中唯一看起来缺失的是你设置了client.UseDefaultCredentials = true,我认为你想将其设置为false并提供自己的凭据。我从未尝试过使用GMail发送电子邮件,但我猜测你需要使用GMail帐户作为你的凭据才能正确进行身份验证。



0

您应该在Windows 7中打开SMTP服务:

  • 进入控制面板>程序
  • 点击“打开或关闭Windows功能”
  • 点击Internet信息服务并点击确定

这只是打开SMTP服务器,与.NET无关。此外,如果您从家中或未配置的服务器(即SPF、rDNS等)发送电子邮件,则很可能不会发送很多电子邮件。这个答案是不正确的。 - Piotr Kula

0

当使用Gmail的SMTP时,请记得在之前添加以下代码:

smtpClient.UseDefaultCredentials = false;

这是非常重要的。

smtpClient.Credentials = loginInfo;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接