我的ASP.Net代码能否从sendgrid获得电子邮件已发送的确认?

我的ASP.Net代码能否从sendgrid获得电子邮件已发送的确认?,asp.net,asp.net-mvc,email,asp.net-web-api,sendgrid,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(

我在应用程序中使用了以下代码:

    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();

    }
公共异步任务寄存器(寄存器绑定模型)
{
var user=new ApplicationUser()
{
Email=model.Email,
FirstName=model.FirstName,
LastName=model.LastName,
RoleId=(int)ERole.Student,
用户名=model.UserName
};
var result=await UserManager.CreateAsync(用户、模型、密码);
if(result.successed)
{
var code=wait UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var callbackUrl=model.Server+
“/index.html”+
“?加载=确认邮件”+
“&userId=“+user.Id+
“&code=“+HttpUtility.UrlEncode(代码);
等待UserManager.SendEmailAsync(user.Id,“确认您的帐户”,“请单击此链接确认您的帐户:”);
}
如果(!result.successed)
{
返回GetErrorResult(结果);
}
返回Ok();
}

有没有办法从sendgrid获得消息已发送或任何其他信息的确认信息?

我认为sendgrid没有被设置为提供响应。但是,作为黑客,您可以通过向configSendGridasync类中添加以下代码来对自己进行密件抄送(因此至少知道电子邮件已发出

    .
    .
    .
    //this is your old code...
    myMessage.Text=message.Body;
    myMessage.Html = message.Body;

    //Add this...
    myMessage.AddBcc("yourEmail@domain.com");
希望这有帮助

您需要使用将确认发送回您,以确认邮件已送达收件人

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

它将接受JSON,然后您将按照自己的意愿处理它。文档将能够指导您如何接受JSON,然后将其转换为您可以使用的对象

您将被发布的JSON示例:

{
    "sg_message_id":"sendgrid_internal_message_id",
    "email": "john.doe@sendgrid.com",
    "timestamp": 1337197600,
    "smtp-id": "<4FB4041F.6080505@sendgrid.com>",
    "event": "delivered"
  },
{
“sg\u消息\u id”:“sendgrid\u内部消息\u id”,
“电子邮件”:“约翰。doe@sendgrid.com",
“时间戳”:1337197600,
“smtp id”:“,
“事件”:“已交付”
},
您可以从SendGrid接收的事件有:已处理、已删除、已交付、已延迟、跳出、打开、单击、垃圾邮件报告、取消订阅、组取消订阅、组重新订阅


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

通过SendGrid web API发送的电子邮件是异步的,因此要获得确认,您需要实现webhook。将把您选择的事件发布到您定义的URL。在这种情况下,您对“交付”事件感兴趣

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

然后将收到的帖子交给解析器以获取一个对象

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

从:

var parser=new-WebhookParser();
var events=parser.ParseEvents(json);
var webhookEvent=事件[0];
//共享基本属性
webhookEvent.EventType//Enum-事件的类型为Enum
WebVent.类别//IList-分配给事件的类别列表
webhookEvent.TimeStamp//DateTime—从unix时间转换的事件的日期时间
webhookEvent.UniqueParameters//IDictionary-键值唯一参数的映射
//事件特定属性
var clickEvent=webhookEvent作为clickEvent//基于EventType强制转换到父级
clickEvent.Url//string—用户单击的内容的url

我在SendGrid工作,所以如果有什么我可以帮忙的,请告诉我。

我会等一段时间,检查所有答案,并接受最能为大家解释的答案。非常感谢您花时间回答这个问题。如何将webhook与我发送的内容配对?当我发送邮件时,没有
sg\u messge\u id
作为回复,我需要保留并与webhook return匹配。非常感谢。很高兴能得到SendGrid工作人员的帮助。我会等一会儿,测试你的解决方案,如果我有任何问题,请告诉你。
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