c# - 使用 NetCore.MailKit 发送电子邮件时地址的 ArgumentNullException

标签 c# asp.net-core mailkit

我正在使用 NetCore.MailKit NuGet 包帮助我发送一封电子邮件,其中包含一个链接,用于在用户注册时确认他们的电子邮件。我已经按照他们 Github page 上的步骤操作了但是,我收到了 ArgumentNullException对于地址,即使我已经设置了发送地址。

错误 :

ArgumentNullException: Value cannot be null. (Parameter 'address')
    MimeKit.MailboxAddress..ctor(Encoding encoding, string name, string address)

使用 IEmailService 在我的 Controller 中发送电子邮件时会发生上述错误:
_EmailService.Send("usersemail@gmail.com", "subject", "message body");

这是我的 appsettings.json配置:
  "EmailConfiguration": {
    "Server": "smtp.gmail.com",
    "Port": 587,
    "SenderName": "name",
    "SenderEmail": "mygmail@gmail.com",
    "SenderPassword": "My gmail password"
  }

这是我在 startup.cs 中的设置
    services.AddMailKit(optionBuilder =>
    {
        optionBuilder.UseMailKit(new MailKitOptions()
        {
            //get options from sercets.json
            Server = Configuration["Server"],
            Port = Convert.ToInt32(Configuration["Port"]),
            SenderName = Configuration["SenderName"],
            SenderEmail = Configuration["SenderEmail"],
            Account = Configuration["SenderEmail"],
            Password = Configuration["SenderPassword"],
            Security = true
        });
    });

下面是 EmailService 的代码:
    public void Send(string mailTo, string subject, string message, bool isHtml = false)
    {
        SendEmail(mailTo, null, null, subject, message, Encoding.UTF8, isHtml);
    }

    private void SendEmail(string mailTo, string mailCc, string mailBcc, string subject, string message, Encoding encoding, bool isHtml)
    {
        var _to = new string[0];
        var _cc = new string[0];
        var _bcc = new string[0];
        if (!string.IsNullOrEmpty(mailTo))
            _to = mailTo.Split(',').Select(x => x.Trim()).ToArray();
        if (!string.IsNullOrEmpty(mailCc))
            _cc = mailCc.Split(',').Select(x => x.Trim()).ToArray();
        if (!string.IsNullOrEmpty(mailBcc))
            _bcc = mailBcc.Split(',').Select(x => x.Trim()).ToArray();

        Check.Argument.IsNotEmpty(_to, nameof(mailTo));
        Check.Argument.IsNotEmpty(message, nameof(message));

        var mimeMessage = new MimeMessage();

        //add mail from
        mimeMessage.From.Add(new MailboxAddress(_MailKitProvider.Options.SenderName, _MailKitProvider.Options.SenderEmail));

        //add mail to 
        foreach (var to in _to)
        {
            mimeMessage.To.Add(MailboxAddress.Parse(to));
        }

        //add mail cc
        foreach (var cc in _cc)
        {
            mimeMessage.Cc.Add(MailboxAddress.Parse(cc));
        }

        //add mail bcc 
        foreach (var bcc in _bcc)
        {
            mimeMessage.Bcc.Add(MailboxAddress.Parse(bcc));
        }

        //add subject
        mimeMessage.Subject = subject;

        //add email body
        TextPart body = null;

        if (isHtml)
        {

            body = new TextPart(TextFormat.Html);
        }
        else
        {
            body = new TextPart(TextFormat.Text);
        }
        //set email encoding
        body.SetText(encoding, message);

        //set email body
        mimeMessage.Body = body;

        using (var client = _MailKitProvider.SmtpClient)
        {
            client.Send(mimeMessage);
        }
    }

正如你所看到的,我已经设置了一切,我在这里遗漏了什么吗?为什么 MimeKit.MailboxAddress() 处的地址为空?

最佳答案

您似乎没有正确加载配置设置。我怀疑您代码中的失败行是

//add mail from
mimeMessage.From.Add(new MailboxAddress(_MailKitProvider.Options.SenderName, _MailKitProvider.Options.SenderEmail));

选项都是空的,这会导致异常。

当您从配置文件加载设置时,您需要在变量之前添加部分名称。例如。
services.AddMailKit(optionBuilder =>
{
    optionBuilder.UseMailKit(new MailKitOptions()
    {
        //get options from sercets.json
        Server = Configuration["EmailConfiguration:Server"],
        Port = Convert.ToInt32(Configuration["EmailConfiguration:Port"]),
        SenderName = Configuration["EmailConfiguration:SenderName"],
        SenderEmail = Configuration["EmailConfiguration:SenderEmail"],
        Account = Configuration["EmailConfiguration:SenderEmail"],
        Password = Configuration["EmailConfiguration:SenderPassword"],
        Security = true
    });
});

关于c# - 使用 NetCore.MailKit 发送电子邮件时地址的 ArgumentNullException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60011683/

相关文章:

c# - WPF - 在文本框旁边动态添加按钮

c# - 是否有相当于 TFS 2015 的 "Build 2.0"REST API 的 .NET API?

asp.net-core - 来自 Entity Framework Core 数据层中 appsettings.json 的 ConnectionString

c# - O365 使用Mailkit 删除邮件?

c# - 使用 MailKit/MimeKit 从电子邮件中删除附件

c# - 在 .net 核心应用程序中使用带有 MailKit 的 Html 模板发送电子邮件

c# - 迭代参数,调用方法并将结果传递给另一个函数

c# - .NET 序列化 XmlNode 问题

C# - 如何遍历对象的每个属性和值

asp.net - 我们可以隐藏 Content-Security-Policy 错误日志的 URL 吗?