当前位置: 首页 > 文档资料 > ABP 中文文档 >

ABP公共结构 - 邮件发送(MailKit集成)

优质
小牛编辑
132浏览
2023-12-01

2.8 ABP公共结构 - 邮件发送(MailKit集成)

2.8.1 简介

几乎所有的应用都有一个发送电子邮件的功能。ABP提供了一个基本的基础设施,它可以简单的发送邮件,并且将邮件服务的配置从发送邮件的功能中分离了出来。

2.8.2 IEmailSender

IEmailSender 是一个邮件发送服务接口,使用它你不需要知道详细信息就可以简单的发送邮件。如下所示:

  1. public class TaskManager : IDomainService
  2. {
  3. private readonly IEmailSender _emailSender;
  4. public TaskManager(IEmailSender emailSender)
  5. {
  6. _emailSender = emailSender;
  7. }
  8. public void Assign(Task task, Person person)
  9. {
  10. //分配任务给某个人
  11. task.AssignedTo = person;
  12. //发送一份邮件通知
  13. _emailSender.Send(
  14. to: person.EmailAddress,
  15. subject: "You have a new task!",
  16. body: $"A new task is assigned for you: <b>{task.Title}</b>",
  17. isBodyHtml: true
  18. );
  19. }
  20. }

我们只是简单的注入 IEmailSender 接口以及使用了 Send 方法。Send方法有一些重载方法。它能够获取一个MailMessage对象(对于.net core它是无效的,因为.net core没有这些发送邮件的功能类:SmtpClient和MailMessage)。

ISmtpEmailSender

有一个 ISmtpEmailSender 的接口,该接口扩展自 IEmailSender,在该接口中有一个 BuildClient 方法,可以用直接使用该方法来创建一个 SmtpClient 对象(对于.net core它是无效的,因为.net core没有这些发送邮件的功能类:SmtpClient和MailMessage)。在大多数情况下使用 IEmailSender 发送邮件,这已经足够了。

NullEmailSender

NullEmailSender 是一个使用空对象模式来实现 IEmailSender 接口的类。你可以在单元测试中使用它或者使用属性注入的方式来注入 IEmailSender

2.8.3 配置

Email Sender使用设置管理系统来读取发送邮件的配置。所有的设置名称以常量字符串的方式定义在 Abp.Net.Mail.EmailSettingNames 类中。如下所示:

  • Abp.Net.Mail.DefaultFromAddress:在发送邮件时,如果没有指定邮件发送者,该值会自动作为邮件的发送者(如上例所示)

  • Abp.Net.Mail.DefaultFromDisplayName:在发送邮件时,如果没有指定邮件发送者,该值会自动作为邮件发送者的显示名(如上例所示)

  • Abp.Net.Mail.Smtp.Host:SMTP服务器的IP/域名(默认:127.0.0.1)

  • Abp.Net.Mail.Smtp.Port: SMTP服务器的端口(默认:25)

  • Abp.Net.Mail.Smtp.UserName: 用户名,如果SMTP需要身份认证

  • Abp.Net.Mail.Smtp.Password: 密码,如果SMTP需要身份认证

  • Abp.Net.Mail.Smtp.Domain: 域用户名,如果SMTP需要身份认证

  • Abp.Net.Mail.Smtp.EnableSsl: 用来配置SMTP是否使用SSL(“true” or “false”. 默认: “false”)

  • Abp.Net.Mail.Smtp.UseDefaultCredentials: True,使用默认的凭证而不是使用用户名和密码认证的方式 (“true” or “false”. 默认: “true”).

2.8.4 MailKit 集成

由于.net core不支持标准的System.Net.Mail.SmtpClient,所以我们需要使用第三方插件来发送电子邮件。幸运的是,MailKit为默认的SmtpClient提供了一个很好的替代品。微软也建议使用该插件。

Abp使用 Abp.MailKit package 来集成邮件发送功能。所以,你可以一直使用 IEmailSender 接口通过MailKit来发送邮件(如上所述)。

安装

首先,安装 Abp.MailKit到你的项目:

  1. Install-Package Abp.MailKit

集成

将AbpMailKitModule添加到模块的依赖项中:

  1. [DependsOn(typeof(AbpMailKitModule))]
  2. public class MyProjectModule : AbpModule
  3. {
  4. //...
  5. }

使用

你可以像之前所述的那样使用 IEmailSender,因为 Abp.MailKit package 中实现了该接口,并且注册了该接口的实现。也可以像之前所述那样来配置它。

自定制

当你创建MailKit的SmtpClient的时候,你可能需要做一些额外的配置或者定制。这样的话,你可以用你自己的实现来Replace(替换) IMailKitSmtpBuilder 接口。你可以继承DefaultMailKitSmtpBuilder 类来实现自定制,因为这样做更容易。例如:你想要接收所有的SSL证书,那么你可以重写 ConfigureClient 方法,如下所示:

  1. public class MyMailKitSmtpBuilder : DefaultMailKitSmtpBuilder
  2. {
  3. public MyMailKitSmtpBuilder(ISmtpEmailSenderConfiguration smtpEmailSenderConfiguration)
  4. : base(smtpEmailSenderConfiguration)
  5. {
  6. }
  7. protected override void ConfigureClient(SmtpClient client)
  8. {
  9. client.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
  10. base.ConfigureClient(client);
  11. }
  12. }

然后你可以在模块的PreInitialize 方法中,用你自己的实现来替换 IMailKitSmtpBuilder 接口:

  1. [DependsOn(typeof(AbpMailKitModule))]
  2. public class MyProjectModule : AbpModule
  3. {
  4. public override void PreInitialize()
  5. {
  6. Configuration.ReplaceService<IMailKitSmtpBuilder, MyMailKitSmtpBuilder>();
  7. }
  8. //...
  9. }

记住要引用 :Abp.Configuration.Startup,因为ReplaceService的扩展方法定义在该名称空间中。