使用Volo.Abp.MailKit發送郵件

Volo.Abp.MailKit封裝繼承MailKit庫,為Abp郵件發送提供了快捷實現。

郵箱配置

qq郵箱支援smtp功能,需要去申請開通。參考qq郵箱設置,最重要的是smtp發送郵件,qq郵箱對應的密碼不是用戶的qq郵箱密碼,而是需要申請生成的授權碼。

郵箱配置

在項目的appsettings.json配置文件里,添加如下配置項目。

"Settings": {
    "Abp.Mailing.DefaultFromAddress": "[email protected]",
    "Abp.Mailing.DefaultFromDisplayName": "xx",
    "Abp.Mailing.Smtp.Host": "smtp.qq.com",
    "Abp.Mailing.Smtp.Port": "587",
    "Abp.Mailing.Smtp.Domain": "smtp.qq.com",
    "Abp.Mailing.Smtp.UserName": "[email protected]",
    "Abp.Mailing.Smtp.Password": "xxx",
    "Abp.Mailing.Smtp.EnableSsl": "false",
    "Abp.Mailing.Smtp.UseDefaultCredentials": "false"
  }

注意

  1. Abp.Mailing.Smtp.EnableSsl項目應設置為false。

  2. Abp.Mailing.Smtp.UseDefaultCredentials項目應設置為false。

  3. Abp.Mailing.Smtp.Password應設置為qq郵箱對應的授權碼密文。

密文可調用IStringEncryptionService.Encrypt(授權碼)獲取

發送郵件

在一個後台作業里發送郵件,完整程式碼如下。

 public class EmailSendingJob : BackgroundJob<EmailSendingArgs>, ITransientDependency
    {
        private readonly IMailKitSmtpEmailSender _emailSender;
        public EmailSendingJob(IMailKitSmtpEmailSender emailSender)
        {
            _emailSender = emailSender;
        }

        public override void Execute(EmailSendingArgs args)
        {
            Action action = async () =>
            {
                await _emailSender.SendAsync(
                    args.EmailAddress,
                    args.Subject,
                    args.Body,
                    false
                );
            };
            action?.Invoke();
        }
    }

看看測試效果,郵件正確的發送接收了。

測試效果

配置郵箱密碼使用明文

框架默認EmailSettingProvider設置EmailSettingNames.Smtp.Password的isEncrypted屬性默認為true,所以在上面的appsettings.json中需要設置為授權碼的密文。

根據官方的文檔,我們可以修改EmailSettingNames.Smtp.Password的isEncrypted屬性默認為false,這樣就可以直接使用授權碼明文。

在項目中新建一個MySettingDefinitionProvider文件,並繼承自SettingDefinitionProvider類。

 public class MySettingDefinitionProvider : SettingDefinitionProvider
    {
        public override void Define(ISettingDefinitionContext context)
        {
            var smtpPassword = context.GetOrNull("Abp.Mailing.Smtp.Password");
            if (smtpPassword != null)
            {
                smtpPassword.IsEncrypted = false;
            }
        }
    }

官方參考文檔