本篇文章将介绍如何应用 Docker 疾速搭建一个实用于 HomeLab 和开发阶段应用的邮件网关,用来疾速聚合各种软件的告诉音讯。当然,你也能够用它来疾速验证各种软件中的邮件配置是否正确。
如果你相熟 Docker 的话,大略十分钟,你将会领有一套齐全属于本人的邮件告诉聚合服务,而这个服务,只须要 20MB 左右的内存耗费,十分轻量。
写在后面
最近在整顿家里的部署的软件和服务,这些服务少数都领有“邮件告诉”的能力,并会在必要的时候,应用“发送邮件”的形式告诉用户一些必要的信息,比方:工作执行结束、敏感操作、依据打算工作跑完的数据统计摘要等。
以往部署这些软件的时候,在邮件告诉性能配置上,咱们的抉择无非是三种:注册一个实在的邮箱,应用咱们本人曾经在用的邮箱账号,敞开邮件告诉性能。
当软件比拟少的时候,不管抉择哪种计划,都是能够的,因为咱们的一次性操作和保护老本都比拟低。
但当咱们部署了越来越多的软件和服务之后,敞开邮件告诉属于“鸵鸟行为”,是不举荐的;在不能 100% 确定软件可靠性的前提下,所有软件共享一个邮箱账号,显然是不平安的;最牢靠的计划,便是为为每一个软件配置不同的邮箱账号。
而如果为每一个软件都配置独立的邮箱账号,保护邮箱账号的工夫老本,将会变得不可漠视,因为你永远不晓得什么时候、哪一个邮箱账号会有问题,以及在什么时候你会漏掉重要的利用音讯。
所以,我开始寻找一个实用于集体或者小团队的、私有化部署的邮件网关计划,升高账号的保护老本和经济老本,以及尽可能减少不必要的公网数据交换。
软件选型
为了解决下面的问题,个别能够抉择两类软件计划:邮局类软件、邮件测试网关。
咱们先来聊聊邮局类利用。
邮局类软件应用
邮局类软件,顾名思义,和咱们日常应用的 GMail、Outlook、QQ 邮箱、163 邮箱等等。在 GitHub 上,咱们也能够找到不少优良的邮局软件应用,比方上面这些:
- (11.4k Stars)https://github.com/postalserver/postal
-
(10.9k Stars)https://github.com/mail-in-a-box/mailinabox
- 能够比较简单的和 NextCloud Mail 一起应用(625 Stars)https://github.com/nextcloud/mail
- (8.7k Stars)https://github.com/docker-mailserver/docker-mailserver
- (4.9k Stars)https://github.com/mailcow/mailcow-dockerized
- (3.5k Stars)https://github.com/Mailu/Mailu
- (2.1k Stars)https://github.com/modoboa/modoboa
下面的开源计划都能够作为咱们日常应用的云服务、出名邮件厂商的代替计划应用。
然而通常状况下,这类软件会蕴含十分多的组件和能力,比方:Web 界面、多账户反对、多种邮局聚合、各种邮件协定反对、邮件推送、垃圾邮件审查、邮件防火墙、各种简单的邮件相干的 DNS 反对等等。
随着软件性能的丰盛欠缺,软件运行过程中的资源耗费和应用中的性能复杂度天然也就下来了,加上这几个头部的我的项目,技术选型多是 Ruby、Python,资源应用天然更是“雪上加霜”。
思考到我不须要多用户反对,并且我心愿我的利用始终是 轻量牢靠的。所以,我将眼光转向了:测试网关类利用。
邮件测试网关类利用
坦白说,可能合乎我前文中提到的大部分需要,并具备比拟低的资源占用的我的项目并不多。如果再限度可能疾速进行性能验证(跑起来看成果)的我的项目,那就更比比皆是啦:
- (5.6k Stars)https://github.com/sj26/mailcatcher
- (3.2k Stars)https://github.com/maildev/maildev
在简略应用之后,我抉择了以第二个我的项目,将它作为代码基进行二次开发。毕竟基于在以往我的项目中的教训,相比拟 Ruby 的性能和效率,我对 Node 更有信念。
如果你等不及验证成果,能够跳过上面的大节,间接阅读文章的“应用 Docker 进行疾速体验”局部。
基于 MailDev 进行二次开发
从我的项目以后呈现的问题和社区里的反馈里,咱们能够看到几个比拟显著的问题:
- 软件文档和官网镜像仿佛“对不上号”,一些代码中的依赖配置项也是有问题的,会导致软件无奈失常应用。issue #376、issue list
- 作者官宣弃坑,后来者做了 fork 版本,但仅仅是解决了一些根底问题。issue #335
- 软件依赖和运行时都过于古老,依赖的 lib 的版本不足无效治理,NPM 子依赖中不少依赖都曾经被废除或者存在安全隐患。
- 应用更牢靠的 Markdown 和 HTML 互相转化计划,对内容进行平安的标签过滤。
所以,我花了一些工夫,针对原来的代码做了一些调整:
- 降级了 Node Runtime 到 v16 TLS。
- 将各种根底依赖降级到牢靠版本,解决各种平安问题。
- 从新构建可用的 Docker 容器版本。
如果你好奇到底改了哪些内容的话,能够看这里的提交记录:https://github.com/maildev/maildev/compare/master…soulteary:master
接下来,咱们来看看如何通过容器疾速应用这个“邮件工具”吧。
应用 Docker 疾速体验邮件网关
如果咱们想启动一个“邮件网关”,能够间接应用“一句话”的容器命令来解决战斗:
docker run -p 1080:1080 -p 1025:1025 soulteary/maildev
当命令执行结束,咱们将可能看到相似上面的日志输入:
MailDev using directory /tmp/maildev-1
MailDev webapp running at http://0.0.0.0:1080
MailDev SMTP Server running at 0.0.0.0:1025
接着在浏览器中关上 http://0.0.0.0:1080
,就能看到下图一样的收件箱界面了。
如果咱们须要测试邮件聚合性能是否可能失常工作,只须要应用邮件客户端、配置任意用户名和明码,向 0.0.0.0:1025
端口发送邮件,就可能看到成果啦。
还记得上文中须要配置不同账号的问题吗?是不是很轻松的就解决啦?甚至你还能够配置邮件转发实在邮箱、限度只接管某些账号的邮件音讯。
应用 Node.js 疾速验证服务性能
相比拟应用客户端,我更喜爱应用代码来做疾速验证。
这里为了不便形容,我应用 Node.js 写了一个非常简单的发信脚本:
'use strict'
const nodemailer = require('nodemailer')
async function main () {const { user, pass} = await nodemailer.createTestAccount()
let transporter = nodemailer.createTransport({
host: '0.0.0.0',
port: 1025,
auth: {type: 'login', user, pass}
})
// send mail with defined transport object
let info = await transporter.sendMail({
from: '\'Fred Foo 👻\'<foo@example.com>', // sender address
to: 'bar@example.com, baz@example.com', // list of receivers
subject: 'Hello ✔', // Subject line
text: 'Hello world?', // plain text body
html: '<b>Hello world?</b>' // html body
})
console.log('Message sent: %s', info.messageId)
// Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
// Preview only available when sending through an Ethereal account
console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info))
// Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
}
main().catch(console.error)
将下面的代码保留为 example-sendmail.js
,接着执行 node example-sendmail.js
,顺利的话,咱们将看到相似上面的日志输入:
Message sent: <c9867b60-8c5d-df8d-2476-39f5dd77f856@example.com>
Preview URL: false `
接着,在浏览器中关上 http://0.0.0.0:1080
,咱们将看到 MailDev 的界面中多了一份意料之中的“邮件”,邮件注释正是咱们下面写代码中的内容。
在不进行额定的代码调整之前,咱们多反复几次下面的发信操作,就能够模拟出日常学习和工作中各种利用的邮件告诉发送场景。
此时,MailDev 的列表中就会实时展现新到的“邮件”了。
应用 Docker-Compose 启动服务
为了不便我的老读者们,让大家可能一起偷懒,依照常规,我提供一个简略的容器编排配置文件:
version: '3'
services:
maildev:
image: soulteary/maildev
restart: always
environment:
- TZ=Asia/Shanghai
- MAILDEV_WEB_PORT=1080
- MAILDEV_SMTP_PORT=1025
ports:
- "1080:1080"
- "1025:1025"
将下面的内容保留为 docker-compose.yml
,接着应用 docker-compose up -d
启动利用,和上文提到的一样,咱们就可能在浏览器中拜访 http://localhost:1080
来浏览和治理“邮件内容”,并通过 1025
端口来进行邮件汇聚操作啦。
最初
和之前提到过的其余的我的项目一样,接下来我将继续改良这个我的项目。短时间内,我心愿它可能更好的反对 WebHook、并和一些音讯推送软件进行买通,更好的反对我的 HomeLab 场景。
如果你对这个我的项目感兴趣、又比拟“心急”的话,能够拜访我的项目源代码:https://github.com/soulteary/maildev 进行 DIY。当然,也欢送你在我的项目 issue 中留下你对这个我的项目的倡议和想法。
–EOF
咱们有一个小小的折腾群,外面汇集了几百位喜爱折腾的小伙伴。
在不发广告的状况下,咱们在外面会一起聊聊软硬件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的材料。
喜爱折腾的小伙伴欢送扫码增加好友。(增加好友,请备注实名,注明起源和目标,否则不会通过审核)
对于折腾群入群的那些事
本文应用「署名 4.0 国内 (CC BY 4.0)」许可协定,欢送转载、或从新批改应用,但须要注明起源。署名 4.0 国内 (CC BY 4.0)
本文作者: 苏洋
创立工夫: 2022 年 03 月 15 日
统计字数: 5362 字
浏览工夫: 11 分钟浏览
本文链接: https://soulteary.com/2022/03…