Search code examples
c#sendgridsendgrid-api-v3sendgrid-templatessendgrid-api-v2

send email using SendGrid hung c#


i try to send email using sendgrid api, here is my code:

using SendGrid;
using SendGrid.Helpers.Mail;
public static string Send(
            string APIKey,
             string Message,
              string SenderEmail,
              List<string> Receivers,
              string Subject)
        {
            try
            {
                Task<string> b = Execute(APIKey,
                     Message,
                      SenderEmail,
                     Receivers,
                      Subject);
                b.Wait();
                if (b.Result == "True")
                {
                    return "True";
                }
                else
                {
                    return b.Result;
                }
            }
            catch (Exception ex)
            {
                return ex.Message + " - " + ex.StackTrace.ToString();
            }
        }

        private static async Task<string> Execute(
            string APIKey,
              string Message,
               string SenderEmail,
               List<string> Receivers,
               string Subject)
        {
            try
            {
                var client = new SendGridClient(APIKey);
                var from = new EmailAddress(SenderEmail);
                var subject = Subject;
                var to = new EmailAddress(Receivers[0]);
                var plainTextContent = Message;
                var htmlContent = "<strong>" + Message + "</strong>";
                var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
                MessageBox.Show("before");
                var response = await client.SendEmailAsync(msg).ConfigureAwait(true);
                return response.IsSuccessStatusCode + "";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + " - " + ex.StackTrace.ToString());
                return ex.Message + " - " + ex.StackTrace.ToString();
            }
        }

but it hung forever no any response, knowing when i send via sendgrid smtp it working fine,when i set ConfigureAwait to false ,it return error:

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

here is the exception:

An error occurred while sending the request. -    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at SendGrid.Helpers.Reliability.RetryDelegatingHandler.<SendAsync>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at SendGrid.BaseClient.<MakeRequest>d__20.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at SendGrid.BaseClient.<RequestAsync>d__21.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at SendGrid.BaseClient.<SendEmailAsync>d__22.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at EasyWhatsappSender.Classes.EmailClasses.SenderEmailClasses.SendGridSender.<Execute>d__1.MoveNext() in E:\my projects do not delete it\EasySender\Classes\EmailClasses\SenderEmailClasses\SendGridSender.cs:line 64

i use dot net framework 4.7 and sendgrid 9.28.1, please help me to fix the problem.


Solution

  • since no one answer my question , i end up using normal HttpWebRequest , and it worked fine:

     public static string SendViaAPI(
               string APIKey,
               string Message,
               string SenderEmail,
               List<string> Receivers,
               string subject)
            {
                try
                {
                    string ReceiversList = "";
                    foreach (string Receiver in Receivers)
                    {
                        if (ReceiversList == "")
                        {
                            ReceiversList = @"{
                          'email': '" + Receiver + @"'
                        }";
                        }
                        else
                        {
                            ReceiversList +=","+ Environment.NewLine+ @"{
                          'email': '" + Receiver + @"'
                        }";
    
                        }
                    }
                    
                    var data = @"{
                  'personalizations': [
                    {
                      'to': [
                        "+ReceiversList+@"
                      ],
                      'subject': '" + subject + @"'
                    }
                  ],
                  'from': {
                    'email': '" + SenderEmail + @"'
                  },
                  'content': [
                    {
                      'type': 'text/html',
                      'value': '" + Message + @"'
                    }
                  ]
                }";
                 
                    var json = JsonConvert.DeserializeObject<object>(data);
    
                    string address = "https://api.sendgrid.com/v3/mail/send";
    
    
                    ServicePointManager.Expect100Continue = true;
                    const SecurityProtocolType tls13 = (SecurityProtocolType)12288;
    
                    System.Net.ServicePointManager.SecurityProtocol =
                        System.Net.SecurityProtocolType.Tls11
                        | System.Net.SecurityProtocolType.Ssl3
                        | System.Net.SecurityProtocolType.Tls
                        | System.Net.SecurityProtocolType.Tls12
                        | tls13;
    
                    // Skip validation of SSL/TLS certificate
                    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
    
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
                    request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
                    request.Method = "POST";
                    request.KeepAlive = false;
                    request.ContentType = "application/json";
                    request.Headers.Add("Authorization", "Bearer " + APIKey);
                    using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                    {
                        streamWriter.Write(json);
                    }
    
                    var httpResponse = (HttpWebResponse)request.GetResponse();
                    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                    {
                        return streamReader.ReadToEnd();
                    }
    
                }
                catch (Exception ex)
                {
                    return ex.Message + " - " + ex.StackTrace.ToString();
    
                }
            }