sendgrid c#批量电子邮件x-smtpapi标头无法正常工作



我试图将带有sendgrid的电子邮件发送给ASP.NET C#Web应用程序中的多个收件人

根据SendGrid文档,我需要在JSON格式字符串中添加X-SMTPAPI标头。我这样做了,首先检查我刚刚添加了一个手动的字符串,然后构建我的JSON电子邮件列表,这是我的代码:

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

,但它似乎只是忽略了我的标题,并将电子邮件发送到" Addto"中使用的一封电子邮件" emailAddress4"。根据文档,如果错误解析了标题JSON,则SendGrid将有关该错误的电子邮件发送到"从"字段中设置的电子邮件地址,但我没有收到有关任何错误的电子邮件。

有人有任何想法吗?

使用最新的9.x c#库对我来说,我唯一可以解决此方法的方法是使用MailHelper静态函数:

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");
            }

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

  • ,末端使字符串无效JSON
  • abour in%name%%的距
  • 如果您使用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);

最新更新