Создать тело письма из ввода пользователя, отправить письмо с контроллера? - PullRequest
0 голосов
/ 21 декабря 2018

В основном у меня есть 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; }

    }
}

Тогда в представлении IЯ создал форму с помощью @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 Ответ

0 голосов
/ 21 декабря 2018

Это должно начать.Существует (как минимум) четыре свойства для отправки электронной почты программно.Это fromaddres, toaddress, subject и body.

В вашей форме вы захотите воспользоваться проверочной суммой.Это обеспечивает проверку обратной связи для пользователя.Просто вставьте

@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()));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...