Form with attachments upload and email sending

后端 未结 4 1456
长情又很酷
长情又很酷 2021-02-01 06:20

I need to make form with a textarea and an image upload field. When somebody submit it I want it to send email (with text from textarea)

4条回答
  •  野的像风
    2021-02-01 07:03

    Here's an example using gmail's SMTP but if you have your own SMTP server you could easily adapt the code.

    As always I would start with a view model:

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

    then a controller:

    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("someaccount@gmail.com", "secret");
                var mail = new MailMessage();
                mail.From = new MailAddress("fromaddress@gmail.com");
                mail.To.Add("toaddress@gmail.com");
                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");
        }
    }
    

    and finally a view:

    @model QuestionViewModel
    
    @using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        @Html.ValidationSummary(true)
        
    @Html.LabelFor(x => x.Question) @Html.TextAreaFor(x => x.Question)
    }

    A further improvement to this code would be to externalize the actual sending of the mail into a repository implementing some interface and using DI in order to weaken the coupling between the controller logic and the mail sending logic.

    Note that you can also configure your SMTP settings in web.config:

    
        
          
            
          
        
    
    

    and then simply:

    using (var client = new SmtpClient())
    {
        var mail = new MailMessage();
        mail.To.Add("toaddress@gmail.com");
        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);
    }
    

提交回复
热议问题