乐趣区

关于docker:使用-Docker-搭建适用于-HomeLab-的轻量邮件网关

本篇文章将介绍如何应用 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 进行二次开发

从我的项目以后呈现的问题和社区里的反馈里,咱们能够看到几个比拟显著的问题:

  1. 软件文档和官网镜像仿佛“对不上号”,一些代码中的依赖配置项也是有问题的,会导致软件无奈失常应用。issue #376、issue list
  2. 作者官宣弃坑,后来者做了 fork 版本,但仅仅是解决了一些根底问题。issue #335
  3. 软件依赖和运行时都过于古老,依赖的 lib 的版本不足无效治理,NPM 子依赖中不少依赖都曾经被废除或者存在安全隐患。
  4. 应用更牢靠的 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…

退出移动版