2015-07-20 21 views
0

我应该提到这只是一个学习项目,并且永远不会在线托管。我在本地运行应用程序。用C#ASP.NET发送电子邮件,并使用从URL传入的参数

我有两个问题发送电子邮件在传递的参数:

  1. 的主要问题:它不发送。
  2. 只有在点击发送并重定向到同一页面之后,参数才会在视图中填充表单,但它们显示在URL中。

这里是我的代码:

Mail.cs(型号)

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

namespace LotManager.Models 
{ 
    public class Mail 
    { 
     public string From = "[email protected]"; 
     public string To { get; set; } 
     public string Subject = "Parking Alert"; 
     public string Body { get; set; } 
    } 
} 

MailController.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net.Mail; 
using System.Web; 
using System.Web.Mvc; 
using LotManager.Controllers; 

namespace LotManager.Controllers 
{ 
    public class MailController : Controller 
    { 
     // 
     // GET: /SendMailer/ 
     public ActionResult Index() 
     { 
      return View(); 
     } 
     [HttpPost] 
     public ViewResult Index(LotManager.Models.Mail _objModelMail) 
     { 
      var to = Request.QueryString["To"]; 
      ViewBag.To = to; 
      var body = Request.QueryString["Body"]; 
      ViewBag.Body = body; 
      if (ModelState.IsValid) 
      { 
       MailMessage mail = new MailMessage(); 
       mail.To.Add(to);     
       mail.From = new MailAddress(_objModelMail.From); 
       string Body = body; 
       mail.Body = Body; 
       mail.IsBodyHtml = true; 
       SmtpClient smtp = new SmtpClient(); 
       smtp.Host = "smtp.gmail.com"; 
       smtp.Port = 25; 
       smtp.UseDefaultCredentials = false; 
       smtp.Credentials = new System.Net.NetworkCredential 
       ("mygmailusername", "mypassword"); //My actual account info goes here 
       smtp.EnableSsl = true; 
       try 
       { 
        smtp.Send(mail); 
       } 
       catch (Exception) 
       { 
        Console.WriteLine("The email was not sent, because I couldn't get it to work. Oops!"); 
       } 
       return View("Index", _objModelMail); 
      } 
      else 
      { 
       return View(); 
      } 
     } 
    } 
} 

Index.cshtml(发送邮件查看)

@model LotManager.Models.Mail 

@{ 
    ViewBag.Title = "Send"; 
} 

<h2>Send</h2> 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary() 
    <p>To: </p> 
    <p>@Html.TextBoxFor(m => m.To, new { @Value = @ViewBag.To })</p> 
    <p>Body: </p> 
    <p>@Html.TextBoxFor(m => m.Body, new { @Value = @ViewBag.Body })</p> 
    <input type="submit" value="Send" /> 
} 

该参数传递到URL中的代码:

@Html.Actionlink("Send Notification", "Index", "Mail", new { To = item.Employee.Email, Body = item.Description }, null) 
+0

是否有例外,还是电子邮件没有到达? –

+0

电子邮件只是没有到达。我忘了提及我在本地举办这个活动,因为它只是一个学习项目。 –

回答

2

恶意用户可以使用网页来使用您的电子邮件帐户的垃圾邮件的人。这会很快破坏你的Gmail发件人信誉。从糟糕的发件人声誉中恢复几乎是不可能的。

1期

您正在使用的wrong SMTP port

smtp.gmail.com要求端口465用于SSL或用于TLS的端口587。

问题2

要调用使用链路(ActionLink的),它创建一个GET请求的控制器。然而,由于[HttpPost]属性,您的控制器操作只会针对POST进行调用。要么删除[HttpPost],要么使用后置操作而不是链接来调用控制器操作。

+0

我试了端口25,465和587没有运气。我忘了提及我只在本地运行,因为它只是一个学习项目。谢谢。 –

+0

您是否修复了问题2?你确定发送的代码被调用吗? '我在本地运行这个功能'有些ISP会阻止端口25到SMTP服务器以外的其他SMTP服务器来控制垃圾邮件,尽管我从来没有听说过ISP阻止465或587.检查您是否有防止连接的出站防火墙规则。 –

+0

尝试下载Mozilla Thunderbird等电子邮件客户端。以与您的代码相同的方式配置它(相同的SMTP,用户,密码,端口,协议)。看看你是否可以使用客户端发送电子邮件。如果发送失败,您应该得到一个合理详细的错误信息。 –

0

该参数也不可偏好,因为您正在使用[HttpPost]。 GET中的参数不在POST中。

关于第二个问题请看Google文档:https://support.google.com/a/answer/176600?hl=en 如果你想使用端口25,你需要将服务器改为smtp-relay.gmail.com。否则,请将端口更改为465(SSL)或端口587(TLS)。

+0

我试过端口25与smtp中继和aspmx.l.google.com,465和587与smtp.gmail.com没有运气。我忘了提及我在本地运行,这可能是问题所在。 –