https://github.com/yumusb/email_router
duck.com selfhost, docker, catch-all
https://github.com/yumusb/email_router
catch-all domain-email duckduckgo-email email email-forwarding golang privacy privacy-protection self-hosted selfhost smtp-server tempmail-server
Last synced: 5 months ago
JSON representation
duck.com selfhost, docker, catch-all
- Host: GitHub
- URL: https://github.com/yumusb/email_router
- Owner: yumusb
- Created: 2024-09-19T16:51:08.000Z (almost 2 years ago)
- Default Branch: master
- Last Pushed: 2025-04-02T12:43:10.000Z (about 1 year ago)
- Last Synced: 2025-04-02T13:25:35.069Z (about 1 year ago)
- Topics: catch-all, domain-email, duckduckgo-email, email, email-forwarding, golang, privacy, privacy-protection, self-hosted, selfhost, smtp-server, tempmail-server
- Language: Go
- Homepage:
- Size: 287 KB
- Stars: 21
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
README
# EMAIL ROUTER
该项目是一个支持 **多域名 Catch-All 邮件收件** 的工具,所有收到的邮件都不会存储,直接转发。它可以将邮件转发到 **Telegram 机器人** 和 **私人邮箱地址**。该工具的设计灵感来源于 [DuckDuckGo Email Protection](https://duckduckgo.com/duckduckgo-help-pages/email-protection/) ,目标是提供一个完全自托管的解决方案。
## 功能介绍
- **Catch-All 邮件转发:** 支持将接收到的所有邮件直接转发到指定邮箱,而无需存储邮件内容。
- **Telegram 机器人通知:** 收到的邮件可通过 Telegram 机器人进行实时通知。

- **多域名支持:** 可以跨多个域名进行邮件转发处理。
- **SMTP 邮件发送:** 提供邮件发送功能,可以通过你定义的**私人邮箱地址**将邮件转发给指定的收件人。

## 端口说明
| 端口 | 协议 | 加密方式 | 用途 |
|------|------|----------|------|
| **25** | SMTP | STARTTLS 可选 | 服务器间收信 |
| **587** | Submission | STARTTLS | 客户端发信(推荐) |
| **465** | SMTPS | 隐式 TLS | 客户端发信(旧版兼容) |
## 部署步骤
### 前置准备
#### 1. 服务器准备
公网IP(以223.223.223.223为例),25端口可达 (可以通过本项目内的`check_port_25_connectivity.sh`进行测试) ,服务器安装好Docker,设置PTR记录(可选,如果只收信则不需要)
#### 2. 域名准备
想要使用的域名(以404.local、403.local为例)
主域名需要设置MX服务器的A记录、MX记录、SPF记录。
```txt
;; A Records
mx1.404.local. 1 IN A 223.223.223.223
;; MX Records
404.local. 1 IN MX 5 mx1.404.local.
;; TXT Records
404.local. 1 IN TXT "v=spf1 mx:404.local -all"
```
其他域名需要设置MX记录,SPF记录跟随主域名
```txt
;; MX Records
403.local. 1 IN MX 5 mx1.404.local.
;; TXT Records
403.local. 1 IN TXT "v=spf1 include:404.local -all"
```
(不一定非要mx1前缀,任意都可)
### 1. 克隆仓库
```bash
git clone https://github.com/yumusb/email_router.git
cd email_router/deploy
```
### 2. 证书相关配置
项目使用`acme.sh`提供证书,以保证收信过程中的安全。打开 .env 配置文件
```config
DNS_API=dns_cf #目前指定了CF,后续可能完善逻辑
ACME_SH_EMAIL= #随便一个邮箱,用来初始化acme账户
MXDOMAIN= #mx服务器的域名,用来申请证书,按照本文中的例子就需要是mx1.404.local
CF_Token= # 权限需要可以操作 404.local的DNS解析
CF_Zone_ID= # 404.local的Zone ID
```
### 3. config.yml配置
```yml
telegram:
bot_token: "<你的_bot_token>"
chat_id: "<你的_chat_id>"
send_eml: false # 是否通过Telegram发送原始EML文件
smtp:
listen_address: "0.0.0.0:25" # Port 25 - SMTP (收信)
listen_address_tls: "0.0.0.0:587" # Port 587 - Submission (STARTTLS)
listen_address_smtps: "0.0.0.0:465" # Port 465 - SMTPS (隐式TLS,可留空不启用)
allowed_domains:
- "404.local"
- "403.local"
cert_file: "/cert/fullchain.pem"
key_file: "/cert/key.pem"
private_email: "root123645@foxmail.com"
enable_dmarc: false # 是否启用DMARC签名
dkim_selector: "dkim" # DKIM选择器
dkim_private_key: | # DKIM私钥(支持 RSA/Ed25519,仅enable_dmarc为true时需要)
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
dkim_selector_2: "ed" # 第二个 DKIM 选择器(可选,用于双签名)
dkim_private_key_2: | # 第二个 DKIM 私钥(可选,通常配合Ed25519使用)
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
webhook:
enabled: false # 是否启用Webhook通知
method: "POST"
url: "https://example.com/webhook"
headers:
Authorization: "Bearer my-token"
body:
title: "新邮件: {{.Title}}"
content: "详情: {{.Content}}"
bodyType: "json"
```
需要修改的有:
- `telegram` 相关配置
- `allowed_domains` 修改为自己的域名
- `private_email` 修改为要转发到的邮箱
- `listen_address_smtps` 如不需要465端口可留空
- `listen_address_smtps` 如不需要465端口可留空
# 高级反垃圾配置
blacklist:
- "spammer@bad.com" # 拦截特定发件人
- "@spam-domain.com" # 拦截特定域名发来的邮件
disabled_recipients:
- "leaked-alias@my.com" # 停用特定的收信别名
### 4. 生成 DKIM 密钥
#### 生成 RSA 密钥 (兼容性好)
```bash
openssl genrsa -out dkim_rsa.pem 2048
```
将生成的 `dkim_rsa.pem` 内容填入 `dkim_private_key`。
#### 生成 Ed25519 密钥 (更安全、更短)
```bash
openssl genpkey -algorithm ed25519 -out dkim_ed25519.pem
```
将生成的 `dkim_ed25519.pem` 内容填入 `dkim_private_key_2`,并设置 `dkim_selector_2`。
### 5. 启动
```shell
docker compose up -d
```
由于初次启动需要申请证书,所以需要一点时间来启动,只有有效的证书才能启动邮件服务。
### 5. 收件
为防止出现未知问题,程序对收件地址的规则做了限制。允许的收件地址规则为`^(\w|-)+@.+$`
例如以下:
> root@404.local
> 404@404.local
> my-admin@404.local
> random@404.local
可以结合`Bitwarden`中的用户名生成器,效果更佳。
可以通过自己的其他邮箱向域名邮箱进行发信测试,不出意外应该可以收到来自自己域名转发的邮件。
### 6. 发件
与[DuckDuckGo Email Protection](https://duckduckgo.com/duckduckgo-help-pages/email-protection/duck-addresses/how-do-i-compose-a-new-email/) 的逻辑一样
> For example, if your personal Duck Address is jane@duck.com and you want to send to your friend's email brian@gmail.com. To send the email from your personal Duck Address, you would send the message to brian_at_gmail.com_jane@duck.com.
其中 jane 可以是你喜欢的、你需要的 任意前缀,因为这是你的域名。
同样的,直接回复收到的转发的来信,服务器也会帮你自动转发回去。
需要注意的是,发信非常依赖信誉,你的IP信誉、域名信誉、PTR设置等。如果你发现私人邮箱收到的邮件在垃圾箱,可以手动加白下,很有可能发送给别人的也进了垃圾箱。
### 7. 邮件管理功能 (New!)
您可以通过发送邮件到 `router-admin@<您的域名>` 来动态管理黑名单和禁用别名。必须使用配置文件中 `private_email` 指定的邮箱发送指令。
**指令格式(邮件主题 Subject)**:
- 屏蔽发件人: `BLOCK spammer@bad.com`
- 解除屏蔽: `UNBLOCK spammer@bad.com`
- 禁用别名: `DISABLE leaked@yourdomain.com`
- 启用别名: `ENABLE leaked@yourdomain.com`
**Telegram 快捷操作**:
收到的邮件转发通知中,底部会附带 `Block Sender` 和 `Disable Alias` 的 `mailto` 链接。点击链接会自动创建一封填好指令的邮件,您只需点击发送即可完成操作。
### 规则持久化
所有的动态规则会保存在 `data/rules.json` 文件中,重启服务后依然有效。
## 其他问题
### TODO
- [x] SPF check
- [x] 多端口支持 (25/587/465)
- [x] Graceful shutdown
- [ ] 证书自动续期相关逻辑
- [ ] SMTP AUTH 认证
- [ ] IMAP 收信支持