我的ASP.Net代码可以从sendgrid确认已发送电子邮件吗?

时间:2015-07-04 08:19:37

标签: asp.net asp.net-mvc email asp.net-web-api sendgrid

我在我的应用程序中使用了这段代码:

    private async Task configSendGridasync(IdentityMessage message)
    {
        var myMessage = new SendGridMessage();
        myMessage.AddTo(message.Destination);
        myMessage.From = new System.Net.Mail.MailAddress(
                            "a@b.com", "AB Registration");
        myMessage.Subject = message.Subject;
        myMessage.Text = message.Body;
        myMessage.Html = message.Body;

        var credentials = new NetworkCredential(
                   ConfigurationManager.AppSettings["mailAccount"],
                   ConfigurationManager.AppSettings["mailPassword"]
                   );

        // Create a Web transport for sending email.
        var transportWeb = new Web(credentials);

        // Send the email.
        if (transportWeb != null)
        {
            await transportWeb.DeliverAsync(myMessage);
        }
        else
        {
            Trace.TraceError("Failed to create Web transport.");
            await Task.FromResult(0);
        }
    }

这里叫它:

    public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    {

        var user = new ApplicationUser()
        {
            Email = model.Email,
            FirstName = model.FirstName,
            LastName = model.LastName,
            RoleId = (int)ERole.Student,
            UserName = model.UserName
        };
        var result = await UserManager.CreateAsync(user, model.Password);
        if (result.Succeeded)
        {
            var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
            var callbackUrl = model.Server +
                              "/index.html" +
                              "?load=confirmEmail" +
                              "&userId=" + user.Id +
                              "&code=" + HttpUtility.UrlEncode(code);
            await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");
        }
        if (!result.Succeeded)
        {
            return GetErrorResult(result);
        }
        return Ok();

    }

有什么办法可以让sendgrid确认邮件已经发送或其他任何信息?

3 个答案:

答案 0 :(得分:11)

通过SendGrid Web API发送的电子邮件是异步的,因此要获得确认,您需要实现webhook。 Event Webhook会将您选择的事件发布到您定义的网址。在这种情况下,您感兴趣的是&#34;已交付&#34;事件

您需要在服务器上使用一些代码来处理传入的webhook,并根据结果执行任何逻辑,例如记录传递的事件。有一些社区贡献的库可以让您轻松创建webhook处理程序。我建议sendgrid-webhooks,这可以在nuget上找到。

然后接收传入的POST并将其交给解析器以获取对象。

由于您使用的是ASP.NET MVC,因此您可以在控制器内部使用[HttpPost]方法从SendGrid接收POST数据。然后你可以使用sendgrid-webhooks解析它。

来自sendgrid-webhooks readme

var parser = new WebhookParser();
var events = parser.ParseEvents(json);

var webhookEvent = events[0];

//shared base properties
webhookEvent.EventType; //Enum - type of the event as enum
webhookEvent.Categories; //IList<string> - list of categories assigned ot the event
webhookEvent.TimeStamp; //DateTime - datetime of the event converted from unix time
webhookEvent.UniqueParameters; //IDictionary<string, string> - map of key-value unique parameters

//event specific properties
var clickEvent = webhookEvent as ClickEvent; //cast to the parent based on EventType
clickEvent.Url; //string - url on what the user has clicked

我在SendGrid工作,所以如果有任何我可以提供的帮助,请告诉我。

答案 1 :(得分:5)

您需要使用Event Webhooks将确认信息发回给您,以确认邮件已发送给收件人。

您需要设置一个页面来接受来自Sendgrid的事件,例如:

https://yourdomain.com/email/hook会接受你想要的JSON。 Json.NET文档将能够指导您如何接受JSON,然后将其转换为您可以使用的对象。

您要发布的JSON示例:

{
    "sg_message_id":"sendgrid_internal_message_id",
    "email": "john.doe@sendgrid.com",
    "timestamp": 1337197600,
    "smtp-id": "<4FB4041F.6080505@sendgrid.com>",
    "event": "delivered"
  },

您可以从SendGrid收到的事件包括:已处理,已删除,已下达,已延期,退回,打开,点击,垃圾邮件报告,取消订阅,群组取消订阅,群组重新订阅。

通过所有这些选项,您可以使用webhook来处理Bounces,例如让某人为您尝试发送电子邮件的用户找到正确的电子邮件地址。

答案 2 :(得分:-1)

我不认为SendGrid已设置为响应。但是,作为一个hack,你可以通过在configSendGridasync类中添加以下代码来自己BCC(因此至少知道电子邮件已经消失了)

   $(document).ready(function() {
        homeCarousel.init();
    });

    homeCarousel.init = function () {
        if ($('.homeCarousel')) {
            $('.homeCarousel').slick({
                slidesToShow: 1,
                slidesToScroll: 1,
                autoplay: true,
                autoplaySpeed: 2500,
                infinite: true,
                pauseOnHover: true
            });
        }
    };

希望这有帮助!