From bda133a980f2345aad52f2eda1ac743209d4607b Mon Sep 17 00:00:00 2001 From: okxlin <61420215+okxlin@users.noreply.github.com> Date: Tue, 7 Nov 2023 14:45:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0maddy-mail=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8=20(#574)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/maddy-mail/0.7/data.yml | 56 +++++++++++ apps/maddy-mail/0.7/docker-compose.yml | 29 ++++++ apps/maddy-mail/README.md | 126 +++++++++++++++++++++++++ apps/maddy-mail/data.yml | 20 ++++ apps/maddy-mail/logo.png | Bin 0 -> 7045 bytes 5 files changed, 231 insertions(+) create mode 100644 apps/maddy-mail/0.7/data.yml create mode 100644 apps/maddy-mail/0.7/docker-compose.yml create mode 100644 apps/maddy-mail/README.md create mode 100644 apps/maddy-mail/data.yml create mode 100644 apps/maddy-mail/logo.png diff --git a/apps/maddy-mail/0.7/data.yml b/apps/maddy-mail/0.7/data.yml new file mode 100644 index 00000000..041ab794 --- /dev/null +++ b/apps/maddy-mail/0.7/data.yml @@ -0,0 +1,56 @@ +additionalProperties: + formFields: + - default: 25 + disabled: true + envKey: SMTP_IN_PORT + labelEn: SMTP inbound port + labelZh: SMTP 入站端口 + required: true + rule: paramPort + type: number + - default: 143 + disabled: true + envKey: IMAP4_PORT + labelEn: IMAP4 port + labelZh: IMAP4 端口 + required: true + rule: paramPort + type: number + - default: 993 + disabled: true + envKey: IMAP4_PORT2 + labelEn: IMAP4 port + labelZh: IMAP4 端口 + required: true + rule: paramPort + type: number + - default: 465 + disabled: true + envKey: SMTP_S_PORT + labelEn: SMTP Submission ports + labelZh: SMTP 提交端口 + required: true + rule: paramPort + type: number + - default: 587 + disabled: true + envKey: SMTP_S_PORT2 + labelEn: SMTP Submission ports + labelZh: SMTP 提交端口 + required: true + rule: paramPort + type: number + - default: mail.example.com + edit: true + envKey: MAIL_HOSTNAME + labelEn: Mail MX hostname + labelZh: 邮箱 MX 主机名 + required: true + type: text + - default: example.com + edit: true + envKey: MAIL_DOMAIN + labelEn: Mail domain + labelZh: 邮箱域名 + required: true + type: text diff --git a/apps/maddy-mail/0.7/docker-compose.yml b/apps/maddy-mail/0.7/docker-compose.yml new file mode 100644 index 00000000..a544c656 --- /dev/null +++ b/apps/maddy-mail/0.7/docker-compose.yml @@ -0,0 +1,29 @@ +version: '3' +services: + maddymail: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${SMTP_IN_PORT}:25" + - "${IMAP4_PORT}:143" + - "${SMTP_S_PORT}:465" + - "${SMTP_S_PORT2}:587" + - "${IMAP4_PORT2}:993" + volumes: + - maddydata:/data + environment: + - MADDY_HOSTNAME=${MAIL_HOSTNAME} + - MADDY_DOMAIN=${MAIL_DOMAIN} + image: foxcpp/maddy:0.7.0 + labels: + createdBy: "Apps" + +volumes: + maddydata: + external: true + +networks: + 1panel-network: + external: true diff --git a/apps/maddy-mail/README.md b/apps/maddy-mail/README.md new file mode 100644 index 00000000..ea3bd9e7 --- /dev/null +++ b/apps/maddy-mail/README.md @@ -0,0 +1,126 @@ +# 使用说明 + +## 1. 准备域名证书 +使用`acme.sh`、`certbot`、手动上传等方式准备好域名证书,注意需要按需修改。 + +证书对应域名为邮箱`MX`主机名如`mail.example.com `。 + +## 2. 创建Docker存储卷 +``` +docker volume create maddydata +``` + +## 3. 安装应用 + +应用商店安装应用, + +第一次安装会显示异常,容器无法正常运行,不必在意,因为缺少证书文件。 + +忽略错误,进行下一步操作。 + + +## 4. 域名证书存放到存储卷 + +存储卷默认路径如下 +`/var/lib/docker/volumes/maddydata/_data/` + +``` +# 进入存储卷路径 +cd $(docker volume inspect maddydata --format '{{.Mountpoint}}') + +# 创建证书文件夹 +mkdir -p tls +``` +上传证书和私钥到`tls`文件夹,并重命名为 +- fullchain.pem +- privkey.pem + +按要求上传完成证书文件后,容器会自动正常运行。 + +## 5. 设置DKIM DNS解析 +### 5.1 获取DKIM值 + +当容器正常运行后 + +在`/var/lib/docker/volumes/maddydata/_data/dkim_keys`路径下 + +会有个类似`example.com_default.dns`的文件 + +其中则是需要获取的相关信息。 + +- 注意按需修改域名 + +终端查看 +``` +cat /var/lib/docker/volumes/maddydata/_data/dkim_keys/example.com_default.dns +``` + +会得到类似以下内容 +``` +default._domainkey.example.org. TXT "v=DKIM1; k=ed25519; p=nAcUUozPlhc4VPhp7hZl+owES7j7OlEv0laaDEDBAqg=" +``` + +### 5.2 设置DNS TXT记录 + +根据获取的信息设置`DNS解析` + +例子如下: +为 `default._domainkey.example.com` 添加`TXT`记录,值设置为`v=DKIM1; k=ed25519; p=nAcUUozPlhc4VPhp7hZl+owES7j7OlEv0laaDEDBAqg=`。 + +## 6. 设置DNS解析 + +- 注意按需修改 + +| 记录类型 | 域名 | 值 | +| --- | --- | --- | +| A | `mail.example.com` | `服务器ipv4地址` | +| A | `example.com` | `服务器ipv4地址` | +| AAAA | `mail.example.com` | `服务器ipv6地址(如果有)` | +| AAAA | `example.com` | `服务器ipv6地址(如果有)` | +| MX | `example.com` | `mail.example.com` | +| TXT | `mail.example.com` | `v=spf1 mx ~all` | +| TXT | `example.com` | `v=spf1 mx ~all` | +| TXT | `_dmarc.example.com` | `v=DMARC1; p=quarantine; ruf=mailto:postmaster@example.com` | +| TXT | `_mta-sts.example.com` | `v=STSv1; id=1` | +| TXT | `_smtp._tls.example.com` | `v=TLSRPTv1;rua=mailto:postmaster@example.com` | + +## 7. 创建发送账户 + +面板`容器`界面,连接容器终端,执行以下命令 + +- 注意按需修改 + +``` +maddy creds create postmaster@example.com + +maddy imap-acct create postmaster@example.com +``` +结束 + +# 原始相关 + +Maddy Mail Server +===================== +> Composable all-in-one mail server. + +Maddy Mail Server implements all functionality required to run a e-mail +server. It can send messages via SMTP (works as MTA), accept messages via SMTP +(works as MX) and store messages while providing access to them via IMAP. +In addition to that it implements auxiliary protocols that are mandatory +to keep email reasonably secure (DKIM, SPF, DMARC, DANE, MTA-STS). + +It replaces Postfix, Dovecot, OpenDKIM, OpenSPF, OpenDMARC and more with one +daemon with uniform configuration and minimal maintenance cost. + +**Note:** IMAP storage is "beta". If you are looking for stable and +feature-packed implementation you may want to use Dovecot instead. maddy still +can handle message delivery business. + +[![CI status](https://img.shields.io/github/workflow/status/foxcpp/maddy/Testing%20and%20release%20preparation?style=flat-square)](https://github.com/foxcpp/maddy/actions/workflows/cicd.yml) +[![Issues tracker](https://img.shields.io/github/issues/foxcpp/maddy)](https://github.com/foxcpp/maddy) + +* [Setup tutorial](https://maddy.email/tutorials/setting-up/) +* [Documentation](https://maddy.email/) + +* [IRC channel](https://webchat.oftc.net/?channels=maddy&uio=MT11bmRlZmluZWQb1) +* [Mailing list](https://lists.sr.ht/~foxcpp/maddy) diff --git a/apps/maddy-mail/data.yml b/apps/maddy-mail/data.yml new file mode 100644 index 00000000..4749c12e --- /dev/null +++ b/apps/maddy-mail/data.yml @@ -0,0 +1,20 @@ +name: Maddy Mail Server +tags: + - 邮件服务 +title: 可组合的多合一邮件服务器 +type: 邮件服务 +description: 可组合的多合一邮件服务器 +additionalProperties: + key: maddy-mail + name: Maddy Mail Server + tags: + - Email + shortDescZh: 可组合的多合一邮件服务器 + shortDescEn: Composable all-in-one mail server + type: tool + crossVersionUpdate: true + limit: 1 + recommend: 0 + website: https://maddy.email + github: https://github.com/foxcpp/maddy + document: https://maddy.email diff --git a/apps/maddy-mail/logo.png b/apps/maddy-mail/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1e1313c0a1730bc3a3a60879da88ea085ea9d65d GIT binary patch literal 7045 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 literal 0 KcmV+b0RR6000031