用pmail配置域名邮箱
起因:
原本我的邮件接收是由 Cloudflare 转发给我的 Gmail 邮箱,达到一个比较方便好记的效果[email protected](我知道 cry4o4n0tfound 这个域名很反人类,根本谈不上好记...但是不能破罐子破摔,总得让它稍微好记那么一点不是吗?👉 👈)。
以及一个域名邮箱确实看起来会比较舒服一点,虽然由 Cloudflare 转发的 Gmail 发出邮件时依旧会显示由 [email protected] 转发得来,显得不那么优雅和正宗😂,但是至少能用,毕竟也就收收没什么人发的邮件,基本又不主动发。如果没什么别的状况可能我就会保持现状懒得折腾了。
结果上周在 Gmail 的垃圾箱中翻出了这个:
仔细一看,已经是 5.7 的内容了(谁没事看垃圾箱...),以及对方的邮箱也是 Gmail......却还是被 Google 无情地扔进了垃圾箱。
这下好了,好不容易博客有人光顾还发了邮件过来请教我可能会知道的问题,结果却被 Gmail 丢进垃圾箱了...
这实在是忍不了,所以为了解决以后可能继续被 Gmail 丢垃圾箱的情况,收邮件打算换成自建的域名邮箱。
除此之外,邮件的 POP3、SMTP、以及 IMAP 协议是这学期计网自顶向下方法中少数还没怎么真正接触过的协议,本着求知欲也想自己搭着试一试。
于是这个周末稍微花了下时间配置了一下,总体还是比较简单的,但看到网上教程和 pmail 官方文档都比较简略,有些插件配置也没有提到,干脆自己来写一写。
选择:
一开始看了看 cyp 学长的 Maddy + RainLoop,其实已经很简单了,可是我还是想更方便,毕竟我只需要收邮件就可以了,自建域名邮箱发邮件的归宿大概率是垃圾箱。
于是最后我选择了 pmail。顺便用 github 教育优惠在 namecheap 上领了一个 sadcoder.me 的域名(一个伤心的程序员 : ( )。
看重 pmail 的其中一点是 pmail 非常的轻便,编译后二进制文件仅15MB,运行过程中占用内存10M以内。所以基本能挂在任何服务器上,比如挂在用于搭梯子的某个小鸡服务器,另外一点是提供一键证书申请服务,连反向代理也免了。可以说是一条龙服务。
需要注意的是,一个干净 IP 的服务器是做域名邮箱服务器的前提,如果 IP 不干净,跳进黄河也洗不清,无论怎么改 dns 记录发邮件也是进垃圾桶的宿命。
下载安装:
Pmail 下载十分简单,提供了对应的 docker 下载方法,我为了省事也是用的 docker。
先拉取对应的镜像。
docker pull ghcr.io/jinnrry/pmail:latest
运行:
docker run -p 25:25 -p 80:80 -p 443:443 -p 110:110 -p 465:465 -p 587:587 -p 995:995 -p 993:993 -v $(pwd)/config:/work/config ghcr.io/jinnrry/pmail:latest
这里的运行默认是前台,方便一开始的 debug。如果 debug 完后加上 -d 就默认分离,在后台执行了。
注:默认需要 80 端口来进行 HTTP 验证来申请证书,如果不是 80 端口需要用 dns 验证,稍微麻烦一点点。
运行后就可以在公网上访问了。一开始会有很详细的注册流程,唯一需要注意的是,最开始的用户名注册是管理员账户,web 界面上是不支持更改用户名的,而对应的邮箱,如果你注册的是 cry4o4n0tfound,那么发件的名字就是 [email protected],这也与后面的推送插件有关,所以最省事的办法是一开始就把名字想好。
然后到这里会让你去自己的域名服务商上更改对应的记录
到这里为止,其实收邮件基本已经没有什么太大的问题了,但如果想发邮件还需要完善一些 dns 记录问题,证明邮件真的是你发的。
身份验证配置:
配置完上面这些内容后,如果尝试直接发邮件——就可以成功进 Gmail 的垃圾箱了。
这是因为我们还没有配置验证邮件安全的 DNS 记录。
简单来说,现在的互联网环境里,任何没有声明“我是谁”的邮件都会被默认当作可疑对象扔进垃圾箱,尤其是像 Gmail 或者 Outlook 这种垄断式巨头来说。
为了让我们发出的邮件看起来“正经”、不被系统认为是钓鱼邮件,我们需要配置四种 DNS/政策记录来表明身份并保护传输:SPF、DKIM、DMARC 和 MTA-STS。下面逐个说明。
SPF(Sender Policy Framework,发送方策略框架)
这里和邮件伪造有关,详细可以看文末提供的文章链接,SPF用来声明“哪些服务器被我授权发送该域名的邮件”。
没有它的话,任何人都可以伪造你域名发邮件,Gmail 估计会直接丢垃圾箱😞
配置(DNS 中添加 TXT 记录):
类型:TXT
主机名:@
内容:v=spf1 ip4:你的服务器IP -all
如果你还使用了像 Gmail、SendGrid 之类的 SMTP 服务,就要加上对应的 include 规则,例如:
v=spf1 ip4:你的服务器IP include:_spf.google.com -all
-all
表示只信你列出来的 IP,其他一律拒收(推荐),更宽容的写法是 ~all
(表示“最好别信”,但也不强制)。
DKIM(DomainKeys Identified Mail,域名密钥识别邮件)
给每封邮件附上加密签名,收件方通过你域名公开的公钥验证签名,判断内容是否被篡改。
防止中间人伪造或修改邮件内容,“没签名 = 没保障”,系统不信你也是情理之中。
配置:
Pmail 会自动生成一条 DNS 记录用于 DKIM 验证,大概是这样的格式:
类型:TXT
主机名:pmail._domainkey
内容:v=DKIM1; k=rsa; p=(很长的一串公钥)
注意:这条记录非常长,一定要确保粘贴完整,不能断行或丢字符,不然验证失败邮件还是进垃圾箱。
例如我一开始就复制不完整然后进了垃圾箱。
DMARC(Domain-based Message Authentication, Reporting and Conformance,基于域的消息认证、报告与一致性)
DMARC 可以说是再上一层保险,虽然我不知道这样套娃到底在套什么......它会告诉收件方“我启用了 SPF 和 DKIM,如果它们验证失败,请怎么处理”。
没有 DMARC,收件方也不一定按 SPF 和 DKIM 严格处理邮件,有 DMARC 相当于“强制执行政策 + 邮件异常监控”。
配置:
类型:TXT
主机名:_dmarc
内容:v=DMARC1; p=quarantine; rua=mailto:dmarc@你的域名; ruf=mailto:dmarc@你的域名; pct=100
对应的字段解释:
p=quarantine
:验证失败的邮件进垃圾箱;p=reject
:干脆直接拒收;rua
和ruf
:验证报告接收邮箱地址(自己建一个用来收就行);pct=100
:100% 邮件都适用这个政策。
MTA-STS(Mail Transfer Agent Strict Transport Security,邮件传输代理严格传输安全)
这里是强制邮件服务器在传输邮件时使用 TLS 加密,防止中间人攻击(是的,就是我们信息安全经常见到的那个😥)。
即便你开启了 SSL/TLS,如果收件方服务器不要求加密,你发出去的邮件还是可能在传输过程中被监听。而 MTA-STS 是“官方说法”,告诉别人“你不给我走加密我就不收你邮件”。
和域名验证一样,有两种配置方法:
DNS TXT 记录:
类型:TXT
主机名:_mta-sts.你的域名
内容:v=STSv1; id=20250526
这里的 id=
可以随便设,只要每次更新都比上次不同即可(用于刷新缓存)。
HTTPS 托管策略文件:
在域名下托管一个策略文件, nginx 和 caddy 均可:
路径:https://mta-sts.你的域名/.well-known/mta-sts.txt
内容如下:
version: STSv1
mode: enforce
mx: sadcoder.me #指向的域名
max_age: 604800 #缓存
最后建议通过下面几个工具检测配置的 DNS 是否正确:
如果对更详细的邮件发送流程感兴趣的话,以及为什么要配置这些 dns 记录的话,可以看以下内容:
https://blog.csdn.net/weixin_45304503/article/details/145535320
https://cloud.tencent.com/developer/article/2421157
配置 telegram 机器人:
自然,这种没有推送提示的邮箱还是需要配置 webhook 一类的推送消息来提醒的。
Pmail 提供了微信和 telegram 的推送。
由于我的服务器在美西地区,我很怀疑能不能推送到微信,所以最终还是选择了 tg 推送。
github 上面 tg 插件的配置文档估计好久没更新了,How To Use 都打成了 How To Ues...
{
"tgChatId": "", // telegram chatid
"tgBotToken": "", // telegram token
}
不过这里的配置也比较简单,docker 下载的 Pmail 默认在 plugin 文件夹里面配置了插件,随着 docker 启动也会启动运行,所以只需要在宿主机挂载 config 的文件夹里的 config.json 中填写上述两个字段即可。
BotToken 可以在 tg 上添加 BotFather 获取,而 ChatId 则可以通过添加 getuserID 获取。获取后可以用 curl 先测试下是否能用。
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"chat_id": your-id, "text": "Hello bot!"}' \
"https://api.telegram.org/bot + token/sendMessage"
#注意这里的 api 路径,token 前面要加 bot
配置好后收邮件就可以成功推送啦!
注:由于 tg 插件太久没有更新,所以并不支持多用户,也就是说只有在 Pmail 上一开始注册的那个管理员账户才是可以推送消息的。不过看了一眼判断逻辑,它的推送是根据是 userid 是否为 1 做判断的,所以也可以将数据库中对应的键改一下。
接下来解决最后一个问题,垃圾邮件处理。
垃圾邮件处理:
自建邮箱另一个最大的问题就是垃圾邮件。
Pmail 提供了一个名叫 spamfilter 的垃圾邮件处理插件,docker 里也是有配置的,可以直接在 web 页面中的设置启动。
另外,如果域名托管在 Cloudflare 上,可以去 Cloudflare 上配置相应的 Zero Trust,具体可以参考它的官方文档:https://developers.cloudflare.com/email-security/
就这样,一个简单自建域名垃圾箱邮箱就搭建完成了。
这下应该能安全收到发的邮件了,但是估计没人发就是了...
end
参考:
https://github.com/Jinnrry/PMail/discussions/170
https://blog.csdn.net/weixin_45304503/article/details/145535320