ABP  Vnext发邮件要使用AbpMailKitModule的实现IEmailSender,要检查添加了Volo.Abp.MailKit,其dependon 要添加typeof()

它使用Setting里面的配置,在官方已经配置如下

internal class EmailSettingProvider : SettingDefinitionProvider
{
public override void Define(ISettingDefinitionContext context)
{
context.Add(
new SettingDefinition(EmailSettingNames.Smtp.Host, "127.0.0.1"),
new SettingDefinition(EmailSettingNames.Smtp.Port, "25"),
new SettingDefinition(EmailSettingNames.Smtp.UserName),
new SettingDefinition(EmailSettingNames.Smtp.Password, isEncrypted: true),
new SettingDefinition(EmailSettingNames.Smtp.Domain),
new SettingDefinition(EmailSettingNames.Smtp.EnableSsl, "false"),
new SettingDefinition(EmailSettingNames.Smtp.UseDefaultCredentials, "true"),
new SettingDefinition(EmailSettingNames.DefaultFromAddress, "noreply@abp.io"),
new SettingDefinition(EmailSettingNames.DefaultFromDisplayName, "ABP application")
);
}
}

默认配置是不合适,如果需要自己配置,则需要在选择合适SettingProvider,在官方提供了五种方法,它使用的倒序的做的法,先

User>Tenant>Global>Configuration>Default
    Configure<AbpSettingOptions>(options =>
{
options.ValueProviders.Add<DefaultValueSettingValueProvider>();
options.ValueProviders.Add<ConfigurationSettingValueProvider>();
options.ValueProviders.Add<GlobalSettingValueProvider>();
options.ValueProviders.Add<TenantSettingValueProvider>();
options.ValueProviders.Add<UserSettingValueProvider>();
});

其中前面三种是User>Tenant>Global是使用 ISettingStore,因此我们可以引入ef core与sqlserver做存储,引入下面模块

   [DependsOn(
typeof(AbpAutofacModule),
typeof(AbpMailKitModule),
typeof(AbpSettingManagementDomainModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpEntityFrameworkCoreSqlServerModule)
)]

基中AbpSettingManagementDomainModule,用来管理setting的,我们使用全局的,在providerName使用G,providerKey使用空

另外可以写一个IDataSeedContributor,用来写入种子数据,特别注意的是UseDefaultCredentials要使用false,即启用密码认证

 await _settingManager.SetAsync(EmailSettingNames.Smtp.Host, "smtp.163.com", "G", "");即
await _settingManager.SetAsync(EmailSettingNames.Smtp.UserName, "***", "G", "");
await _settingManager.SetAsync(EmailSettingNames.Smtp.Password, "***", "G", "");
await _settingManager.SetAsync(EmailSettingNames.DefaultFromAddress, "***", "G", "");
await _settingManager.SetAsync(EmailSettingNames.DefaultFromDisplayName, "***", "G", "");
await _settingManager.SetAsync(EmailSettingNames.Smtp.EnableSsl, "true", "G", "");
await _settingManager.SetAsync(EmailSettingNames.Smtp.Port, "465", "G", "");
await _settingManager.SetAsync(EmailSettingNames.Smtp.UseDefaultCredentials, "false", "G", "");

后使用 IEmailSender _emailsender就可以正常发邮件了

 邮件发送需要模板,那么模板又会有多个语言版本,或者一个模板通过本地化进行语言的翻译。

ABP是这样设计,它首先进行邮件模板EmailTemplateDefinition定义,它是相当邮板组装的元数据metadata,邮件的头部,名称,是否是模板 (若不是,由AbpEmailTemplateOptions提供DefaultLayout),它的模板内容定义在EmailTemplateContributorList里面,它存在多个语言版本的,它还有一些其它增强属性的。

而EmailTemplate才是完全的邮件内容,它包括有模板定义,以及邮件内容(要不要设置模板,将模板里的{{#content}})替换成内容

AbpEmailTemplateOptions存储着所有模板提供者列表,

怎么样让自定义的模板放在AbpEmailTemplateOptions,并通过IEmailTemplateDefinitionManager进行管理,它的操作又是怎么样的

它在IEmailTemplateDefinitionProvider进行定义,由IEmailTemplateDefinitionManager进行填充,保存在其列表中,要提供查询

操作步骤,由IEmailTemplateProvider获取模板内容(这个类比较重要,调用IEmailTemplateDefinitionManager,ITemplateLocalizer,IStringLocalizerFactory,

AbpEmailTemplateOptions)获取到模板内容,再由ITemplateRender 渲染

其定义

EmailTemplateDefinition:占位符,名字,是否模板,本地化,贡献者列表

IEmailTemplateDefinitionProvider:邮件模版定义提供者 :Define方法,新增模板到邮件模板定义的上下文里面。(即上下文
有多少个模板)模板定义有个add方法提供添加到贡献者列表
IEmailTemplateContributor:邮件模版贡献者: 基于模板初始化上下文进行 Initialize。
它是利用IVirtualFileProvider提供的模板,它有一个,也可以是多语言的

IEmailTemplateDefinitionManager:邮件模版定义管理者:执行提供者的Define方法填充字典,以便获取一个模板定义,所有模板定义列表
EmailTemplateDefinitionContext: Dictionary<string, EmailTemplateDefinition>

EmailTemplateInitializationContext:邮件定义EmailTemplateDefinition以及IServiceProvider

IEmailTemplateProvider方法

ITemplateRender 模板渲染
IEmailTemplateProvider:获取模板

 
分类: ABP
 

ABP邮件发送的更多相关文章

  1. 循序渐进BootstrapVue,开发公司门户网站(3)--- 结合邮件发送,收集用户反馈信息

    在我们公司门户网站里面,如果有需要,我们可以提供一个页面给用户反馈信息,以便获得宝贵的用户信息反馈或者一些产品咨询的记录,一般这个结合邮件发送到负责人的邮箱即可.本篇随笔结合后端发送邮件的操作,把相关 ...

  2. 结合ABP源码实现邮件发送功能

    1. 前言 2. 实现过程 1. 代码图(重) 2.具体实现 2.1 定义AppSettingNames及AppSettingProvider 2.2 EmailSenderConfiguration ...

  3. ABP框架系列之二十四:(Email-Sending-EF-电子邮件发送)

    Introduction Email sending is a pretty common task for almost every application. ASP.NET Boilerplate ...

  4. 循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

    在系统处理中,有时候需要发送邮件通知用户,如新增用户的邮件确认,密码找回,以及常规订阅消息.通知等内容处理,都可以通过邮件的方式进行处理.本篇随笔介绍结合VUE+Element 前端,实现系统的邮件参 ...

  5. .NET开发邮件发送功能的全面教程(含邮件组件源码)

    今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知识 2)         ...

  6. J2EE 邮件发送那些事儿

    距离自己写的关于java邮件发送的第一篇博客已经有很长一段时间了,现在回过头看看.虽然代码质量方面有待提高,整体结构也不怎样,但是基本思路和过程还是比较纯的.现在有空写写J2EE中邮件发送的开发,实际 ...

  7. SSH项目里面 忘记密码的邮件发送功能

    package com.xxx.util; import java.util.Date; import java.util.Properties; import javax.mail.Address; ...

  8. [UWP]UWP中获取联系人/邮件发送/SMS消息发送操作

    这篇博客将介绍如何在UWP程序中获取联系人/邮件发送/SMS发送的基础操作. 1. 获取联系人 UWP中联系人获取需要引入Windows.ApplicationModel.Contacts名称空间. ...

  9. java spring 邮件发送

    开发中经常会遇到发送邮件进行用户验证,或者其它推送信息的情况,本文基于spring,完成邮件的发送,主要支持普通文本邮件的发送,html文本邮件的发送,带附件的邮件发送,没有实现群发.多个附件发送等需 ...

  10. Java邮件发送与接收原理

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

随机推荐

  1. HDC2021技术分论坛:HarmonyOS低代码开发介绍

    作者:sunyuhui,wangxiaoyan,华为2012实验室软件IDE专家 什么是低代码开发?低代码开发主要特点有哪些?如何利用低代码开发原子化服务?本文带你一探究竟~ 一.什么是Harmony ...

  2. keystore 生成密钥

    前言 在安卓中,我们需要生存keystore来处理我们的证书: 我们很幸运在keystore中,在java中的bin下,已经有了keytool工具了,感谢java社区工作者. 正文 在命令窗口中使用k ...

  3. Node. js 有哪些全局对象?

    一.是什么 在浏览器 JavaScript 中,通常window 是全局对象, 而 Nodejs中的全局对象是 global 在NodeJS里,是不可能在最外层定义一个变量,因为所有的用户代码都是当前 ...

  4. 日处理数据量超10亿:友信金服基于Flink构建实时用户画像系统的实践

    导读:当今生活节奏日益加快,企业面对不断增加的海量信息,其信息筛选和处理效率低下的困扰与日俱增.由于用户营销不够细化,企业 App 中许多不合时宜或不合偏好的消息推送很大程度上影响了用户体验,甚至引发 ...

  5. 深度解读 OpenYurt:从边缘自治看 YurtHub 的扩展能力

    作者 | 新胜  阿里云技术专家 导读:OpenYurt 开源两周以来,以非侵入式的架构设计融合云原生和边缘计算两大领域,引起了不少行业内同学的关注.阿里云推出开源项目 OpenYurt,一方面是把阿 ...

  6. MySQL 深潜 - 一文详解 MySQL Data Dictionary

    ​简介: 在 MySQL 8.0 之前,Server 层和存储引擎(比如 InnoDB)会各自保留一份元数据(schema name, table definition 等),不仅在信息存储上有着重复 ...

  7. Go 调用 Java 方案和性能优化分享

    ​简介: 一个基于 Golang 编写的日志收集和清洗的应用需要支持一些基于 JVM 的算子. ​ 作者 | 响风 来源 | 阿里技术公众号 一 背景 一个基于 Golang 编写的日志收集和清洗的应 ...

  8. [FAQ] IDE: Goland 注释符后面添加空行

    如图所示,Code Style 对应语言 Go 勾选上注释空行的选项. Refer:Goland官网 Goland下载 Link:https://www.cnblogs.com/farwish/p/1 ...

  9. WPF 修复 ContextMenu 在开启 PerMonitorV2 后所用 DPI 错误

    本文告诉大家如何修复 WPF 的 ContextMenu 在开启 PerMonitorV2 之后,在双屏不同的 DPI 的设备上,在副屏弹出的 ContextMenu 使用了主屏的 DPI 导致缩放错 ...

  10. 剪贴板被占用导致应用使用剪贴板拷贝内容失败抛出 COMException 0x800401D0 错误

    本文记录某些软件,例如 向日葵远程控制 软件占用剪贴板,导致 WPF 应用使用剪贴板拷贝内容和设置剪贴板时,抛出 System.Runtime.InteropServices.COMException ...