ABP入门系列——使用ABP集成的邮件系统发送邮件
ABP中对邮件的封装主要集成在Abp.Net.Mail和Abp.Net.Mail.Smtp命名空间下,相应源码在此。
一、Abp集成的邮件模块是如何实现的

分析可以看出主要由以下几个核心类组成:
- EmailSettingNames:静态常量类,主要定义了发送邮件需要的相关参数:Port、Host、UserName、Password、Domain、EnableSsl、UseDefaultCredentials。
- EmailSettingProvider:继承自
SettingProvider,对EmailSettingNames中定义的参数项进行设置。 - **SmtpEmailSenderConfiguration ** :继承自
EmailSenderConfiguration,用来读取设置的支持Smtp协议邮件相关参数项。 - SmtpEmailSender:继承自
EmailSenderBase,实现了ISmtpEmailSender接口。该类就是基于SMTP协议进行邮件发送。提供了SendEmailAsync(MailMessage mail)和SendEmail(MailMessage mail),同步异步两种发送邮件的方法。
想具体了解源码的实现方式,建议参考以下两篇博文:
结合ABP源码实现邮件发送功能
ABP源码分析七:Setting 以及 Mail
二、如何使用Abp集成的邮件系统发送邮件
1. 初始化邮件相关参数
在以EntityFramework结尾的项目中的DefaultSettingsCreator中添加默认设置,然后在程序包管理控制台执行Update-DataBase,这样即可把种子数据更新到数据库中。

代码中我是以QQ邮箱设置,有几点需要注意:
- UserName即为QQ邮箱名,但Password并不是你QQ邮箱的登陆密码,而是授权码。授权码如何申请,请参考官方文档。否则发送邮件将会得到**[Error: need EHLO and AUTH first !”] **异常。

- Domain置空即可。
2. 代码调用示例
- 首先,在Service中通过构造函数注入
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;
}
- 在需要发送邮件的地方调用
SmtpEmailSender类的发送方法即可。
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);

三、如何使用Abp集成的通知模块发送通知
直接上代码示例:
- 首先,在Service中通过构造函数注入
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;
}
- 在需要发送通知的地方调用
INotificationPublisher接口提供的Publish或PublishAsync方法即可;我们先来看看需要用到参数。

注意
- NotificationData 是可选的,某些通知可能不需要数据。一些预定义的通知数据类型可能对于大多数情况够用了。 MessageNotificationData可以用于简单的信息, LocalizableMessageNotificationData可以用于本地化的,带参数的通知信息。
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()});

ABP入门系列——使用ABP集成的邮件系统发送邮件的更多相关文章
- ABP入门系列(17)——使用ABP集成的邮件系统发送邮件
ABP中对邮件的封装主要集成在Abp.Net.Mail和Abp.Net.Mail.Smtp命名空间下,相应源码在此. #一.Abp集成的邮件模块是如何实现的 分析可以看出主要由以下几个核心类组成: E ...
- ABP入门系列目录——学习Abp框架之实操演练
ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WE ...
- ABP入门系列(6)——展现层实现增删改查
这一章节将通过完善Controller.View.ViewModel,来实现展现层的增删改查.最终实现效果如下图: 一.定义Controller ABP对ASP.NET MVC Controllers ...
- ABP入门系列(8)——Json格式化
ABP入门系列目录--学习Abp框架之实操演练 讲完了分页功能,这一节我们先不急着实现新的功能.来简要介绍下Abp中Json的用法.为什么要在这一节讲呢?当然是做铺垫啊,后面的系列文章会经常和Json ...
- ABP入门系列(13)——Redis缓存用起来
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 引言 创建任务时我们需要指定分配给谁,Demo中我们使用一个下拉列表用来显示当前系统的所有用 ...
- ABP入门系列(15)——创建微信公众号模块
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 引言 现在的互联网已不在仅仅局限于网页应用,IOS.Android.平板.智能家居等平台正如 ...
- ABP入门系列(16)——通过webapi与系统进行交互
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 引言 上一节我们讲解了如何创建微信公众号模块,这一节我们就继续跟进,来讲一讲公众号模块如何与 ...
- ABP入门系列(20)——使用后台作业和工作者
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1.引言 说到后台作业,你可能条件反射的想到BackgroundWorker,但后台作业并非是后台 ...
- ABP入门系列(6)——定义导航菜单
ABP入门系列目录--学习Abp框架之实操演练 完成了增删改查以及页面展示,这一节我们来为任务清单添加[导航菜单]. 在以往的项目中,大家可能会手动在layout页面中添加一个a标签来新增导航菜单,这 ...
随机推荐
- android Json详解
Json:一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.J ...
- 安卓开发_浅谈Service
一.Service(服务) Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,区别在于它没有UI界面,是在后台运行的组件. public abst ...
- 弃用的异步get和post方法之Block方法
#import "ViewController.h" #import "Header.h" @interface ViewController () <N ...
- Unity3D事件函数的执行顺序 - 包含渲染等模块的完整版,中英文对照
原文地址: http://www.cnblogs.com/ysdyaoguai/p/3746828.html In Unity scripting, there are a number of eve ...
- .NET下单文件的上传处理
ASP.NET的单文件上传使用控件 <asp:FileUpload ID="upmess" runat="server" Width="248p ...
- iOS开发基础框架
---恢复内容开始--- //appdelegate //// AppDelegate.m// iOS开发架构//// Copyright © 2016年 Chason. All rights ...
- js动态加载css文件和js文件的方法
今天研究了下js动态加载js文件和css文件的方法. 网上发现一个动态加载的方法.摘抄下来,方便自己以后使用 [code lang="html"] <html xmlns=& ...
- 菜鸟程序员之Asp.net MVC Session过期异常的处理
小赵是刚毕业的计算机专业方面的大学生,4年的大学时间里面,他读过了很多编程方面的数据,也动手也了很多代码.现在毕业了,他如愿的加入了T公司,开始了自己的程序员生涯.他信心满满,相信自己4年的学习到的东 ...
- Uva-11374-Airport Express
A - Airport Express Time Limit:1000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Appoi ...
- Set a static file on django
1. In setting file: ROOT_PATH='/home/ronglian/project/taskschedule' STATIC_URL = '/static/' STATICFI ...