This commit is contained in:
2026-01-19 22:31:58 +01:00
parent e0c51ea3bd
commit bb19a37d62
4 changed files with 48 additions and 10 deletions
+1 -1
View File
@@ -1 +1 @@
@import 'colors.css'; @import 'colors.css';
+11 -2
View File
@@ -1,10 +1,10 @@
[Settings] [Settings]
gtk-theme-name=catppuccin-mocha-blue-standard+default gtk-theme-name=catppuccin-mocha-blue-standard+default
gtk-icon-theme-name=Papirus gtk-icon-theme-name=Papirus
gtk-font-name=Noto Sans, 10 gtk-font-name=Noto Sans 10
gtk-cursor-theme-name=Bibata-Modern-Ice gtk-cursor-theme-name=Bibata-Modern-Ice
gtk-cursor-theme-size=24 gtk-cursor-theme-size=24
gtk-toolbar-style=GTK_TOOLBAR_ICONS gtk-toolbar-style=3
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-button-images=0 gtk-button-images=0
gtk-menu-images=0 gtk-menu-images=0
@@ -15,3 +15,12 @@ gtk-xft-hinting=1
gtk-xft-hintstyle=hintslight gtk-xft-hintstyle=hintslight
gtk-xft-rgba=rgb gtk-xft-rgba=rgb
gtk-application-prefer-dark-theme=1 gtk-application-prefer-dark-theme=1
gtk-cursor-blink=true
gtk-cursor-blink-time=1000
gtk-decoration-layout=icon:minimize,maximize,close
gtk-enable-animations=true
gtk-modules=colorreload-gtk-module:appmenu-gtk-module
gtk-primary-button-warps-slider=true
gtk-shell-shows-menubar=1
gtk-sound-theme-name=ocean
gtk-xft-dpi=122880
+1 -1
View File
@@ -1,7 +1,7 @@
[Settings] [Settings]
gtk-theme-name=catppuccin-mocha-blue-standard+default gtk-theme-name=catppuccin-mocha-blue-standard+default
gtk-icon-theme-name=Papirus gtk-icon-theme-name=Papirus
gtk-font-name=Noto Sans, 10 gtk-font-name=Noto Sans 10
gtk-cursor-theme-name=Bibata-Modern-Ice gtk-cursor-theme-name=Bibata-Modern-Ice
gtk-cursor-theme-size=24 gtk-cursor-theme-size=24
gtk-application-prefer-dark-theme=1 gtk-application-prefer-dark-theme=1
+35 -6
View File
@@ -27,6 +27,16 @@
也就是帮你发邮件的服务商, 详见后续章节. 也就是帮你发邮件的服务商, 详见后续章节.
> 或者也可以自己发, 但要额外做好以下准备:
>
> - 出入站均畅通无阻的 25 端口
> - 良好的 IP 声誉
> - 绝对完善的安全策略
> - 耗费数周乃至数月培养 IP 声誉的时间与物质成本
> - 为 IP 长期保活的持久战准备
>
> 如果确实觉得没问题, 那么可以忽略下文中所有有关 SMTP 中继相关的内容, 就本文包含的内容而言步骤区别并没有很大.
4. 一个拥有公网 IP 和充足空闲资源的服务器, 并且(至少)需要开通以下 TCP 端口: 4. 一个拥有公网 IP 和充足空闲资源的服务器, 并且(至少)需要开通以下 TCP 端口:
| 端口 | 用途 | 出站 | 入站 | 说明 | | 端口 | 用途 | 出站 | 入站 | 说明 |
@@ -38,7 +48,9 @@
很多云服务商会默认屏蔽 25 端口的出站方向流量, 但这对于使用 SMTP 中继服务的场景来说并不重要, 因为发信时直接连接收件方服务器的并非自己的服务器. 很多云服务商会默认屏蔽 25 端口的出站方向流量, 但这对于使用 SMTP 中继服务的场景来说并不重要, 因为发信时直接连接收件方服务器的并非自己的服务器.
同时, 最好支持 rDNS, 也就是把 IP 反解析到域名. 同时, 最好支持 rDNS, 也就是把 IP 反解析到域名. IPv4 和 IPv6 用到哪个就配置哪个, 都用得到就都配置.
> 如果不使用 SMTP 中继服务, 则必须配置 rDNS
下文中将使用 `1.14.5.14` 作为服务器的公网 IP 地址. 下文中将使用 `1.14.5.14` 作为服务器的公网 IP 地址.
@@ -76,7 +88,7 @@
> [!IMPORTANT] > [!IMPORTANT]
> >
> 再次说明, 如果使用 SMTP 中继服务, 25 端口的出站并不重要. 只需要保证入站开放即可. > 再次说明, 如果使用 SMTP 中继服务, 25 端口的出站并不重要. 只需要保证入站开放即可. 反之则必须保证 25 端口出入站通畅.
2. 解决占用: 2. 解决占用:
@@ -92,7 +104,7 @@
此类服务可以大致理解为"帮你发邮件的中介", 他们有一大堆 IP 地址, 这些地址的声誉都不错, 因此用他们发信的话, 邮件更容易送达收件箱而不是自动进入垃圾箱. 并且也可以避免 25 端口出站被封的问题. 此类服务可以大致理解为"帮你发邮件的中介", 他们有一大堆 IP 地址, 这些地址的声誉都不错, 因此用他们发信的话, 邮件更容易送达收件箱而不是自动进入垃圾箱. 并且也可以避免 25 端口出站被封的问题.
我此次用的是 [Resend](https://resend.com), 其他类似服务还有 [SendGrid](https://sendgrid.com), [Mailgun](https://www.mailgun.com) 等等. 我此次用的是 [Resend](https://resend.com), 其他类似服务还有 Amazon SES, Mailgun 等等.
大体分为这样几步: 大体分为这样几步:
@@ -229,6 +241,11 @@ services:
- `ENABLE_RSPAMD=0` - `ENABLE_RSPAMD=0`
- `RSPAMD_LEARN=0` - `RSPAMD_LEARN=0`
- 如果不需要 SMTP 中继服务, 可以删除以下环境变量:
- `DEFAULT_RELAY_HOST=[smtp.resend.com]:587`
- `RELAY_USER=resend`
- `RELAY_PASSWORD=res_some_random_api_key`
- 如果垃圾邮件实在太多: - 如果垃圾邮件实在太多:
- `RSPAMD_GREYLISTING=1` - `RSPAMD_GREYLISTING=1`
@@ -240,7 +257,7 @@ services:
- `ENABLE_FAIL2BAN=1`: - `ENABLE_FAIL2BAN=1`:
Fail2Ban 用于防止暴力破解邮箱密码, 需要 `NET_ADMIN` 权限, 挂载 `./fail2ban` 目录用于保存状态. Fail2Ban 用于防止暴力破解, 需要 `NET_ADMIN` 权限, 挂载 `./fail2ban` 目录用于保存状态.
- `DEFAULT_RELAY_HOST=[smtp.resend.com]:587` - `DEFAULT_RELAY_HOST=[smtp.resend.com]:587`
@@ -330,7 +347,7 @@ DMARC 记录用于指定邮件接收方如何处理未通过 SPF 或 DKIM 检查
- `sp=none`: 对子域名的策略同样为 none. - `sp=none`: 对子域名的策略同样为 none.
- `rua=mailto`: 如果希望收到报告, 可以指定一个邮箱地址. - `rua=mailto`: 如果希望收到报告, 可以指定一个邮箱地址.
在运行一段时间并查看报告无误后, 可以将 `p` 和 `sp` 设置为 `quarantine` 或 `reject`, 以增强防护. 在运行一段时间并查看报告无误后, 可以将 `p` 和 `sp` 设置为 `quarantine` 或 `reject`, 以增强防护. `quarantine` 表示将可疑邮件标记为垃圾邮件, `reject` 则表示直接拒绝这些邮件.
> [!IMPORTANT] > [!IMPORTANT]
> >
@@ -499,7 +516,7 @@ docker exec -it mailserver setup alias add @domain.tld me@domain.tld
## 更进一步 ## 更进一步
MTA-STS (Mail Transfer Agent Strict Transport Security) 通过强制要求发送方使用加密连接发送邮件防止中间人攻击, 对个人邮箱来讲~~看起来其实没啥大用但总归~~是个加分项, 并且确实会让邮箱服务变得更酷. **MTA-STS** (Mail Transfer Agent Strict Transport Security) 通过强制要求发送方使用加密连接发送邮件防止中间人攻击, 对个人邮箱来讲~~看起来其实没啥大用但总归~~是个加分项, 并且确实会让邮箱服务变得更酷.
> [!IMPORTANT] > [!IMPORTANT]
> >
@@ -565,3 +582,15 @@ MTA-STS (Mail Transfer Agent Strict Transport Security) 通过强制要求发送
- 通过 [Hardenize](https://www.hardenize.com/) 或类似的在线工具验证 MTA-STS 配置是否正确. - 通过 [Hardenize](https://www.hardenize.com/) 或类似的在线工具验证 MTA-STS 配置是否正确.
- 从支持 MTA-STS 的邮箱服务商 (例如 Gmail) 发送测试邮件, 查看 Postfix 日志来验证入站时 TLS 握手等流程是否符合预期. 至于 MTA-STS 是否真的生效, 可以稍后查看 TLS-RPT 报告邮箱收到的相关报告来确认. - 从支持 MTA-STS 的邮箱服务商 (例如 Gmail) 发送测试邮件, 查看 Postfix 日志来验证入站时 TLS 握手等流程是否符合预期. 至于 MTA-STS 是否真的生效, 可以稍后查看 TLS-RPT 报告邮箱收到的相关报告来确认.
---
> What, Why, How. 以上是 What 和 How, 接下来是...
## 为什么要做自建邮局?
排除利益驱动, 我能想到的最合适的接口就是"隐私". 可是如果登陆 Resend 的后台看一眼, 就会发现我写的邮件被一份份明晃晃地不加掩饰地放在那里, 所有的内容都以明文的方式被看得一清二楚. 此时和使用公共邮箱服务唯一的区别似乎也就只剩"有一个很酷的后缀"这一点了. 即便真的解决了 25 端口问题 (是的, 写完上述内容的几天后我确实做到了) 从而得以摆脱 SMTP 中继服务, 在惊讶于明明 Mail-Tester 给出了 10/10 的满分评价但还是被 Gmail 扔进垃垃圾箱的残酷现实之余, 我也意识到自建邮局这条路仅靠热情是绝对走不通的. 一是预热 IP 需要花费的时间成本乃至金钱成本远超我的想象, 二是无论如何邮件内容也会被收件方的平台以算法评估一遍的事实彻底击碎了对于"隐私"乌托邦最后的妄想. 即使有这么多复杂的安全措施, 补齐了传输过程中的每一个可能的安全漏洞, 但真正和我点对点沟通的从来都只是靠着一条条既定规则维系的平台, 而不是我在写下收件地址时心中所想的一个个鲜活的人.
那么做这一切的目的到底是什么呢? 或许也只剩"酷"了吧, 除此之外我唯一能想到的好处就是在仅需要邮箱就能注册账号的平台注册无穷无尽的小号.
Anyway, 确实是我拥有域名和服务器以来部署过最复杂, 折腾时间最久, 也可能是最无用的服务. 仅论过程还是很有意思的, 至少能让我理解现代电子邮箱系统到底是如何运作的. ~~闲的没事的话~~还是很值得试一试的 :)