繁体   English   中英

Sendgrid C# 批量 email X-SMTPAPI header 不工作

[英]Sendgrid C# bulk email X-SMTPAPI header not working

我正在尝试使用 SendGrid 将 email 发送给 ASP.Net C# web 应用程序中的多个收件人

根据 SendGrid 文档,我需要在 JSON 格式的字符串中将 X-SMTPAPI header 添加到我的消息中。 我这样做,首先检查我刚刚添加了一个手写字符串,然后以编程方式构建我的 json email 列表,这是我的代码:

string header  = "{\"to\": [\"emailaddress2\",\"emailaddress3\"], \"sub\": { \"%name%\": [\"Ben\",\"Joe\"]},\"filters\": { \"footer\": { \"settings\": { \"enable\": 1,\"text/plain\": \"Thank you for your business\"}}}}";

        string header2 = Regex.Replace(header, "(.{72})", "$1" + Environment.NewLine);

        var myMessage3 = new SendGridMessage();

        myMessage3.From = new MailAddress("emailaddress1", "FromName");
        myMessage3.Headers.Add("X-SMTPAPI", header2);
        myMessage3.AddTo("emailaddress4");
        myMessage3.Subject = "Test subject";
        myMessage3.Html = "Test message";
        myMessage3.EnableClickTracking(true);

        // Create credentials, specifying your user name and password.
        var credentials = new NetworkCredential(ConfigurationManager.AppSettings["xxxxx"], ConfigurationManager.AppSettings["xxxxx"]);

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

        // Send the email, which returns an awaitable task.
        transportWeb.DeliverAsync(myMessage3);

但它似乎只是忽略了我的 header,并将 email 发送到“addto”中使用的一个 email“emailaddress4”。 根据文档,如果 header JSON 被错误解析,则 SendGrid 会向“发件人”字段中设置的 email 地址发送有关错误的 email,但我没有收到有关任何错误的 email。

有人知道吗?

对于使用最新的 9.x c# 库的我来说,解决这个问题的唯一方法是使用 MailHelper static 函数,如下所示:

var client = new SendGridClient(HttpClient, new SendGridClientOptions { ApiKey = _sendGridApiKey, HttpErrorAsException = true });

            SendGridMessage mailMsg;
            var recipients = to.Split(',').Select((email) => new EmailAddress(email)).ToList();
            if (recipients.Count() > 1)
            {
                mailMsg = MailHelper.CreateSingleEmailToMultipleRecipients(
                new EmailAddress(from),
                recipients,
                subject,
                "",
                body);
            }
            else
            {
                mailMsg = MailHelper.CreateSingleEmail(
                new EmailAddress(from),
                recipients.First(),
                subject,
                "",
                body);

            }

            if (attachment != null)
            {
                mailMsg.AddAttachment(attachment.Name,
                                  attachment.ContentStream.ToBase64(),
                                  attachment.ContentType.MediaType);
            }

            var response = await client.SendEmailAsync(mailMsg).ConfigureAwait(false);

            if (response.IsSuccessStatusCode)
            {
                _log.Trace($"'{subject}' email to '{to}' queued");
                return true;
            }
            else {
                throw new HttpRequestException($"'{subject}' email to '{to}' not queued");
            }

我不确定为什么您的FROM地址不会收到任何错误,但是JSON包含以下缺陷:

  • ,靠近结尾会使字符串无效json
  • %name%中第一个%周围的空格,可能使sendgrid认为这是无效的替换标签
  • 如果使用X-SMTPAPI标头指定多个收件人,则不应使用AddTo()添加标准的SMTP TO

除此之外,您没有将标头包装为72个字符(请参见文档中的示例 )。

我认为,但是X-SMTPAPI文档讨论了将标头作为JSON传递,API本身希望它作为包含Ienumerable字符串的参数。 因此,工作代码为:

var myMessage3 = new SendGridMessage();           


        myMessage3.From = new MailAddress("email4@email.com", "Test Sender");

        myMessage3.AddTo("email2@email.com");
        myMessage3.Subject = "Új klubkártya regisztrálva";
        myMessage3.Html = "Teszt üzenet";
        myMessage3.EnableClickTracking(true);

        /* SMTP API
             * ===================================================*/
        // Recipients


        var addresses = new[]{

           "email2@email.com", "email3@email.com"

            };

        //string check = string.Join(",", addresses);


        myMessage3.Header.SetTo(addresses);


        // Create credentials, specifying your user name and password.
        var credentials = new NetworkCredential(ConfigurationManager.AppSettings["xxxxxxx"], ConfigurationManager.AppSettings["xxxxxxxxx"]);

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

        // Send the email, which returns an awaitable task.
        transportWeb.DeliverAsync(myMessage3);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM