ABP入門系列目錄——學(xué)習(xí)Abp框架之實(shí)操演練
源碼路徑:Github-LearningMpaAbp
1.Abp集成的郵件模塊是如何實(shí)現(xiàn)的
ABP中對(duì)郵件的封裝主要集成在Abp.Net.Mail和Abp.Net.Mail.Smtp命名空間下,相應(yīng)源碼在此。

分析可以看出主要由以下幾個(gè)核心類組成:
- EmailSettingNames:靜態(tài)常量類,主要定義了發(fā)送郵件需要的相關(guān)參數(shù):Port、Host、UserName、Password、Domain、EnableSsl、UseDefaultCredentials。
-
EmailSettingProvider:繼承自
SettingProvider,對(duì)EmailSettingNames中定義的參數(shù)項(xiàng)進(jìn)行設(shè)置。 - **SmtpEmailSenderConfiguration ** :繼承自
EmailSenderConfiguration,用來讀取設(shè)置的支持Smtp協(xié)議郵件相關(guān)參數(shù)項(xiàng)。 -
SmtpEmailSender:繼承自
EmailSenderBase,實(shí)現(xiàn)了ISmtpEmailSender接口。該類就是基于SMTP協(xié)議進(jìn)行郵件發(fā)送。提供了SendEmailAsync(MailMessage mail)和SendEmail(MailMessage mail),同步異步兩種發(fā)送郵件的方法。
想具體了解源碼的實(shí)現(xiàn)方式,建議參考以下兩篇博文:
結(jié)合ABP源碼實(shí)現(xiàn)郵件發(fā)送功能
ABP源碼分析七:Setting 以及 Mail
2.如何使用Abp集成的郵件系統(tǒng)發(fā)送郵件
2.1. 初始化郵件相關(guān)參數(shù)
在以EntityFramework結(jié)尾的項(xiàng)目中的DefaultSettingsCreator中添加默認(rèn)設(shè)置,然后在程序包管理控制臺(tái)執(zhí)行Update-DataBase,這樣即可把種子數(shù)據(jù)更新到數(shù)據(jù)庫(kù)中。

代碼設(shè)置郵件相關(guān)參數(shù)
代碼中我是以QQ郵箱設(shè)置,有幾點(diǎn)需要注意:
- UserName即為QQ郵箱名,但Password并不是你QQ郵箱的登陸密碼,而是授權(quán)碼。授權(quán)碼如何申請(qǐng),請(qǐng)參考官方文檔。否則發(fā)送郵件將會(huì)得到**[Error: need EHLO and AUTH first !”] **異常。

申請(qǐng)到的授權(quán)碼
- Domain置空即可。
2.2. 代碼調(diào)用示例
- 首先,在Service中通過構(gòu)造函數(shù)注入
ISmtpEmailSenderConfiguration
private readonly IRepository<Task> _taskRepository;
private readonly IRepository<User, long> _userRepository;
private readonly ISmtpEmailSenderConfiguration _smtpEmialSenderConfig;
/// <summary>
///In constructor, we can get needed classes/interfaces.
///They are sent here by dependency injection system automatically.
/// </summary>
public TaskAppService(IRepository<Task> taskRepository, IRepository<User, long> userRepository,
ISmtpEmailSenderConfiguration smtpEmialSenderConfigtion)
{
_taskRepository = taskRepository;
_userRepository = userRepository;
_smtpEmialSenderConfig = smtpEmialSenderConfigtion;
}
- 在需要發(fā)送郵件的地方調(diào)用
SmtpEmailSender類的發(fā)送方法即可。
SmtpEmailSender emailSender = new SmtpEmailSender(_smtpEmialSenderConfig);
string message = "You hava been assigned one task into your todo list.";
emailSender.Send("ysjshengjie@qq.com", task.AssignedPerson.EmailAddress, "New Todo item", message);

成功接收郵件
3.如何使用Abp集成的通知模塊發(fā)送通知
直接上代碼示例:
- 首先,在Service中通過構(gòu)造函數(shù)注入
INotificationPublisher
/// <summary>
///In constructor, we can get needed classes/interfaces.
///They are sent here by dependency injection system automatically.
/// </summary>
public TaskAppService(IRepository<Task> taskRepository, IRepository<User, long> userRepository,
ISmtpEmailSenderConfiguration smtpEmialSenderConfigtion, INotificationPublisher notificationPublisher)
{
_taskRepository = taskRepository;
_userRepository = userRepository;
_smtpEmialSenderConfig = smtpEmialSenderConfigtion;
_notificationPublisher = notificationPublisher;
}
- 在需要發(fā)送通知的地方調(diào)用
INotificationPublisher接口提供的Publish或PublishAsync方法即可;我們先來看看需要用到參數(shù)。

注意
- NotificationData 是可選的,某些通知可能不需要數(shù)據(jù)。一些預(yù)定義的通知數(shù)據(jù)類型可能對(duì)于大多數(shù)情況夠用了。 MessageNotificationData可以用于簡(jiǎn)單的信息, LocalizableMessageNotificationData可以用于本地化的,帶參數(shù)的通知信息。
string message = "You hava been assigned one task into your todo list.";
_notificationPublisher.Publish("NewTask", new MessageNotificationData(message), null,NotificationSeverity.Info, new[] {task.AssignedPerson.ToUserIdentifier()});

成功接收通知