• 使用Volo.Abp.MailKit发送邮件


    Volo.Abp.MailKit封装继承MailKit库,为Abp邮件发送提供了快捷实现。

    邮箱配置

    qq邮箱支持smtp功能,需要去申请开通。参考qq邮箱设置,最重要的是smtp发送邮件,qq邮箱对应的密码不是用户的qq邮箱密码,而是需要申请生成的授权码。

    邮箱配置

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

    "Settings": {
        "Abp.Mailing.DefaultFromAddress": "xx@qq.com",
        "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": "xx@qq.com",
        "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;
                }
            }
        }
    

    官方参考文档

  • 相关阅读:
    cf1009 D. Relatively Prime Graph
    cf1009 C. Annoying Present
    随机验证码(数字和字母组成)及toLowerCase() 字符串转小写方法和toUpperCase()字符串转大写方法
    js中new ActiveXObject("Scripting.FileSystemObject")等操作本地文件用法,
    上传文件 (图片),使用new FormData()
    jq分页插件(jquery.pagination.js)只有上一页下一页和跳转
    jq的分页插件(pagination.min.js)选择一页显示多少条数据
    左侧导航栏案例
    jQuery 事件总结
    WebSocket
  • 原文地址:https://www.cnblogs.com/beyond1983/p/13088136.html
Copyright © 2020-2023  润新知