---
name: smail-mail
description: "Manage smail.icu mail accounts on newyork-server (docker-mailserver + Mailu cleaned up). Use when user mentions smail.icu, mail.smail.icu, hermes@smail.icu, admin@smail.icu, newyork-server mail setup, or any send/receive email through this domain."
version: 1.0.0
author: 小虾仁 (Hermes Agent)
license: MIT
metadata:
  hermes:
    tags: [email, smail.icu, docker-mailserver, newyork-server, dovecot, postfix]
---

# smail.icu 邮件系统管理

`smail.icu` 邮件服务跑在 **newyork-server** (`snode.chat:22`, Racknerd VPS) 上，使用 **docker-mailserver (DMS)** 单一容器。Mailu 已彻底清理。

## 📋 服务总览

| 项目 | 值 |
|---|---|
| 域名 | `smail.icu`（发件用 `mail.smail.icu`）|
| 服务器 | `newyork-server`（alias in `~/.ssh/config` → `snode.chat:22` root）|
| 容器名 | `mailserver`（image: `ghcr.io/docker-mailserver/docker-mailserver:latest`）|
| 数据卷 | `/opt/maildata/mail` → `/var/mail`、`/opt/maildata/config` → `/tmp/docker-mailserver` |
| DKIM 目录 | `/opt/maildata/config/opendkim/keys/`（私钥已生成，`s=mail, d=smail.icu`）|

## 🔌 端口（全部 OPEN，STARTTLS/SSL）

| 协议 | 端口 | 加密 | 用途 |
|---|---|---|---|
| SMTP | 25 | STARTTLS | 服务器间中继 |
| Submission | 587 | STARTTLS | **客户端发件推荐** |
| SMTPS | 465 | SSL | 客户端发件（旧） |
| IMAP | 143 | STARTTLS | 客户端收件 |
| IMAPS | 993 | SSL | **客户端收件推荐** |
| POP3 | 110/995 | - | 未启用 |

## 👥 当前账号

| 账号 | 密码 | 备注 |
|---|---|---|
| `admin@smail.icu` | `123456` | 默认管理员，有 postmaster 别名 |
| `hermes@smail.icu` | `HermesMail2026!Sm4il` | 给 hermes agent 用的 |

## 🌐 DNS 配置（已生效）

| 类型 | 主机 | 值 |
|---|---|---|
| SPF | `smail.icu` | `v=spf1 mx ~all` |
| DMARC | `_dmarc.smail.icu` | `v=DMARC1; p=quarantine; rua=mailto:admin@smail.icu` |
| DKIM | `mail._domainkey.smail.icu` | 公开密钥（自动签名用 `s=mail, d=smail.icu`）|
| PTR | `snode.chat` 服务器 IP | `mail.smail.icu`（反向解析已设）|

→ **Gmail/163/Outlook 等都会通过 SPF+DKIM+DMARC 三件套验证**，**不容易进垃圾箱**（已在 2026-07-05 实测发到 `18054300335@163.com` 成功）。

---

## 🚀 SSH 链路速查

```bash
# 进入服务器
ssh newyork-server
```

不需要密码（已配 `id_ed25519`）。后续所有命令都在容器里跑。

---

## 🛠️ 账号管理（DMS 标准命令）

所有命令都通过 `docker exec mailserver setup ...`：

```bash
# 查看所有账号
docker exec mailserver setup email list

# 创建账号
docker exec mailserver setup email add <user@smail.icu> '<password>'

# 删除账号（保留邮箱数据）
docker exec mailserver setup email del <user@smail.icu>

# 修改密码
docker exec mailserver setup email update <user@smail.icu> '<new_password>'

# 添加别名（单收件人）
docker exec mailserver setup alias add <alias@smail.icu> <real@smail.icu>

# 添加多收件人别名
docker exec mailserver setup alias add <team@smail.icu> 'a@smail.icu,b@smail.icu'

# 列出别名
docker exec mailserver setup alias list

# DKIM 重新生成（如果换域名）
docker exec mailserver setup config dkim
```

⚠️ **已知 bug**：创建账号后 dovecot 偶尔报 "User doesn't exist"，**修复方法**：
```bash
docker exec mailserver supervisorctl restart dovecot
sleep 2
docker exec mailserver setup email list  # 验证
```

---

## 📤 发邮件（SMTP）

### Python 模板（已验证可用）

```python
import smtplib, ssl
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate, make_msgid

SMTP_HOST = 'mail.smail.icu'
SMTP_PORT = 587  # STARTTLS
FROM_ADDR = 'hermes@smail.icu'
PASSWORD = 'HermesMail2026!Sm4il'

msg = MIMEMultipart('alternative')
msg['From'] = f'Hermes Agent <{FROM_ADDR}>'
msg['To'] = 'recipient@example.com'
msg['Date'] = formatdate(localtime=True)
msg['Message-ID'] = make_msgid(domain='smail.icu')
msg['Subject'] = 'Hello'

msg.attach(MIMEText('纯文本版本', 'plain', 'utf-8'))
msg.attach(MIMEText('<h1>HTML 版本</h1>', 'html', 'utf-8'))

with smtplib.SMTP(SMTP_HOST, SMTP_PORT, timeout=30) as s:
    s.starttls(context=ssl.create_default_context())
    s.login(FROM_ADDR, PASSWORD)
    s.sendmail(FROM_ADDR, ['recipient@example.com'], msg.as_string())
```

### SwiftMailer / smtp-cli 等通用 SMTP 工具

```bash
# swaks (Swiss Army Knife for SMTP)
swaks --from hermes@smail.icu \
      --to recipient@example.com \
      --server mail.smail.icu:587 \
      --auth LOGIN \
      --auth-user hermes@smail.icu \
      --auth-password 'HermesMail2026!Sm4il' \
      --tls \
      --body "Hello" \
      --header "Subject: Test"
```

---

## 📥 收邮件（IMAP）

### Python 模板

```python
import imaplib, email

M = imaplib.IMAP4_SSL('mail.smail.icu', 993)
M.login('hermes@smail.icu', 'HermesMail2026!Sm4il')
M.select('INBOX')

# 列邮件 ID
typ, data = M.search(None, 'ALL')
ids = data[0].split()

# 读最新一封
latest = ids[-1]
typ, msg_data = M.fetch(latest, '(RFC822)')
msg = email.message_from_bytes(msg_data[0][1])
print(f'From: {msg["From"]}')
print(f'Subject: {msg["Subject"]}')
print(f'Date: {msg["Date"]}')

# 解码正文
for part in msg.walk():
    if part.get_content_type() == 'text/plain':
        body = part.get_payload(decode=True).decode('utf-8', errors='ignore')
        print(body)
        break

M.close()
M.logout()
```

### IMAP 命令清单

| 操作 | IMAP 命令 |
|---|---|
| 登录 | `LOGIN user@smail.icu <password>` |
| 选文件夹 | `SELECT INBOX` / `SELECT "Sent"` |
| 搜未读 | `SEARCH UNSEEN` |
| 读邮件 | `FETCH <id> (RFC822)` |
| 标记已读 | `STORE <id> +FLAGS \Seen` |
| 删除 | `STORE <id> +FLAGS \Deleted` + `EXPUNGE` |
| 列文件夹 | `LIST "" "*"` |

---

## 🔍 调试速查

```bash
# 看 postfix 队列（发件卡住时）
docker exec mailserver postqueue -p

# 看发件/收件日志
docker exec mailserver tail -50 /var/log/mail.log

# 看 DKIM 签名日志
docker exec mailserver grep opendkim /var/log/mail.log | tail -20

# 测试端口连通性
for port in 25 465 587 143 993; do
  (timeout 2 bash -c "</dev/tcp/mail.smail.icu/$port" 2>/dev/null && echo ":$port ✓") || echo ":$port ✗"
done

# 测试 IMAP 登录
( sleep 1; echo "a1 LOGIN hermes@smail.icu HermesMail2026!Sm4il"; sleep 1; echo "a2 LIST \"\" \"*\""; sleep 1; echo "a3 LOGOUT" ) | \
  timeout 6 openssl s_client -connect mail.smail.icu:993 -crlf -quiet 2>/dev/null | grep -E "^a[0-9]"
```

---

## 📊 容器状态（清理后）

```bash
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
```

**当前运行**：
- `mailserver` ← 邮件服务（唯一）
- `cli-proxy-api-plus` ← LLM 网关（端口 8317）

**已清理（不再存在）**：
- `mailu-admin-1` / `mailu-antispam-1` / `mailu-webmail-1`
- `mailu-smtp-1` / `mailu-imap-1` / `mailu-redis-1`
- `mailu-resolver-1` / `mailu-front-1`
- 容器配置文件：`/docker-compose.yml` + `/mailu/`（86MB，可手动删 `rm -rf /mailu`）

---

## ⚠️ 注意事项

1. **不要混用 Mailu 和 DMS**：服务器上**只保留 DMS**，Mailu 已全清
2. **DKIM 自动签名**：每次发件 postfix + opendkim 自动加签名头，无需手动
3. **密码必须加引号**：包含 `!` 等特殊字符时一定要 `'...'` 包裹，否则 bash 历史展开会爆
4. **创建账号后必查 list**：有时 dovecot userdb 没刷新，需要 `supervisorctl restart dovecot`
5. **新邮箱第一次发件容易被 163/Gmail 拦截**：让收件人先查垃圾邮件箱；连续几次后白名单生效
6. **回滚命令**：如果 mailserver 出问题，恢复数据卷 → `docker start mailserver`

---

## 🔁 给另一个 agent 的快速交接清单

复制这段给新 agent，对方就能 5 分钟上手：

```
我有自己的邮件服务：smail.icu
- 服务器：newyork-server (ssh 别名，snode.chat:22)
- 容器：mailserver（docker-mailserver）
- 我能用：hermes@smail.icu (密码 HermesMail2026!Sm4il)
- 管理账号：admin@smail.icu (密码 123456)
- 发件 SMTP：mail.smail.icu:587 STARTTLS
- 收件 IMAP：mail.smail.icu:993 SSL
- 创建账号：ssh newyork-server 然后 docker exec mailserver setup email add USER@smail.icu 'PASSWORD'
- DNS：SPF + DKIM + DMARC 三件套齐，Gmail/163 不会进垃圾箱
- 参考完整 skill：~/.hermes/skills/email/smail-mail/
```