【问题标题】:Cannot use SendGrid无法使用 SendGrid
【发布时间】:2018-08-23 19:03:53
【问题描述】:

我正在尝试使用SendGrid 通过我的ASP.NET Core 应用程序发送电子邮件,因此我按以下方式对其进行了配置:

ConfigureServices 方法中,我添加了一个Singleton 和一个访问SendGrid API 的配置:

services.AddSingleton<IEmailSender, IEmailSender>();
services.Configure<AuthMessageSenderOptions>(Configuration);

AuthMessageSenderOptions 类是软件配置的一部分:

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

这个类管理SendGrid 用户名和密钥。

我创建了一个service 类,实现了IEmailSender 接口,这是实现:

public class EmailSender : IEmailSender
{
    public AuthMessageSenderOptions Options { get; }

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

    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("foo@gmail.com", "Foo"),
            Subject = subject,
            PlainTextContent = message,
            HtmlContent = message
        };

        msg.AddTo(new EmailAddress(email));

        msg.TrackingSettings = new TrackingSettings
        {
            ClickTracking = new ClickTracking { Enable = false }
        };

        return client.SendEmailAsync(msg);
    }
}

然后在我的Account 控制器(用于执行注册和登录)中,我将IEmailSender 服务注入到构造函数中:

public class AccountController : Controller
{
   private readonly IEmailSender _emailSender;

   public AccountController(IEmailSender emailSender)
   {
       _emailSender = emailSender;
   }

当我启动应用程序时出现此错误:

System.ArgumentException: '无法为服务类型'Microsoft.AspNetCore.Identity.UI.Services.IEmailSender'实例化实现类型'Microsoft.AspNetCore.Identity.UI.Services.IEmailSender'。'

Program 类中,特别是在这一行:

CreateWebHostBuilder(args).Build().Run();

这是完整的Program 类:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

我做错了什么?

我正在学习 ASP.NET Core 所以,如果我做了一些愚蠢的事情,对不起,我按照 this doc 来实现 SendGrid 逻辑。

【问题讨论】:

    标签: c# asp.net asp.net-core sendgrid


    【解决方案1】:
    services.AddSingleton<IEmailSender, IEmailSender>();
    

    应该在第二个模板参数中指定实现:

    services.AddSingleton<IEmailSender, EmailSender>();
    

    【讨论】:

    • omg,对于一个“我”,我被困在这个问题上一小时,谢谢罗杰,祝你有个美好的一天! :)
    • 这行得通!你太棒了!
    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多