feat(mail): 增加签名管理与客户端配置

- 新增邮件签名的数据表、接口和前端管理页,支持全局/邮箱默认签名的创建、编辑、删除与查询。
- 写信时自动带入当前邮箱的默认签名,并优化手动输入内容时的覆盖行为。
- 补充第三方邮件客户端配置页,展示 IMAP/POP3/SMTP 连接信息及公共主机名。
- 扩展部署配置,开放 POP3S/SMTPS 端口并启用 Dovecot POP3 服务。
This commit is contained in:
LanQin
2026-06-16 23:15:35 +08:00
parent 9a0e039767
commit 045132146b
18 changed files with 628 additions and 22 deletions
+2 -1
View File
@@ -123,9 +123,10 @@ docker compose -f docker-compose.stack.yml -f docker-compose.stack.build.yml up
- Postfix 读取 `/data/lanqin.db` 中的 `domains``mailboxes``aliases`
- Dovecot 读取同一个 SQLite 数据库进行邮箱认证,并使用 `/var/mail/vhosts` 作为 Maildir 根目录。
- 第三方客户端可使用 IMAP SSL `993`、POP3 SSL `995`、SMTP SSL `465` 或 Submission `587`
- Rspamd 通过 milter 接入 Postfix,负责 DKIM 签名和垃圾邮件标记。
- Rspamd 会周期性从 SQLite 导出域名 DKIM 私钥到容器内 `/var/lib/rspamd/dkim`
- Go API 是 Webmail 和管理后台唯一入口;浏览器不直接连接 SMTP/IMAP。
- Go API 是 Webmail 和管理后台入口;浏览器不直接连接 SMTP/IMAP/POP3
- Go API 会读取 `LANQIN_MAILDIR_ROOT=/var/mail/vhosts`,周期扫描 Maildir,把 Postfix/Dovecot 入站邮件同步成 Webmail 索引。
## SMTP 发信排查
+2 -2
View File
@@ -26,7 +26,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
apt-get update && apt-get install -y --no-install-recommends \
ca-certificates tzdata sqlite3 supervisor nginx \
postfix postfix-sqlite \
dovecot-core dovecot-imapd dovecot-lmtpd dovecot-sqlite ssl-cert \
dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-sqlite ssl-cert \
rspamd
COPY --from=api-build /out/lanqin-api /usr/local/bin/lanqin-api
@@ -46,5 +46,5 @@ COPY deploy/rspamd/sync-dkim.sh /usr/local/bin/lanqin-rspamd-sync-dkim
RUN chmod +x /entrypoint.sh /usr/local/bin/lanqin-rspamd-sync-dkim && mkdir -p /run/nginx /run/rspamd /var/mail/vhosts /data /var/lib/rspamd/dkim
EXPOSE 80 443 25 587 993
EXPOSE 80 443 25 465 587 993 995
CMD ["/entrypoint.sh"]
+2
View File
@@ -34,6 +34,7 @@ services:
- ./mail:/var/mail/vhosts
ports:
- "25:25"
- "465:465"
- "587:587"
depends_on:
- dovecot
@@ -48,6 +49,7 @@ services:
- ./mail:/var/mail/vhosts
ports:
- "993:993"
- "995:995"
restart: unless-stopped
rspamd:
+2
View File
@@ -6,8 +6,10 @@ services:
- "80:80"
- "443:443"
- "25:25"
- "465:465"
- "587:587"
- "993:993"
- "995:995"
volumes:
- ./data:/data
- ./mail:/var/mail/vhosts
+2 -2
View File
@@ -5,11 +5,11 @@ ENV DEBIAN_FRONTEND=noninteractive
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
rm -f /etc/apt/apt.conf.d/docker-clean && \
apt-get update && apt-get install -y --no-install-recommends dovecot-core dovecot-imapd dovecot-lmtpd dovecot-sqlite ssl-cert ca-certificates
apt-get update && apt-get install -y --no-install-recommends dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-sqlite ssl-cert ca-certificates
COPY dovecot.conf /etc/dovecot/dovecot.conf
COPY dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 993 24 12345
EXPOSE 993 995 24 12345
CMD ["/entrypoint.sh"]
+8 -1
View File
@@ -1,4 +1,4 @@
protocols = imap lmtp
protocols = imap pop3 lmtp
listen = *
base_dir = /var/run/dovecot/
@@ -45,6 +45,13 @@ service imap-login {
}
}
service pop3-login {
inet_listener pop3s {
port = 995
ssl = yes
}
}
service lmtp {
inet_listener lmtp {
address = 0.0.0.0
+1 -1
View File
@@ -11,5 +11,5 @@ COPY master.cf /etc/postfix/master.cf
COPY sqlite-*.cf /etc/postfix/
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 25 587
EXPOSE 25 465 587
CMD ["/entrypoint.sh"]
+5
View File
@@ -4,6 +4,11 @@ submission inet n - n - - smtpd
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
smtps inet n - n - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
pickup unix n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr unix n - n 300 1 qmgr