Использование SendGrid в консольном приложении

Можно ли использовать Send Grid в консольном приложении на C#? Мой код не работает, и я действительно не знаю, почему. Не могли бы вы помочь мне?

using System;
using System.Net;
using System.Net.Mail;
using SendGrid;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create the email object first, then add the properties.
            var myMessage = new SendGridMessage();
            myMessage.From = new MailAddress("adresfrom@example.com", "It's me");
            myMessage.AddTo("adressj@gmail.com");
            myMessage.Subject = "Testing the SendGrid Library";
            myMessage.Text = "Content of the e-mail";

            var username = "my_sendgrid_username";
            var password = "my_sendgrid_password";

            var credentials = new NetworkCredential(username, password);

            // Create a Web transport for sending email.
            var transportWeb = new Web(credentials);
            transportWeb.DeliverAsync(myMessage);
            Console.ReadLine();
        }
    }
}

4 ответа

Пара моментов о вашем коде:

  • Вы не ожидаете вызова DeliverAsync() - это может вызвать определенные проблемы. Назовите это так:

await transportWeb.DeliverAsync(mail).ConfigureAwait(true);

  • Поправьте меня, если я не прав, но в Azure вы не можете использовать NetworkCredentials, поскольку они не отправляются должным образом в API SendGrid. Мы используем ключ API для настройки объекта transportWeb.

Попробуйте этот фиксированный код и дайте нам знать, как он работает:

var transportWeb = new Web(<your-api-key-here>);
await transportWeb.DeliverAsync(myMessage).ConfigureAwait(true);

На самом деле попробуйте это:

    static void Main()
    {
        SendEmail().Wait();
    }

    static async Task SendEmail()
    {
        var myMessage = new SendGridMessage();
        myMessage.From = new MailAddress("from_emal");
        myMessage.AddTo("to_email");
        myMessage.Subject = "Testing the SendGrid Library";
        myMessage.Html = "<p>Hello World!</p>";
        myMessage.Text = "Hello World plain text!";

        var credentials = new NetworkCredential("sendgrid_user", "sendgrid_pass");
        var transportWeb = new Web(credentials);
        await transportWeb.DeliverAsync(myMessage);            
    }

Похоже, вам следует дождаться метода DeliveryAsync. В методе Main при удалении Wait() он НЕ будет отправлять электронную почту. Если вы используете Wait(), он отправит.

Это работает в консольном приложении, но вам нужно назвать его по какой-то причине:

transportWeb.DeliverAsync(msg).Wait()

Подробнее здесь: https://github.com/sendgrid/sendgrid-csharp/issues/154

Попробуйте использовать SendGrid API и подключиться к нему через HttpClient:

  using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("https://api.sendgrid.com");
            var content = new FormUrlEncodedContent(new[] 
        {
            new KeyValuePair<string, string>("api_key", "YOUR PASSWORD"),
            new KeyValuePair<string, string>("api_user", "USER NAME"),
            new KeyValuePair<string, string>("from", "some@body.com"),
            new KeyValuePair<string, string>("to", "some@body.com"),
            new KeyValuePair<string, string>("subject", "Whatever"),
            new KeyValuePair<string,string>("text", "You can use 'html' :)")

        });
            var result = client.PostAsync("/api/mail.send.json", content).Result;
            string resultContent = result.Content.ReadAsStringAsync().Result;
            Debug.WriteLine(resultContent);
        }

Измените значения, как ваши, это работает для меня..

Другие вопросы по тегам