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

server/2024/12/21 10:34:02/

以下代码来自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}}

go_31">创建mailer.go

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

go">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_124">加载SMTP服务配置

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

go">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使用

go">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接收示例
在这里插入图片描述
具体的邮件内容
在这里插入图片描述
在邮件内的具体内容
在这里插入图片描述


http://www.ppmy.cn/server/151923.html

相关文章

Redis 到 Redis 数据迁移同步

简述 Redis 是一个开源的高性能内存数据库&#xff0c;支持键值对和多种数据结构&#xff08;如字符串、列表、集合、哈希等&#xff09;&#xff0c;常用于缓存、实时数据处理和分布式锁。它提供持久化、主从复制和高可用集群功能&#xff0c;适用于高并发低延迟场景。 本文…

nginx安装教程笔记(包含访问控制)

目录 一、 nginx的安装 二、 访问控制 基于授权访问控制 基于客户端的访问控制 一、 nginx的安装 1. 安装组件 yum -y install pcre-devel zlib-devel gcc gcc-c make 2. 创建用户 useradd -M -s /sbin/nologin nginx 3. 解压源码包并编译安装 tar zxvf nginx-1.12.0…

Redis问题篇

问题 Q1&#xff1a;WRONGTYPE Operation against a key holding the wrong kind of value A1: redis中已经存在同名&#xff0c;但不一样类型的key值

使用pyinstaller打包pyqt的程序,运行后提示ModuleNotFoundError: No module named ‘Ui_main‘

环境&#xff1a;windowpython3.9pyqt6 使用pyqt UI编辑器生成了main.ui &#xff0c;main.ui编译成了Ui_main.py main.py 使用当前目录下的Ui_main.py。 打包过程没报错&#xff0c;运行报错。 错误如下: 解决方法&#xff1a;pyinstaller -Fw main.py --paths. 使…

SSM 架构中 JAVA 网络直播带货查询系统设计与 JSP 有效实现方法

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网络直播带货网站当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网络直播带货网站&#xff0c;它彻底改变了过…

基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视…

202411 第十六届蓝桥杯青少组 STEMA 考试真题 汇总

2024年11月 第十六届 蓝桥杯青少组 STEMA测评考试&#xff0c;包含scratch图形化编程&#xff0c;Python&#xff0c;C&#xff0c;microbit&#xff0c;EV3&#xff0c;arduino&#xff0c;计算思维U12,U8,U10等真题汇总。 202411 蓝桥杯青少组 STEMA测评 Scratch 试题 20241…

《梦梁百景图》开机 林墨饰演元气少年胡天乐自带戏腔天赋

12月15日&#xff0c;由炽火&#xff08;苏州&#xff09;影视科技有限公司出品的电视剧《梦梁百景图》在江苏昆山开机&#xff0c;该剧讲述一群年轻人为了保护香配方&#xff0c;推广香&#xff0c;仗义出行收获颇丰的故事。 其中&#xff0c;演员林墨饰演“胡天乐”&#xff…