Создать тело письма из ввода пользователя, отправить письмо с контроллера?
По сути, у меня есть html-форма, из которой я хочу получить пользовательский ввод, сгенерировать тело письма и отправить электронное письмо. Я никогда не программировал ничего подобного раньше, поэтому провел последние несколько дней, исследуя различные способы отправки электронных писем с веб-сайта, но ни один из найденных примеров не относится к моей конкретной ситуации. Дурачиться с разными методами, которые я нашел, тоже не оказалось плодотворным.
На данный момент у меня есть модель, которая объявляет каждую строку:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace myWebsite.Models
{
public class ServiceRequest
{
[Key]
public int serviceRequestID { get; set; }
[Required]
public string serviceRequestName { get; set; }
[Required]
public string serviceRequestEmail { get; set; }
public string serviceRequestCompany { get; set; }
public string serviceRequestAddress { get; set; }
[Required]
public string serviceType { get; set; }
public string serviceRequestCity { get; set; }
public string serviceRequestState { get; set; }
public string serviceRequestZip { get; set; }
[Required]
public string serviceRequestNumber { get; set; }
public string serviceRequestComments { get; set; }
}
}
Затем в представлении я создал форму, используя @html помощники, чтобы связать строки из моей модели с полями ввода пользователя:
@model myWebsite.ServiceRequest
@using (Html.BeginForm("Email", "ServiceRequestsController", FormMethod.Post))
{
<div class="servicesReq">
<div class="serviceReqForm">
<div class="col-left">
<label>
<span class="required">* </span><span>Name:</span><br />
@Html.TextBoxFor(model => model.serviceRequestName)
</label><br />
<label>
<span class="required">* </span><span>Email:</span><br />
@Html.TextBoxFor(model => model.serviceRequestEmail)
</label><br />
<label>
<span>Company:</span><br />
@Html.TextBoxFor(model => model.serviceRequestCompany)
</label><br />
<label>
<span>Address:</span><br />
@Html.TextBoxFor(model => model.serviceRequestAddress)
</label><br /><br />
</div>
<div class="serviceTypeGrid">
<span class="required">* </span><span>Please choose what type of servicing you require:</span><br /><br />
</div>
<div class="col-left2">
<label class="serviceType">
@Html.RadioButton("serviceType", "Electrical") Electrical<br/>
@Html.RadioButton("serviceType", "Lighting") Lighting<br />
@Html.RadioButton("serviceType", "Energy") Energy<br />
@Html.RadioButton("serviceType", "Multiple") Multiple
</label><br /><br />
</div>
<div class="col-right">
<label>
<span>City:</span><br />
@Html.TextBoxFor(model => model.serviceRequestCity)
</label><br />
<label>
<span>State:</span><br />
@Html.TextBoxFor(model => model.serviceRequestState)
</label><br />
<label>
<span>Zip Code:</span><br />
@Html.TextBoxFor(model => model.serviceRequestZip)
</label><br />
<label>
<span class="required">* </span><span>Phone Number:</span><br />
@Html.TextBoxFor(model => model.serviceRequestNumber)
</label><br />
</div>
<label class="commentText">
<span>Comments:</span><br />
@Html.TextAreaFor(model => model.serviceRequestComments, new { @class = "servReqComment" })
</label>
<div class="formSubmitButton">
<input type="submit" value="Submit" /><br />
<br />
</div>
</div>
</div>
}
И, наконец, моя логика контроллера - вот где я почти полностью потерян:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Text;
using System.Threading;
using System.Web;
using System.Web.Mvc;
using myWebsite.Models;
namespace myWebsite.Controllers
{
public class ServiceRequestsController : Controller
{
private CuttingEdgeWebsite2_0Context db = new CuttingEdgeWebsite2_0Context();
// GET: ServiceRequests
public ActionResult ServiceRequest()
{
return View();
}
}
}
Как я уже говорил, я искал несколько разных способов, но все они включали жесткое программирование тела письма. Все, что я пробовал с моими ограниченными знаниями, я не могу сгенерировать тело из пользовательского ввода в моей форме. Хотя у меня есть своего рода идея о том, как на самом деле отправлять почту, любое глубокое разъяснение этого процесса также было бы очень полезно. Если есть какая-либо информация, которую я не предоставил здесь, которая может оказаться полезной, пожалуйста, дайте мне знать.
1 ответ
Это должно начать ваше. Существует (как минимум) четыре свойства для отправки электронной почты программно. Это fromaddres, toaddress, предмет и тело.
В вашей форме вы захотите воспользоваться проверочной суммой. Это обеспечивает проверку обратной связи для пользователя. Просто вставьте
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
сразу после вашей строки BeginForm
Исходя из вашего кода, такие вещи будут работать. В вашем контроллере вам нужен метод для обработки публикации данных вашей формы и какой-то метод для отправки электронной почты (должен быть отдельным методом для хорошего дизайна).
[HttpPost]
public async Task Email(ServiceRequest servicerequest)
{
try
{
string from = "youremailadress@gmail.com"
string to = servicerequest.serviceRequestEmail;
string subject = servicerequest.serviceType;
//it's up to you what you want to put in the body
string body = String.Format("city:{0}\n\nComments:{1}\n\n
PhoneNumber\n\n",serviceRequest.serviceRequestCity,
serviceRequest.serviceRequestComments, serviceRequest.serviceRequestNumber);
string email = System.Configuration.ConfigurationManager.AppSettings["email"];
string password =
System.Configuration.ConfigurationManager.AppSettings["emailpassword"];
string server =
System.Configuration.ConfigurationManager.AppSettings["emailserver"];
string emailport =
System.Configuration.ConfigurationManager.AppSettings["emailport"];
int port = Int32.Parse(emailport);
var client = new SmtpClient(server, port)
{
Credentials = new NetworkCredential(email, password),
EnableSsl = true
};
await client.SendMailAsync("from", to, subject, body);
Console.WriteLine("Sent");
}
catch (Exception e)
{
Console.WriteLine(String.Format("Error occured at {0}. Full stack trace of error {1}", System.DateTime.Now.ToString(),e.ToString()));
}
}