当前位置: 首页 > news >正文

使用FakeSMTP创建本地SMTP服务器接收邮件具体实现。

以下代码来自Let’s Go further节选。具体说明均为作者本人理解。

编辑邮件模版

主要包含三个template:

  1. subject:主题
  2. plainBody: 纯文本正文
  3. htmlBody:超文本语言正文
{{define "subject"}}Welcome to Greenlight!{{end}}
{{define "plainBody"}}
Hi,
Thanks for signing up for a Greenlight account. We're excited to have you on board!
For future reference, your user ID number is {{.ID}}.
Thanks,
The Greenlight Team
{{end}}
{{define "htmlBody"}}
<html>
<head><meta name="viewport" content="width=device-width" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>Hi,</p>
<p>Thanks for signing up for a Greenlight account. We're excited to have you on board!</p>
<p>For future reference, your user ID number is {{.ID}}.</p>
<p>Thanks,</p>
<p>The Greenlight Team</p>
</body>
</html>
{{end}}

创建mailer.go

主要功能为解析,执行邮件模版,将邮件正文加载到bytes.Buffer中,最后打包信息发送

package mailerimport ("bytes""embed""github.com/go-mail/mail/v2""html/template""time"
)// 声明一个embed.FS变量存储email模板,在他上面有一个注释指令表明我们想要存储哪个文件的模板
//
/*1. 只能在包级别的变量上使用//go:embed指令,不能在函数或者方法中使用2. 路径应该相对于该指令的源代码3. 路径不能包含.or..,也不能以/开头或结尾,这实际上限制了你只能嵌入与源代码位于同一目录(或子目录)的文件4. 如果路径指向一个目录,那么会递归加载该目录下的所有文件,但是不会加载.  /开头的文件,如果需要加载,需要在路径中使用通配符//go:embed "templates/*"5. 可以在一个指令中指定多个目录和文件
*///go:embed "templates"
var templateFS embed.FS// Mailer mail.Dialer用于连接SMTP服务器  email的发送信息,包含名字和地址"Alice Smith <alice@example.com>"
type Mailer struct {dialer *mail.Dialersender string
}func New(host string, port int, username, password, sender string) Mailer {//使用SMTP服务器的配置初始化一个mail.Dialer实例,发送邮件时使用五秒的超时配置dialer := mail.NewDialer(host, port, username, password)dialer.Timeout = 5 * time.Secondreturn Mailer{dialer: dialer,sender: sender,}
}// Send
//
//	@Description:
//	@receiver m
//	@param recipient  接受者邮件地址
//	@param templateFile 模版文件名
//	@param data 模板的动态数据
//	@return error
func (m *Mailer) Send(recipient, templateFile string, data interface{}) error {//1. 解析模板 从embed文件系统解析请求模板parseFS, err := template.New("email").ParseFS(templateFS, "templates/"+templateFile)if err != nil {return err}//2. 执行模版 执行模板文件,将参数传递进去,将结果存储在bytes.Buffer变量中subject := new(bytes.Buffer)err = parseFS.ExecuteTemplate(subject, "subject", data)if err != nil {return err}plainBody := new(bytes.Buffer)err = parseFS.ExecuteTemplate(plainBody, "plainBody", data)if err != nil {return err}htmlBody := new(bytes.Buffer)err = parseFS.ExecuteTemplate(htmlBody, "htmlBody", data)if err != nil {return err}//设置邮件具体内容message := mail.NewMessage()message.SetHeader("To", recipient) //设置邮件头信息message.SetHeader("From", m.sender)message.SetHeader("Subject", subject.String())message.SetBody("text/plain", plainBody.String())      //  设置plain-text body  纯文本正文message.AddAlternative("text/html", htmlBody.String()) //  设置html body 超文本语言正文//打开一个到SMTP服务器的链接,发送信息,关闭链接。如果超时,返回"dial tcp: i/o timeout"err = m.dialer.DialAndSend(message)if err != nil {return err}return nil}

加载SMTP服务配置

使用命令行加载SMTP配置,这里的ip地址为本地地址localhost,端口号根据自己开启的fakeSMTP服务器端口号调整。

flag.StringVar(&cfg.smtp.host, "smtp-host", "localhost", "SMTP host")
flag.IntVar(&cfg.smtp.port, "smtp-port", 25, "SMTP port")
//  服务器和密码用来登录smtp服务器的,这里用的本地的fakeSMTP服务器,所以填不填无所谓
flag.StringVar(&cfg.smtp.username, "smtp-username", "***", "SMTP username")
flag.StringVar(&cfg.smtp.password, "smtp-password", "***", "SMTP password")
flag.StringVar(&cfg.smtp.sender, "smtp-sender", "Greenlight <no-reply@greenlight.alexedwards.net>", "SMTP sender")

初始化mailer实例,将其加载到application配置中供handler使用

app := &application{config: cfg,logger: logger,models: data.NewModels(db),mailer: mailer.New(cfg.smtp.host, cfg.smtp.port, cfg.smtp.username, cfg.smtp.password, cfg.smtp.sender),}

运行结果

Fake SMTP Server接收示例
在这里插入图片描述
具体的邮件内容
在这里插入图片描述
在邮件内的具体内容
在这里插入图片描述

相关文章:

使用FakeSMTP创建本地SMTP服务器接收邮件具体实现。

以下代码来自Let’s Go further节选。具体说明均为作者本人理解。 编辑邮件模版 主要包含三个template: subject&#xff1a;主题plainBody&#xff1a; 纯文本正文htmlBody&#xff1a;超文本语言正文 {{define "subject"}}Welcome to Greenlight!{{end}} {{def…...

【网络安全】逆向工程 练习示例

1. 逆向工程简介 逆向工程 (RE) 是将某物分解以了解其功能的过程。在网络安全中&#xff0c;逆向工程用于分析应用程序&#xff08;二进制文件&#xff09;的运行方式。这可用于确定应用程序是否是恶意的或是否存在任何安全漏洞。 例如&#xff0c;网络安全分析师对攻击者分发…...

Oracle Database 21c Express Edition数据库 和 Sqlplus客户端安装配置

目录 一. 前置条件二. Win10安装配置Oracle数据库2.1 数据库获取2.2 数据库安装2.3 数据库配置确认2.4 数据库访问 三. Win10配置Oracle数据库可对外访问3.1 打开文件和打印机共享3.2 开放1521端口 四. 端口与地址确认4.1 查看监听器的状态4.2 Win10查看1521端口是否被监听4.3 …...

arcgisPro将面要素转成CAD多段线

1、说明&#xff1a;正常使用【导出为CAD】工具&#xff0c;则导出的是CAD三维多线段&#xff0c;无法进行编辑操作、读取面积等。这是因为要素面中包含Z值&#xff0c;导出则为三维多线段数据。需要利用【复制要素】工具禁用M值和Z值&#xff0c;再导出为CAD&#xff0c;则得到…...

相机内外参知识

已知相机的内外参数矩阵&#xff0c;可以求得相机在世界坐标系下的原点坐标。这里需要理解几个概念&#xff1a; 内参数矩阵&#xff08;Intrinsic Matrix&#xff09;: 描述相机本身的属性&#xff0c;比如焦距、主点位置等。外参数矩阵&#xff08;Extrinsic Matrix&#xf…...

从代币角度介绍solana账户体系

1、solana 的账户概念介绍 Solana的账户体系是其区块链的核心组成部分&#xff0c;它允许数据和价值在链上存储和转移。以下是Solana账户体系的一些关键特点&#xff1a; • 账户模型&#xff1a; • 在Solana上&#xff0c;所有数据都存储在所谓的“账户”中&#xff0c;类似…...

前端引入字体文件

1. 字体下载 阿里矢量图图标库地址 https://www.iconfont.cn/&#xff0c;页面打开后选中&#xff0c;素材库 > 字体库 左侧两个标签页可以切换&#xff0c;右侧放大镜图标可以搜索自己需要的字体 字体预览区域可以自行调整进行字体预览 右上角点击字体包下载&#xff0c;下…...

qemu启动后网络怎么设置?配合qemu-system-riscv64的命令设置

QEMU启动的时候&#xff0c;可以选择组网方式&#xff0c;一般有两种选择&#xff0c;user模式和tap模式 user模式就是用NAT&#xff0c;tap模式就是用bridge网桥模式。以前也有过一次实践&#xff1a;FreeBSD RISCV 在QEME中实践-网络配置_pkg.txz: not found-CSDN博客 user…...

如何测量分辨率

一、什么是分辨率&#xff1f; 分辨率指的是分清物体细节的能力。分辨率是一个成像系统还原空间频率的能力。一些人只是简单的用分辨率去描述极限分辨率&#xff0c;但是相机在在不同的对比度的情况下还原低&#xff0c;中和高频率的能力&#xff0c;也可以显示全面综合的信息。…...

汇总贴:cocos creator

1 cocoscreator-doc-TS:目录-CSDN博客 访问节点和组件 常用节点和组件接口 创建和销毁节点 加载和切换场景 获取和设置资源 监听和发射事件 节点系统事件 缓动系统&#xff08;cc.tween&#xff09; 使用计时器 使用对象池 使用 TypeScript 脚本 模块化脚本 脚本执行顺序 全局…...

[N1CTF 2018]eating_cms

[N1CTF 2018]eating_cms 知识点 文件上传 解题 这个题感觉还好&#xff0c;知识点真心不难&#xff0c;就是全混在一起。 思路差不多挺离谱 首先看到&#xff0c;有一个登录界面&#xff0c;然后猜测有注册界面 admin注册不了&#xff0c;随便注册一个账号。 注册之后&…...

重拾设计模式--建造者模式

文章目录 建造者模式&#xff08;Builder Pattern&#xff09;概述建造者模式UML图作用&#xff1a;建造者模式的结构产品&#xff08;Product&#xff09;&#xff1a;抽象建造者&#xff08;Builder&#xff09;&#xff1a;具体建造者&#xff08;Concrete Builder&#xff…...

【机器学习】以机器学习为翼,翱翔网络安全创新苍穹

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在数字化浪潮汹涌澎湃的当下&#xff0c;网络安全如同守护数字世界的坚固堡垒&#xff0c;其重要性不言而喻。而机器学习技术的蓬勃…...

人工智能在VR展览中扮演什么角色?

人工智能&#xff08;AI&#xff09;在VR展览中扮演着多重关键角色&#xff0c;这些角色不仅增强了用户体验&#xff0c;还为展览的组织者提供了强大的工具。 接下来&#xff0c;由专业从事VR展览制作的圆桌3D云展厅平台为大家介绍AI在VR展览中的一些主要作用&#xff1a; 个性…...

mysql,创建数据库和用户授权核心语句

一.库操作1.创建库create database if not exists 库名 default 字符集 default 校对规则2.删除库drop database if exists 库名3.修改库的,字符集,校对规则alter databse 库名 default 字符集 default 校对规则4.查看当前使用的库seclect databse();5.查看库show databases;…...

日期区间选择器插件的操作流程

我们知道&#xff0c;在开发过程中&#xff0c;为了能够在规定时间内完成项目&#xff0c;有时候我们都会使用插件来大大提高我们的开发效率&#xff0c;有些插件是可以直接拿来用&#xff0c;但是有些插件拿过来之后是需要进行修改&#xff0c;在使用插件的时候还有很多的注意…...

【WRF教程第3.2期】预处理系统 WPS详解:以4.5版本为例

预处理系统 WPS 详解&#xff1a;以4.5版本为例 WPS 嵌套域&#xff08;WPS Nested Domains&#xff09;USGS 和 MODIS 土地利用重力波拖拽方案静态数据&#xff08;Gravity Wave Drag Scheme Static Data&#xff09;1. 什么是重力波拖拽方案&#xff08;GWDO&#xff09;静态…...

深度学习的DataLoader是什么数据类型,为什么不可用来索引

在 Python 中&#xff0c;DataLoader是torch.utils.data.DataLoader类的实例对象&#xff0c;用于加载数据&#xff0c;它本身不是一种基本数据类型&#xff0c;而是一种特殊的迭代器类型&#xff0c;主要用于按批次加载数据&#xff0c;以下是其通常不可索引的原因&#xff1a…...

物理信息神经网络(PINN)八课时教案

物理信息神经网络&#xff08;PINN&#xff09;八课时教案 第一课&#xff1a;物理信息神经网络概述 1.1 PINN的定义与背景 物理信息神经网络&#xff08;Physics-Informed Neural Networks&#xff0c;简称PINN&#xff09;是一种将物理定律融入神经网络训练过程中的先进方…...

Linux setfacl 命令详解

文章目录 Linux setfacl 命令详解一、ACL 和 setfacl 简介二、基本语法三、常用操作1. 查看 ACL2. 为用户设置权限3. 为组设置权限4. 删除 ACL 条目5. 设置默认 ACL6. 递归设置 ACL 四、示例操作1. 创建示例目录和文件2. 设置 ACL3. 验证 ACL 五、注意事项六、总结 Linux setfa…...

国内专业的铣打机厂家哪家专业

在制造业蓬勃发展的今天&#xff0c;铣打机作为轴类零件加工的关键设备&#xff0c;其性能和质量直接影响着生产效率和产品质量。面对市场上众多的铣打机厂家&#xff0c;该如何选择一家专业可靠的呢&#xff1f;今天就为大家介绍一家在行业内颇具口碑的企业——无锡通亚数控智…...

Exchange邮件批量删除工具有了网络版了

原有的<<Exchange邮件批量删除工具>>单机版现在已经更新为BS架构网络版&#xff0c;这样只要有网络就可以使用此系统了&#xff0c;方便随时应急。产品也启用了新名称为&#xff1a;MIRS邮件应急响应系统。此系统在几个有大型Exchange server部署的客户处使用效果很…...

从“工具辅助”到“智慧赋能”:青软青之深度集成LIMS、ELN、AUTO等核心系统,打造全场景智慧实验室新范式

在科研创新迭代加速、检验检测产业升级纵深推进的今天&#xff0c;实验室作为创新源头&#xff0c;其运行效率与管理水平直接决定研发效能与质量。传统依赖人工记录、纸质流转和信息孤岛的模式&#xff0c;已难以适应复杂实验需求与严苛合规监管。智慧实验室&#xff0c;正成为…...

基于西门子PLC的空压机组储气风冷机组自动控制系统:“手动自动切换、多机控制及实时监测报警系统

基于西门子plc的空压机组储气风冷机组自动控制系统 可以实现手动自动切换 三组空压机分别自动控制&#xff0c;自动检测三路压力 风冷机运行实时检测 报警查寻&#xff0c;参数设置等上周刚把车间那套跑了快十年的空压机组控制系统给换了&#xff0c;用的是西门子S7-1200&#…...

SeqGPT-560M效果展示:跨句指代消解能力——‘该公司’→‘北京智云科技有限公司’

SeqGPT-560M效果展示&#xff1a;跨句指代消解能力——‘该公司’→‘北京智云科技有限公司’ 今天&#xff0c;我想和你聊聊一个在信息抽取领域里特别“聪明”的能力——跨句指代消解。听起来有点专业&#xff0c;对吧&#xff1f;别担心&#xff0c;我用大白话给你解释。 想…...

Pixel Aurora Engine真实案例:用‘蒸汽朋克猫武士’生成整套游戏美术资源

Pixel Aurora Engine真实案例&#xff1a;用蒸汽朋克猫武士生成整套游戏美术资源 1. 项目背景与工具介绍 Pixel Aurora Engine&#xff08;像素极光引擎&#xff09;是一款基于AI扩散模型的高端像素艺术生成工具。它采用复古的8-bit游戏机风格界面&#xff0c;却能产出专业级…...

Qwen3-14B开源模型实战:跨境电商多平台产品文案批量生成

Qwen3-14B开源模型实战&#xff1a;跨境电商多平台产品文案批量生成 1. 跨境电商文案生成的痛点与解决方案 跨境电商运营面临的最大挑战之一&#xff0c;就是需要为同一款产品在不同平台&#xff08;亚马逊、eBay、速卖通等&#xff09;生成符合各自规范的优质文案。传统人工…...

探索Univer:构建企业级文档协作系统的全栈框架

探索Univer&#xff1a;构建企业级文档协作系统的全栈框架 【免费下载链接】univer Build AI-native spreadsheets. Univer is a full-stack framework for creating and editing spreadsheets on both web and server. With Univer Platform, Univer Spreadsheets is driven d…...

Jimeng LoRA环境部署教程:Python+Torch+CUDA兼容性避坑与版本匹配指南

Jimeng LoRA环境部署教程&#xff1a;PythonTorchCUDA兼容性避坑与版本匹配指南 1. 项目简介 Jimeng LoRA&#xff08;即梦LoRA&#xff09;是一个专门为LoRA模型测试设计的轻量级文本生成图像系统。这个项目的核心价值在于它能让你只用加载一次基础模型&#xff0c;然后快速…...

终极指南:如何使用Python实现同花顺自动化程序交易

终极指南&#xff1a;如何使用Python实现同花顺自动化程序交易 【免费下载链接】jqktrader 同花顺自动程序化交易 项目地址: https://gitcode.com/gh_mirrors/jq/jqktrader 在量化投资领域&#xff0c;自动化交易已成为专业投资者的标准配置。本文将详细介绍如何利用jqk…...