Проблемы с отправкой электронной почты с помощью sendgrid после регистрации учетной записи в веб-приложении

Я создал проект основного веб-приложения asp.net (mvc), в который я интегрирую пакет nuget SendGrid. По какой-то причине всякий раз, когда я регистрирую учетную запись и нажимаю «Отправить», она сообщает мне

введите здесь описание изображения

Итак, когда я иду проверять свою электронную почту, она не появляется, даже папка нежелательной почты. From = new EmailAddress(), я использовал несуществующий адрес электронной почты, и он не работал. Поэтому я решил использовать адрес электронной почты, который я использовал при создании учетной записи sendgrid, для получения ключа API, и это тоже не сработало, даже после создания совершенно нового электронного письма.

Я что-то делаю, из-за чего электронное письмо не отправляется на адрес электронной почты, который я указал при регистрации учетной записи?

Внутри Startup.cs я добавил транзиент для sendgrid:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseMigrationsEndPoint();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
                endpoints.MapRazorPages();
            });
        }

Мой класс EmailSenderService.cs обрабатывает отправку электронной почты:

public class EmailSenderService : IEmailSender
    {

        public EmailSenderService(IOptions<AuthMessageSenderOptions> optionsAccessor)
        {
            Options = optionsAccessor.Value;
        }

        public AuthMessageSenderOptions Options { get; }

        public Task SendEmailAsync(string email, string subject, string message)
        {
            return Execute(Options.SendGridKey, subject, message, email);
        }

        public Task Execute(string apiKey, string subject, string message, string email)
        {
            var client = new SendGridClient(apiKey);
            var msg = new SendGridMessage()
            {
                From = new EmailAddress("[email protected]", "Identity Demo"),
                Subject = subject,
                PlainTextContent = message,
                HtmlContent = message
            };
            msg.AddTo(new EmailAddress(email));

            // Disable click tracking.
            // See https://sendgrid.com/docs/User_Guide/Settings/tracking.html
            msg.SetClickTracking(false, false);

            return client.SendEmailAsync(msg);
        }
    }   

appsettings.json

 {
      "ConnectionStrings": {
        "DefaultConnection": "Server=.\\SQLExpress;Database=aspnet-ASP.NET_Core_IdentityDemo-2BDAC3A8-E5A9-492C-891F-EE1996D434EE;Trusted_Connection=True;MultipleActiveResultSets=true"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Information"
        }
      },
      "SendGridUser": "apikey",
      "SendGridKey": "MY API KEY",
      "AllowedHosts": "*"
    }
  

Я проверил, позволяют ли настройки API отправлять электронные письма, и это...

введите здесь описание изображения


ОБНОВЛЕНО

Ctor получает ошибку при установке значения Options.

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения введите здесь описание изображения


person NoviceCoder    schedule 11.06.2021    source источник


Ответы (1)


Я хотел бы предложить несколько изменений, которые сработали для меня.

Сначала я бы изменил ваш класс отправителя электронной почты следующим образом:

using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.Extensions.Options;
using SendGrid;
using SendGrid.Helpers.Mail;
using System.Threading.Tasks;

public class EmailSender : IEmailSender
    {
        public EmailSender(IOptions<AuthMessageSenderOptions> optionsAccessor)
        {
            Options = optionsAccessor.Value;
        }

        public AuthMessageSenderOptions Options { get; }

        public Task SendEmailAsync(string email, string subject, string message)
        {
            return Execute(Options.SendGridKey, subject, message, email);
        }

        public Task Execute(string apiKey, string subject, string message, string email)
        {
            var client = new SendGridClient(apiKey);
            var msg = new SendGridMessage()
            {
                From = new EmailAddress("[email protected]", "Identity Demo"),
                Subject = subject,
                PlainTextContent = message,
                HtmlContent = message
            };
            msg.AddTo(new EmailAddress(email));

            // Disable click tracking.
            // See https://sendgrid.com/docs/User_Guide/Settings/tracking.html
            msg.SetClickTracking(false, false);

            return client.SendEmailAsync(msg);
        }
    }

Создайте новый класс для своего проекта с именем AuthMessageSenderOptions:

public class AuthMessageSenderOptions
{
        public string SendGridUser { get; set; }
        public string SendGridKey { get; set; }
}

Обновите Startup.cs:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));
            services.AddDatabaseDeveloperPageExceptionFilter();

            services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores<ApplicationDbContext>();
            services.AddControllersWithViews();

            services.AddTransient<IEmailSender, EmailSender>();
            services.Configure<AuthMessageSenderOptions>(Configuration);
        }

Наконец, обновите файл appSettings.json:

"ConnectionStrings": {
    "DefaultConnection": "Server=.\\SQLExpress;Database=aspnet-ASP.NET_Core_IdentityDemo-2BDAC3A8-E5A9-492C-891F-EE1996D434EE;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "SendGridUser": "apikey",
  "SendGridKey": "INSERT YOUR API KEY",
  "AllowedHosts": "*"
}
person Kev Ritchie    schedule 11.06.2021
comment
Так вы говорите, что это "Username": apikey вместо "Username": "apikey"? Если да, то я пытался это сделать, но ему это не понравилось и он сказал An unhandled exception of type 'System.FormatException' occurred in System.Private.CoreLib.dll Could not parse the JSON file. - person NoviceCoder; 14.06.2021
comment
Извиняюсь за путаницу. Я обновил свой ответ, чтобы показать, как должен выглядеть файл appSettings.json. - person Kev Ritchie; 14.06.2021
comment
Не беспокойтесь, я пошел дальше и сделал это, но я все еще не получил отправленное электронное письмо... это то, что я сделал, чтобы получить ключ API. Я зашел на https://api.sendgrid.com/guide/integrate/langs/csharp then clicked on create key which gave me the api key. Then I used that and placed it inside of my appsettings.json`. Есть ли что-то, чего мне не хватает, чтобы заставить это работать? Какие-либо другие шаги/настройки, которые я должен выполнить на app.sendgrid.com, чтобы отправлять электронные письма? - person NoviceCoder; 14.06.2021
comment
С ключом API, который вы настроили. Какой уровень доступа вы ему дали? Полный доступ? Кроме того, когда вы проходите код. Видите ли вы, какие учетные данные передаются при вызове метода SendEmailAsync? - person Kev Ritchie; 14.06.2021
comment
Я дал ему полный доступ, когда создавал ключ API. Когда я выполняю код, я могу увидеть адрес электронной почты, который я ввел в текстовом поле электронной почты, тема будет отображаться Подтвердите ваш адрес электронной почты, HtmlContent покажет Пожалуйста, подтвердите свою учетную запись с помощью <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");, а затем после того, как он будет завершен, он отобразится на страница Подтверждение регистрации, пожалуйста, проверьте свою электронную почту, чтобы подтвердить свою учетную запись. Я проверяю почту и ничего не вижу. - person NoviceCoder; 14.06.2021
comment
Если вы установите точку останова после создания экземпляра client. Какие значения установлены для _username и _apikey? - person Kev Ritchie; 15.06.2021
comment
_username задается как apikey, а _apikey задается как ключ API из SendGrid. - person NoviceCoder; 16.06.2021
comment
Если вы проверите страницу «Активность» в SendGrid, покажет ли она вашу активность в электронной почте? - person Kev Ritchie; 16.06.2021
comment
Когда я захожу в ленту активности, даты предварительно загружаются, когда я нажимаю на окно календаря, он говорит, что у вас есть 3 доступных дня активности. Нужно больше? Затем я нажимаю «Поиск», но он говорит, что поиск не найден ... и в верхней части слова «Лента активности» есть зеленая полоса с надписью «Перед отправкой вашего первого электронного письма вам нужно создать личность отправителя». - person NoviceCoder; 16.06.2021
comment
Я обновил ответ, чтобы показать решение, которое сработало для меня. - person Kev Ritchie; 16.06.2021
comment
Очень оценил! Для ctor Options = optionsAccessor.Value; является ли Options свойством только для чтения в этом файле EmailSenderService.cs? Потому что, когда я устанавливаю Options равным чему-то, он говорит, что Options - это тип, но используемый как переменная... ему это не нравится. - person NoviceCoder; 17.06.2021
comment
Я думаю, что это может быть связано с использованием. Я обновил ответ, чтобы показать использование, которое у меня есть в классе EmailSender. - person Kev Ritchie; 17.06.2021
comment
Хм, я добавил ваше использование и все еще получаю ту же ошибку. Пожалуйста, просмотрите мой обновленный пост, чтобы вы могли увидеть скриншот для ctor - person NoviceCoder; 17.06.2021
comment
Можете ли вы опубликовать, как сейчас выглядит ваш файл Startup.cs? - person Kev Ritchie; 17.06.2021
comment
Давайте продолжим это обсуждение в чате. - person Kev Ritchie; 17.06.2021