Вот пример использования SMTP gmail, но если у вас есть собственный 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("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");
}
}
и, наконец, представление:
@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>
}
Дальнейшее усовершенствование этого кода будет заключаться во внешней передаче фактической отправки почты в хранилище, реализующей некоторый интерфейс и использующейDI, чтобы ослабить связь между логикой контроллера и логикой отправки почты.
Обратите внимание, что вы также можете настроить параметры SMTP в web.config:
<system.net>
<mailSettings>
<smtp from="fromaddress@gmail.com" deliveryMethod="Network">
<network
enableSsl="true"
host="smtp.gmail.com"
port="587"
userName="someaccount@gmail.com"
password="secret"
/>
</smtp>
</mailSettings>
</system.net>
, а затем просто:
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);
}