【问题标题】:How to send email from Asp.net Mvc-3?如何从 Asp.net Mvc-3 发送电子邮件?
【发布时间】:2012-03-26 15:26:48
【问题描述】:

如何使用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

如何解决? 提前致谢

【问题讨论】:

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

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


【解决方案1】:

导入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
  • 您需要为某些服务器添加适当的端口和凭据。您需要 gmail smtp 服务器的以下信息
  • SmtpServer.Credentials = new System.Net.NetworkCredential(userName, password); SmtpServer.Port = 587; // Gmail 在这个端口上工作
  • 而且这里的审稿人我不懂。我更新了代码以添加有关网络凭据的重要信息(这很重要,因为它对单个电子邮件帐户和服务电子邮件帐户的工作方式不同)。然而 3 位评论者拒绝了更新。 @War10ck
  • 您应该将 MailMessage 和 SmtpClient 变量声明包装在 using() 语句中,以便在完成时正确处理它们。
【解决方案2】:

看看MvcMailer

MvcMailer 为您提供 ActionMailer 样式的电子邮件,用于发送适用于 ASP.NET MVC 3/4 的 NuGet 包。因此,您可以使用 ViewBag 生成由 MVC 母版页和视图组成的具有专业外观的电子邮件。

【讨论】:

    【解决方案3】:

    你可以用这个...

        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);
        }
    

    【讨论】:

      【解决方案4】:

      我在 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);
      

      【讨论】:

        【解决方案5】:
            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;
        
                }
        
            }
        }
        

        【讨论】:

          【解决方案6】:

          【讨论】:

            【解决方案7】:

            您似乎正在尝试通过 GMail 的 SMTP 服务发送电子邮件,这个 SO 问题已经涵盖:Sending email in .NET through Gmail

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

            【讨论】:

              【解决方案8】:

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

              • 进入控制面板>程序
              • 点击“打开或关闭窗口功能”
              • 单击 Internet 信息服务,然后单击确定

              【讨论】:

              • 这会打开 SMTP 服务器,与 .NET 无关。此外,如果您从家里或未配置的服务器(即 SPF、rDNS..etc 等)发送电子邮件,很可能不会分配电子邮件。这个答案是不正确的。
              【解决方案9】:

              gmail使用smtp时,记得放

              smtpClient.UseDefaultCredentials = false;

              之前

              smtpClient.Credentials = loginInfo;
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-02-13
                • 1970-01-01
                • 1970-01-01
                • 2011-03-06
                • 1970-01-01
                相关资源
                最近更新 更多