邮件组件

可使用 Smtp 和 MailKit 两种不同的邮件驱动发送邮件。Smtp 是 windows平台,MailKit 是跨平台。

有两种开启方式:

1、开启邮件需要自定义配置文件,文件目录:Setting\EmailSetting.jsonEmailSetting。

此种方式发件人(账号、密码、邮箱等)固定,不能动态替换。

文件内容:

{
  "MailSettings": {
    "EmailDriver": "Smtp",
    "DeliveryMethod": "Network",
    "From": "xxxxxx@qq.com",
    "UserName": "11111111",
    "Password": "icj/TO9BKJd+otEQTTkND5idcJKfwHbdTUPPGHsHWFHL0GwL7Kb120ETv0uNPQhURvtS8QR0UpcStdcTw52MdiCjfv3CQqLDu8212LaJQSzhTadd/pHO+0zw5edPhqpkZktAPaQi7rVYaFmb9QnMFMjt0WAunduzHSJFjTIIf0Cpkcm5USuBmSYoA8tWE8qq25YC35yZG3RgH68i5TSXfIza5e956MUQ3ha9DL/vQ17kajJbxtUsMH2l7Bntvy6mQMu5V+vksc8H1OznfTvi2cGOFs9vORCEV658zgSGyQmfzx+Xlev1BY53LyAUEXpeg0nBtHrVoyq9XbkMy9SsBw==",
    "Host": "smtp.qq.com",
    "Port": 587,
    "EnableSsl": true,
    "SecureSocketOptions": 3, //为 MailKit 专属
    "EmailLog": 1,
    "PickupDirectoryLocation": "E:\\LightCMS\\EmailEml",
    "EmailDebugAddress": [ "xxxxxx@qq.com" ],
    "EmailSecretBcc": [ "xxxxxx@qq.com" ],
    "Certificate": {
      "Signed": {
        "Path": "E:\\LightCMS\\EmailEml\\EmailOM4T.pfx",
        "Password": "123456"
      },
      "Encrypted": {
        "Path": "E:\\LightCMS\\EmailEml\\EmailOM4T.pfx",
        "Password": "123456"
      }
    },
  }
}
                

发送邮件:

// 注入 IFluentEmail 类
[Autowired]
private IFluentEmail _FluentEmail { get; set; }

// 发送邮件
SendResponse sendResult = _FluentEmail.SetFromName("liu_linguang").To("liu_linguang@ccwonline.com.cn").Subject("test").Body("123").Send();
                

方法链说明:

SetFromName:发件人名称;

To:收件人;

Subject:邮件标题;

Body:正文。

配置项 说明
EmailDriver 设置邮件驱动,可设置 Smtp 或 MailKit,如果不设置默认为 Smtp。
DeliveryMethod 设置为固定值:Network。
From 设置发件人邮箱。
UserName 设置发件人用户名。
Password 设置发件人密码,一般是 RSA 加密后的字符串。
Host 设置邮件服务器的 Host 地址。
Port 设置邮件服务器的 Post 端口。
EnableSsl 设置邮件是否 SSL 加密,true 或 false。
SecureSocketOptions MailKit 专属,设置驱动为 MailKit,必须设置该项。
EmailLog 设置发送邮件的日志,1:No,不记录日志;2:Simple,简单日志;3:All,详细日志。
PickupDirectoryLocation 设置本地存储发送邮件 eml 文件的硬盘绝对路径。
EmailDebugAddress 设置 Debug 收件人,如果设置该项,所有发送的邮件由该收件人接收,用于 Debug 模式下的邮件调试。
EmailSecretBcc 设置秘密抄送地址。
Certificate 设置邮件签名和邮件加密,Path 为证书文件的硬盘绝对路径,Password 为证书密码。

2、IFluentEmail 多租户模式。此种方式不需要注入 IFluentEmail 类,只能通过实例化对象的方式。

真实业务中,如果需要动态配置发件人邮箱以及账号密码,或者从数据库中读取。

创建邮件操作帮助类 EmailHelper,并标记 Component 特性。方法中初始化 Email 对象,示例中的参数为发件人的用户名和密码。

[Component]
public class EmailHelper
{
    [Autowired]
    private EmailSetting _EmailSetting { get; set; }

    public Email InitEmail(string username, string password)
    {
        return new Email(new EmailSetting
        {
            EmailDriver = _EmailSetting.EmailDriver,
            DeliveryMethod = _EmailSetting.DeliveryMethod,
            UserName = username,
            Password = RSA_Key.Decrypt(password),
            Host = _EmailSetting.Host,
            Port = _EmailSetting.Port,
            EnableSsl = _EmailSetting.EnableSsl,
            EmailLog = _EmailSetting.EmailLog,
            PickupDirectoryLocation = _EmailSetting.PickupDirectoryLocation,
            EmailSecretBcc = _EmailSetting.EmailSecretBcc,
            Certificate = _EmailSetting.Certificate,
            EmailDebugAddress = _EmailSetting.EmailDebugAddress,
            SecureSocketOptions = _EmailSetting.SecureSocketOptions
        });
    }
}
                

发送邮件:

// 注入 EmailHelper 类
[Autowired]
private EmailHelper _EmailHelper { get; set; }

// 发送邮件,model 对象保存邮件数据
IFluentEmail fluentEmail = _EmailHelper.InitEmail(model.UserName, model.PassWord);
SendResponse sendResult = await fluentEmail.SetFrom(model.From).To(model.Email).SetFromName(model.DisplayName).Subject($"{model.Subject}").Body(emailContent, true).SendAsync();