自建邮件测试收件箱:飞牛 NAS Docker 部署 Mailpit,开发环境发出的信全接住并远程查看
作者
小编
发布时间

项目介绍
Mailpit 是一个给开发环境用的邮件测试工具。它同时是一台 SMTP 服务器和一个网页收件箱:你把项目里发信的地址指到它上面,注册确认信、重置密码信、日报、告警,全都被它接住,在网页上一封封点开看,而不会真的投递到任何人的邮箱里。
对开发来说,最实在的地方是它省掉了「找一个真邮箱来收测试信」这件事。本地调发信功能的时候,不用担心把半成品的模板发到同事或者用户那儿,也不用为了看一封信去登录别的邮箱。
它把每封信的原始内容都留着:渲染后的 HTML 正文、纯文本正文、完整的邮件头、原始报文,都能在页面上切着看。HTML 邮件还能直接切成手机视图,看看在小屏幕上排版会不会崩 —— 这一步平时最容易漏,出问题又最难查。
项目在 GitHub 上开源(MIT 协议),作者提供了官方镜像,NAS 上拉下来就能跑,不用自己构建。
部署安装
装在自己的 NAS 上之后,只能在家里的网络访问。想在外面也能打开,家里又没有公网 IP,可以用 帕斯内网穿透 把网页收件箱开放到公网 —— 飞牛的应用中心里就能直接装到插件,不用另外找工具。下面这套流程在飞牛 NAS 上从头到尾走一遍。
第一步:准备编排文件
下面这份编排照着官方文档的示例来,加了一行网页端的账号口令。需要你按自己的情况改的只有口令那一行。
1services:2 mailpit:3 image: axllent/mailpit4 container_name: mailpit5 ports:6 # 8025 是网页收件箱,浏览器敲它;1025 是 SMTP,开发机往这儿发信7 - 8025:80258 - 1025:10259 volumes:10 # 收到的信存这儿,删容器不丢11 - ./data:/data12 environment:13 MP_MAX_MESSAGES: 500014 MP_DATABASE: /data/mailpit.db15 # 网页端的账号口令,冒号前是用户名。改成你自己的,别照抄我的16 MP_UI_AUTH: "admin:换成你自己的口令"17 # SMTP 端不校验账号密码 —— 它只在家里的局域网用,方便开发机随便发18 MP_SMTP_AUTH_ACCEPT_ANY: 119 MP_SMTP_AUTH_ALLOW_INSECURE: 120 restart: unless-stopped21
镜像这一行跟着上游文档写,连标签都不带 —— 官方示例原文就是这样。钉死一个版本号,以后项目更新,你这份编排还停在老版本上。
端口有两个,分工不一样,别混了。8025 是网页收件箱,也就是你在浏览器里敲的那个;1025 是 SMTP,是你的项目往这儿投信用的。冒号左边是宿主端口,跟你机器上别的服务撞了就换一个;右边是容器内部的端口,不要动。
挂载这一行把收到的信存到编排文件旁边的 data 目录里,删掉容器重建,之前收的信还在。这里用的是绑定挂载(左边写成 ./data 这种相对路径),不用具名卷 —— 数据看得见摸得着,备份的时候直接把这个目录拷走就行。
MP_UI_AUTH 是网页端的账号口令,冒号前面是用户名,后面是口令。**这一行请改成你自己的,别照抄。**这个东西一旦开放到公网,不设口令就等于把你项目发出的所有邮件公开挂在网上 —— 注册确认链接、重置密码链接都在里面。想设多组账号的话,用空格隔开写在同一行里。
最后那两行让 SMTP 端不校验账号密码,这是官方示例里就有的,本地开发确实方便:项目那边随便填个用户名口令都能投进来。正因为这样,**SMTP 这个口只留在家里的局域网里用,不要开放到公网** —— 下一步建隧道的时候只映射 8025 那一个端口。
MP_MAX_MESSAGES 是收件箱最多留多少封,超过之后自动把最旧的丢掉,免得一直涨。
第二步:在飞牛里建 Compose 项目
打开飞牛桌面上的 Docker,切到上面的「Compose」,点右上角的「新增项目」。项目名称填 mailpit。
路径这一栏点开右边的图标,在「我的文件」下面挑一个空文件夹并选中它。这个文件夹就是这个项目以后放编排文件和邮件数据的地方。
来源选「创建docker-compose.yml」,把上面那段编排整段贴进去,勾上「创建项目后立即启动」,点确认。镜像很小,拉完项目就会自己跑起来,回到列表能看到它是运行中。
第三步:用 PassNAT 插件开放到公网
在飞牛的应用中心里搜 PassNAT,装上,用账号登一次。打开插件切到「隧道」,点「创建隧道」。
隧道名称随便起(注意不能超过 12 个字符),接入节点和传输协议保持默认。本地 IP 这一栏不用动,留空默认就是 127.0.0.1 —— 插件本来就跑在 NAS 上,回环地址天然指向本机。本地端口**只填 8025 这一个**,也就是网页收件箱那个口。
这里要专门说一句:不要顺手把 1025 也映射出去。上一步里 SMTP 端是不校验账号的,一旦挂到公网,等于放了一台谁都能往里投信的服务器出去。而这一期的用法本来也不需要它上公网 —— 发信是在家里的网里发的,只有看信才需要从外面进来。
创建完回到隧道列表,点开这条隧道的详情,按标题行最左边那个电源图标启动它,状态转成「运行中」。详情里「公网连接」那一列的地址,就是你在外面要访问的地址。第一次打开会让你输编排里设的那组账号口令。
第四步:让开发环境往它发信
接下来把你项目里发信的配置指到这台 NAS 上:SMTP 主机填 NAS 在局域网里的地址,端口填 1025,用户名和口令随便填(上面那两行让它不校验),加密方式关掉。
配好之后,让项目发一封信试试。网页收件箱那边不用刷新,页面会自己把新到的信推上来,人在外面用公网地址开着页面,家里的项目一发信,这边就跳出来了。
一些说明
点开一封信之后,上面那排标签可以在渲染后的 HTML、HTML 源码、纯文本、邮件头、原始报文之间切。右上角还有手机、平板、桌面三个视图按钮,点手机那个就能看到这封信在窄屏上的样子。
HTML Check 那一栏会给这封信的 HTML 打个分,把那些在部分邮件客户端里不被支持的写法列出来,写邮件模板的时候挺有用。Link Check 会把正文里的链接挨个访问一遍,看看有没有已经失效的。
搜索框支持按发件人、收件人、标题和正文搜,信多了之后靠它定位比翻页快。
界面本身是英文的,但邮件的中文标题和中文正文显示都是正常的。