asp.net Среда Sendgrid.GetEnvironmentVariable(APIKey) возвращает нулевое значение / отказано в разрешении, неправильные учетные данные

#asp.net #webforms #sendgrid

#asp.net #веб-формы #sendgrid

Вопрос:

У меня есть asp.net приложение (webforms), и я использую SendGrid для отправки запланированных электронных писем.

Электронные письма не получены, и я получаю «отказано в разрешении, неправильные учетные данные», когда я проверяю response.Body.ReadAsStringAsync().Результат

Когда я проверяю значение среды.GetEnvironmentVariable(APIKey) возвращает нулевое значение.

Я получаю ключ SendGrid из webconfig, и он возвращает значение. Я также попытался добавить строку APIKey (SG …) непосредственно в код, и у меня возникла та же проблема.

Я предполагаю, что я должен где-то добавлять учетные данные sendgrid, но где?

Я уже использую этот ApiKey для отправки электронной почты из другого приложения, и это работает, однако я использую SmtpClient для отправки этих электронных писем.

Это код, который я использую:

     private async Task TestSendEmail(DateTime SendAt)
    {
        string APIKey = ConfigurationManager.AppSettings["SendgridAPIKey"].ToString();

        var datetimeOffset = new DateTimeOffset(SendAt, TimeSpan.Zero);
        var apiKey = Environment.GetEnvironmentVariable(APIKey);
        var client = new SendGridClient(apiKey);
        //var from = new EmailAddress(QueueEmailAdmin, "Example User");
        var from = new EmailAddress("FromEmail@gmail.com");
        var subject = "Test Email";
        var to = new EmailAddress("myemail@gmail.com", "Example User");
        var plainTextContent = "This is a test";
        var htmlContent = "<strong>This is a test</strong>";
        var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent);
        msg.SendAt = datetimeOffset.ToUnixTimeSeconds();
        var response = await client.SendEmailAsync(msg).ConfigureAwait(false);
        Console.WriteLine(msg.Serialize());
        Console.WriteLine(response.StatusCode);
        Console.WriteLine(response.Body.ReadAsStringAsync().Result);
    }
  

Комментарии:

1. Я очень смущен. У вас нет значения (ключа API) в web.config? Какую среду вы ожидаете. GetEnvironmentVariable() что делать? Разве вы не должны просто передать свою переменную «APIKey» (в вашей первой строке) конструктору SendGridClient?

2. Да, это то, что я делаю. Однако, если я посмотрю на значение var apiKey = Environment . GetEnvironmentVariable(APIKey); возвращает нулевое значение. Кажется, что он не передает информацию об окружающей среде. Я обновил сообщение, так как забыл упомянуть, что электронные письма не получены, я предполагаю, что это связано с тем, что значение среды не передается переменной apiKey.

3. Я не думаю, что GetEnvironmentVariable() делает то, что вы думаете, что он делает. Это для получения переменных среды, установленных глобально на вашем компьютере. Я предполагаю, что у вас есть фактический ключ API в вашем web.config, не так ли? В этом случае вам следует просто забыть строку var apiKey = Environment.GetEnvironmentVariable(APIKey); и использовать результат string APIKey = ConfigurationManager.AppSettings["SendgridAPIKey"].ToString(); в конструкторе var client = new SendGridClient(APIKey);

Ответ №1:

Вы должны написать так…

 Environment.SetEnvironmentVariable("SENDGRID_API_KEY", APIKey);

var apikey = Environment.GetEnvironmentVariable("SENDGRID_API_KEY");

var client = new SendGridClient(apikey);