2011-06-08 79 views
14

我需要使用文本区域和图像上传字段来制作表单。当有人提交时,我希望它发送电子邮件(从textarea文本)与附件(从输入文件上传字段)给我带有附件上传和电子邮件发送的表单

我简单的形式看起来像这样:

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset>   
      @Html.TextArea("Question");  
      <input type="file"/> 
      <input type="submit" value="Send" /> 

    </fieldset> 

} 

我发现,正在做这样的事情的PHP脚本,但我怎么能做到这一点在ASP.NET MVC(可能是使用JavaScript)?在.NET

回答

23

下面是一个使用Gmail的SMTP例子,但如果你有自己的SMTP服务器,你可以很容易地调整代码。

一如既往我将与视图模型开始:

public class QuestionViewModel 
{ 
    [Required] 
    public string Question { get; set; } 

    public HttpPostedFileBase Attachment { get; set; } 
} 

然后控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new QuestionViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(QuestionViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     using (var client = new SmtpClient("smtp.gmail.com", 587)) 
     { 
      client.EnableSsl = true; 
      client.Credentials = new NetworkCredential("[email protected]", "secret"); 
      var mail = new MailMessage(); 
      mail.From = new MailAddress("[email protected]"); 
      mail.To.Add("[email protected]"); 
      mail.Subject = "Test mail"; 
      mail.Body = model.Question; 
      if (model.Attachment != null && model.Attachment.ContentLength > 0) 
      { 
       var attachment = new Attachment(model.Attachment.InputStream, model.Attachment.FileName); 
       mail.Attachments.Add(attachment); 
      } 
      client.Send(mail); 
     } 
     return Content("email sent", "text/plain"); 
    } 
} 

和最后一个视图:

@model QuestionViewModel 

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset>   
     <div> 
      @Html.LabelFor(x => x.Question) 
      @Html.TextAreaFor(x => x.Question) 
     </div> 
     <div> 
      <label for="attachment">Attachment</label> 
      <input type="file" name="attachment" id="attachment"/> 
     </div> 
     <input type="submit" value="Send" /> 
    </fieldset> 
} 

进一步改进这个代码将实际发送的邮件外部化到实现某个接口并使用D的存储库中我为了削弱控制器逻辑和邮件发送逻辑之间的耦合。

请注意,您也可以在web.config中配置SMTP设置:

<system.net> 
    <mailSettings> 
     <smtp from="[email protected]" deliveryMethod="Network"> 
     <network 
      enableSsl="true" 
      host="smtp.gmail.com" 
      port="587" 
      userName="[email protected]" 
      password="secret" 
     /> 
     </smtp> 
    </mailSettings> 
</system.net> 

,然后简单地说:

using (var client = new SmtpClient()) 
{ 
    var mail = new MailMessage(); 
    mail.To.Add("[email protected]"); 
    mail.Subject = "Test mail"; 
    mail.Body = model.Question; 
    if (model.Attachment != null && model.Attachment.ContentLength > 0) 
    { 
     var attachment = new Attachment(model.Attachment.InputStream, model.Attachment.FileName); 
     mail.Attachments.Add(attachment); 
    } 
    client.Send(mail); 
} 
+0

Tkanks很多!它工作的很棒:) – Marta 2011-06-08 17:39:21

+1

toaddress?我不知道蟾蜍穿着连衣裙! – AaronLS 2011-08-31 15:00:14

+0

如果您试图使用$ .ajax来传递您的'HttpPostedFileBase'文件,该怎么办?我试图通过一个简单的$ .ajax调用来完成,但我的控制器上有一个空文件。它是我缺少的内容类型吗? – AdrianoRR 2011-10-05 17:26:31

3

类MAILMESSAGE应该能够处理你:

http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.attachments.aspx

或者,您在找你的实际代码的更具体的东西? (例如,如何读取文件并将其添加到附件中)?

+0

是的,我正在寻找更具体的东西 - 如何从形式读取文件,并将其添加为附件的电子邮件,然后发送此邮件。 – Marta 2011-06-08 16:36:28

+0

对不起,太慢了,但很高兴有人给你答案:) – 2011-06-08 18:47:36

1
if (model.Attachment != null && model.Attachment.ContentLength > 0) 
    { 
    foreach (HttpPostedFileBase item in fileUploader) 
     { 

     var attachment = new Attachment(model.Attachment.InputStream, model.Attachment.FileName); 
     mail.Attachments.Add(attachment); 
     } 
    } 
0

除了达人的答案,你不必在您的视图中硬编码您的文件上传的输入和标签。只是在那里拍这个:)

@Html.TextBoxFor(model => model.Attachment, new { type = "file" }) 
@Html.LabelFor(model => model.Attachment) 
相关问题