【问题标题】:sendgrid multiple recipients c#sendgrid 多个收件人 c#
【发布时间】:2016-12-08 03:14:56
【问题描述】:

我正在使用此代码从 Web 应用程序发送电子邮件。只有一个收件人没有问题。我研究过使用来自https://sendgrid.com/docs/Integrate/Code_Examples/v3_Mail/csharp.html 的相同技术向多个收件人发送电子邮件。我尝试使用逗号分隔的字符串作为 destinatario(请参阅代码中的 args),即 you@example.com, she@example.com, he@example.com 但 SendGrid 只接受第一个收件人。我也尝试过使用数组,但结果很相似,SG 只接受最后一个收件人。传递收件人列表的正确方法是什么?

public class email
{
    public void enviar(string destinatario, string asunto, string contenido)
    {
        Execute(destinatario, asunto, contenido).Wait();
    }

    static async Task Execute(string destinatario, string asunto, string contenido)
    {
        string apiKey = "SG...............";
        dynamic sg = new SendGridAPIClient(apiKey);

        Email from = new Email("someone@example.com");
        string subject = asunto;
        Email to = new Email(destinatario);
        Content content = new Content("text/plain", contenido);           

        Mail mail = new Mail(from, subject, to, content);
        dynamic response = await sg.client.mail.send.post(requestBody: mail.Get());
    }


}

【问题讨论】:

  • 不要使用Task.Wait()。它会造成死锁。您需要在任何地方使用async。 (也不要使用async void
  • 也不要使用dynamic

标签: c# email sendgrid


【解决方案1】:

以下代码对我有用

using SendGrid;
using SendGrid.Helpers.Mail;

public async Task<bool> sendEmailMonthlyReports(List<string> emailAddress, string filePath)
{
try
{
    var client = new SendGridClient("API Key");
    var msg = new SendGridMessage()
    {
        From = new EmailAddress("from@xxxx.com", "xxxxx"),
        Subject = "xxxx",
        HtmlContent = ""
    };

    var tosList = new List<EmailAddress>();
    if (emailAddress.Count() > 0)
    {
        foreach (var i in emailAddress)
        {
            tosList.Add(new EmailAddress(i));
        }
    }

// you can skip this attachment part if you don't have attachments

        using (var webClient = new WebClient())
        {
            if (filePath != null && filePath != "")
            {
                var bytes = webClient.DownloadData(filePath);
                var file = Convert.ToBase64String(bytes);
                msg.AddAttachment("exx.pdf", file);
             }
        }

    var result2 = MailHelper.CreateSingleEmailToMultipleRecipients(msg.From,tosList,msg.Subject,"",msg.HtmlContent);
    result2.Attachments = msg.Attachments;
    msg.SetClickTracking(false, false);

    var result = await client.SendEmailAsync(result2);
    if (result.StatusCode.ToString() == "Accepted")
    {
        return true;
    }
    return false;
}
catch (Exception ex)
{
    var exe = ex.ToString();
    return false;
}
}

【讨论】:

    【解决方案2】:

    为多个收件人发送邮件语法:

    命名空间:

    using SendGrid;
    using SendGrid.Helpers.Mail;
    

    语法:

    var client = new SendGridClient("XXXXXXX");
    var msg = new SendGridMessage() {
      From = new EmailAddress("Yourmail@address", " your Address name"),
        Subject = subject,
        PlainTextContent = message,
        HtmlContent = message
    };
    
    var timeToSend = DateTime.Now
    
    // to add time to datetime refer  https://stackoverflow.com/questions/2146296/adding-a-time-to-a-datetime-in-c-sharp
    
    if (timeToSend != null && timeToSend.Value.Date >= DateTime.Now.Date) {
      var offset = new DateTimeOffset(timeToSend.Value);
      long sendAtUnixTime = offset.ToUnixTimeSeconds();
      msg.SendAt = sendAtUnixTime;
    }
    var emails = to.Split(';');
    foreach(var email in emails) {
      msg.AddTo(new EmailAddress(email));
    }
    if (!string.IsNullOrEmpty(bcc)) {
      msg.AddBcc(new EmailAddress(bcc));
    }
    var response = await client.SendEmailAsync(msg);
    

    【讨论】:

      【解决方案3】:
      public static SendGridMessage CreateSingleEmailToMultipleRecipients(EmailAddress from, List<EmailAddress> tos, string subject, string plainTextContent, string htmlContent, bool showAllRecipients = false);
      

      【讨论】:

        【解决方案4】:

        您需要为此添加个性化列表。以下代码对我有用。

        var apiKey = Environment.GetEnvironmentVariable("SENDGRID_API_KEY");
        var client = new SendGridClient(apiKey);
        var msg = new SendGridMessage()
        {
            From = new EmailAddress("sender@email.com", "Sender Name"),
            Subject = "Subject",
            PlainTextContent = "Text for body",
            HtmlContent = "<strong>Hello World!",
            Personalizations = new List<Personalization>
            {
                 new Personalization
                 {
                      Tos = new List<EmailAddress> 
                      {
                           new EmailAddress("abc@email.com", "abc"),
                           new EmailAddress("efg@email.com", "efg")
                      }
                 }
             }
        };
        
        var response = await client.SendEmailAsync(msg);
        

        更多详情请关注Mail Send

        【讨论】:

        • 很好的解决方案!
        【解决方案5】:

        您的问题的答案可以在库的source 代码中找到,有两个构造函数来创建一个 Mail 对象。如您所述,您使用的构造函数仅适用于向一个收件人发送邮件。您必须使用无参数构造函数。

        var mail = new Mail();
        mail.Subject = "subject";
        mail.From = new Email("from@example.com", "fromName");
        mail.AddContent(new Content("text/html", "<p>this is a mail<p>"));
        mail.AddPersonalization(personalization);
        

        实际收件人是通过Personalization对象添加的:

        var personalization = new Personalization();
        foreach (Email email in emailList)
        {
            personalization.AddTo(email);
        }
        

        此个性化对象还允许进行更多自定义,例如将收件人添加为抄送或密件抄送。

        【讨论】:

          猜你喜欢
          • 2017-08-27
          • 1970-01-01
          • 1970-01-01
          • 2012-01-12
          • 2018-11-09
          • 2012-10-23
          • 2017-03-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多