[当我添加到新表MVC 5时通过SendGrid发送电子邮件

问题描述 投票:0回答:1

[当我在“注册”表中带一名未来的学生并将我分配给新的“群组”时,我想通过SendGrid发送电子邮件,因此,当我将该学生添加到“ CohortsSusbcriptions”表中时。我不熟悉API调用,所以我不知道我必须在控制器中的什么位置以及如何进行操作。这是我的代码:

        public ActionResult AddToCohort([Bind(Include = "ID,CohortId,RegistrationId,Notes,CoachId,ContractStatus,DepositStatus,PortalMemberId,ProfileImageURL,ProfileComment,PersonalityScoreD,PersonalityScoreI,PersonalityScoreS,PersonalityScoreC,EnglishProefficiencyBefore,EnglishProefficiencyAfter,SlackHandle,GraduationStatus,GitHubHandle")] CohortSubscriptions cohortSubscriptions)
        {
            if (ModelState.IsValid)
            {
                var newcohortAssignments = cohortSubscriptions;
                newcohortAssignments.ContractStatus = "Pending";
                newcohortAssignments.DepositStatus = "Pending";
                newcohortAssignments.GraduationStatus = "Not Graduated";

                db.CohortSubscriptions.Add(cohortSubscriptions);
                db.SaveChanges();


                return RedirectToAction("CohortAssignments", "Home");
            }

            ViewBag.CohortId = new SelectList(db.Cohorts, "ID", "Name", cohortSubscriptions.CohortId);

            return View(cohortSubscriptions);
        }
model-view-controller asp.net-mvc-5 add sendgrid
1个回答
0
投票

如果尚未安装SendGrid的Nuget软件包,请安装它。

[接下来,对于他们的API,没有具体问题,我不确定该说些什么。我将发布一些代码。

与System.Net.Mail中的API相比,它们的API使用起来有点复杂。所以我写了一些代码,将System.Net.Mail.MailMessage转换为SendGridMessage。然后创建MailMessage对象,并使用转换代码发送电子邮件。

基本上这就是我要插入您的代码中的内容。

public ActionResult AddToCohort([Bind(Include = "ID,CohortId,RegistrationId,Notes,CoachId,ContractStatus,DepositStatus,PortalMemberId,ProfileImageURL,ProfileComment,PersonalityScoreD,PersonalityScoreI,PersonalityScoreS,PersonalityScoreC,EnglishProefficiencyBefore,EnglishProefficiencyAfter,SlackHandle,GraduationStatus,GitHubHandle")] CohortSubscriptions cohortSubscriptions)
{
    if (ModelState.IsValid)
    {
        var newcohortAssignments = cohortSubscriptions;
        newcohortAssignments.ContractStatus = "Pending";
        newcohortAssignments.DepositStatus = "Pending";
        newcohortAssignments.GraduationStatus = "Not Graduated";

        db.CohortSubscriptions.Add(cohortSubscriptions);
        db.SaveChanges();

        using (var message = new MailMessage())
        {
            message.From = new MailAddress("[email protected]");
            message.To.Add("[email protected]");
            message.Body += "Hello world!";
            message.IsBodyHtml = true;

            MailHelper.SendMail(message);
        }

        return RedirectToAction("CohortAssignments", "Home");
    }

    ViewBag.CohortId = new SelectList(db.Cohorts, "ID", "Name", cohortSubscriptions.CohortId);

    return View(cohortSubscriptions);
}

以下是我的转换代码。它在名为ApiKey的AppSetting中的Web.Config中查找您的API密钥。哦,它也使用JetBrains.Annotations。因此,请安装该Nuget软件包或从代码中删除我的注释。

MailHelper.cs

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Text;
using JetBrains.Annotations;
using SendGrid;
using SendGrid.Helpers.Mail;
using Attachment = SendGrid.Helpers.Mail.Attachment;

[assembly: CLSCompliant(true)]
namespace Bc3.Mail
{
    /// <summary>
    /// Helper to send messages created with
    /// System.Net.Mail.Message through SendGrid
    /// </summary>
    [PublicAPI]
    public static class MailHelper
    {
        /// <summary>
        /// The helper function that send the MailMessage through SendGrid.
        /// It's successful when HttpStatusCode.OK or HttpStatusCode.Accepted
        /// is returned
        /// </summary>
        /// <param name="mail"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        [NotNull]
        public static Tuple<HttpStatusCode, string> SendMail([NotNull]MailMessage mail)
        {
            if (mail is null)
                throw new ArgumentNullException(nameof(mail));

            var from = mail.From;
            if (from is null)
                return new Tuple<HttpStatusCode, string>(HttpStatusCode.BadRequest,
                    "No from address");

            if (mail.To.Count == 0)
                return new Tuple<HttpStatusCode, string>(HttpStatusCode.BadRequest,
                    "No to address");
            var to = mail.To[0];
            if (to is null)
                return new Tuple<HttpStatusCode, string>(HttpStatusCode.BadRequest,
                    "No to address");

            SendGridMessage message;
            if (mail.To.Count == 1)
            {
                message = SendGrid.Helpers.Mail.MailHelper.CreateSingleEmail(ConvertAddress(from),
                    ConvertAddress(to),
                    mail.Subject,
                    string.Empty,
                    mail.Body);
            }
            else
            {
                var tos = from address in mail.To
                          where address is null == false
                          select ConvertAddress(address);

                message = SendGrid.Helpers.Mail.MailHelper.CreateSingleEmailToMultipleRecipients(
                    ConvertAddress(from),
                    tos.ToList(),
                    mail.Subject,
                    string.Empty,
                    mail.Body);
            }

            var personalization = message?.Personalizations?[0];
            if (personalization is null)
                return new Tuple<HttpStatusCode, string>(HttpStatusCode.InternalServerError, "Error creating email message");

            if (mail.CC.Count != 0)
            {
                personalization.Ccs = new List<EmailAddress>();
                foreach (var cc in mail.CC)
                    personalization.Ccs.Add(ConvertAddress(cc));
            }
            if (mail.Bcc.Count != 0)
            {
                personalization.Bccs = new List<EmailAddress>();
                foreach (var bcc in mail.Bcc)
                    personalization.Bccs.Add(ConvertAddress(bcc));
            }

            if (mail.Attachments.Count != 0)
            {
                if (message.Attachments is null)
                    message.Attachments = new List<Attachment>();

                foreach (var attachment in mail.Attachments)
                {
                    if (attachment.ContentStream is null)
                        continue;

                    var sendGridAttachment = new Attachment();
                    using (var sr = new StreamReader(attachment.ContentStream))
                        sendGridAttachment.Content = Convert.ToBase64String(
                            Encoding.UTF8.GetBytes(
                                sr.ReadToEnd()));

                    sendGridAttachment.Filename = attachment.Name;
                    sendGridAttachment.Type = attachment.ContentType.MediaType;

                    message.Attachments.Add(sendGridAttachment);
                }
            }

            if (message.Headers is null)
                message.Headers = new Dictionary<string, string>();

            foreach (var key in mail.Headers.AllKeys)
            {
                var header = mail.Headers[key];
                if (header is null)
                    continue;

                if (message.Headers.ContainsKey(header) == false)
                    message.Headers.Add(key, header);
            }

            var (httpStatusCode, errorMessage) = SendMessage(message);

            return new Tuple<HttpStatusCode, string>(httpStatusCode, errorMessage);
        }

        [NotNull]
        private static Tuple<HttpStatusCode, string> SendMessage([NotNull]SendGridMessage message)
        {
            try
            {
                var apiKey = ConfigurationManager.AppSettings["ApiKey"];
                var client = new SendGridClient(apiKey);

                var sendTask = client.SendEmailAsync(message);
                if (sendTask is null)
                    return new Tuple<HttpStatusCode, string>(HttpStatusCode.BadRequest, "Email status not received");

                sendTask.Wait();
                var response = sendTask.Result;
                if (response is null)
                    return new Tuple<HttpStatusCode, string>(HttpStatusCode.BadRequest, "Email status not received");

                if (response.StatusCode == HttpStatusCode.OK
                    || response.StatusCode == HttpStatusCode.Accepted)
                    return new Tuple<HttpStatusCode, string>(response.StatusCode, null);

                if (response.Body is null)
                    return new Tuple<HttpStatusCode, string>(response.StatusCode, null);

                var task = response.Body.ReadAsStringAsync();
                task.Wait();

                return new Tuple<HttpStatusCode, string>(response.StatusCode, task.Result);
            }
            catch (Exception exception)
            {
                return new Tuple<HttpStatusCode, string>(HttpStatusCode.InternalServerError, exception.Message);
            }
        }
        [NotNull]
        private static EmailAddress ConvertAddress([NotNull]MailAddress address)
        {
            return new EmailAddress(address.Address, address.DisplayName);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.