前言
首先发一段劝退说辞:我相信点进本文的人自建邮局的目的更多地是为了能用自己的域名邮箱,收发邮件?
-
仅收不发,推荐使用 https://www.cloudflare.com/zh-cn/developer-platform/products/email-routing/
-
收发邮件,建议使用托管邮局,https://www.ali-exmail.cn/free/https://exmail.qq.com/qy_mng_logic/registerhttps://ym.163.com/https://www.feishu.cn/product/email等等,均有一定免费的邮箱额度,送达率高且有详细文档,足够个人使用。
自建邮局有以下缺陷:
-
配置复杂,技术门槛高。
-
维护成本高,需要定期更新和维护服务器。
-
邮件送达率不稳定,配置不当容易进入垃圾邮件箱。
-
…
好吧,如果你出于学习目的,仍然想要尝试自建邮局,那么就开始吧!
致谢
-
新一代 Linux 服务器运维管理面板 1Panel 专业版按年订阅八折优惠:https://www.lxware.cn/1panel?code=Anyexyz
-
本测试服务器由 https://ono.ee 提供。
准备工作
-
已部署 1Panel 的服务器一台。https://1panel.cn/docs/installation/online_installation/
-
域名一个,本文示例域名:
anye.email
-
基本语文素养
部署
通过 1Panel 申请 TLS 证书
本步非必须,若您已拥有有效的 TLS 证书,可跳过此步骤。
参照此教程https://1panel.cn/docs/user_manual/websites/certificate_create/获取 TLS 证书,如此处我将搭建的邮局所使用的域名为 anye.email
,则申请该域名证书,同时需要注意,勾选 推送证书到本地目录按钮
,填写一个易于使用的路径,如此处 /ssl/anye.email
安装 Mailserver
在 应用商店
中找到 邮件服务
分类,找到 Mailserver
点击 安装
:
填写域名,端口等信息,勾选端口外部访问
注意:默认不需要修改端口信息,奈何部分云厂商被恶意用户滥用端口,导致部分端口被封禁,所以建议在安装前确认端口可用性,若不可用,请更换其他端口。
勾选 编辑 compose 文件
,在 volumes
中添加最开始申请 TLS 证书的路径映射,点击 确认
开始安装。
services:
mailserver:
image: ghcr.io/docker-mailserver/docker-mailserver:14.0.0
container_name: ${CONTAINER_NAME}
hostname: ${MS_HOSTNAME}
env_file: ./conf/mailserver.env
ports:
- "${PANEL_APP_PORT_SMTP}:25"
- "${PANEL_APP_PORT_IMAP4_143}:143"
- "${PANEL_APP_PORT_ESMTP_465}:465"
- "${PANEL_APP_PORT_ESMTP_587}:587"
- "${PANEL_APP_PORT_IMAP4_993}:993"
volumes:
- ./data/dms/mail-data/:/var/mail/
- ./data/dms/mail-state/:/var/mail-state/
- ./data/dms/mail-logs/:/var/log/mail/
- ./data/dms/config/:/tmp/docker-mailserver/
- /etc/localtime:/etc/localtime:ro
- /ssl/anye.email/:/ssl/anye.email/:ro # 这里这里,示例内容
restart: always
networks:
- 1panel-network
stop_grace_period: 1m
labels:
createdBy: "Apps"
healthcheck:
test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"
timeout: 3s
retries: 0
networks:
1panel-network:
external: true
配置 TLS
进入 Mailserver 安装目录,进入 conf
目录,找到 mailserver.env
搜索找到 SSL_TYPE
,设定为 manual
,同时修改 SSL_CERT_PATH
和 SSL_KEY_PATH
为映射的 TLS 证书路径:
SSL_TYPE=manual
# These are only supported with `SSL_TYPE=manual`.
# Provide the path to your cert and key files that you've mounted access to within the container.
# 路径仅供参考
SSL_CERT_PATH=/ssl/anye.email/fullchain.pem
SSL_KEY_PATH=/ssl/anye.email/privkey.pem
创建首个账户
点击侧边栏 容器
,找到 Mailserver 容器进入 终端
输入命令创建账户
// 创建邮箱账户: setup email add <NEW ADDRESS>
// 示例:
setup email add admin@anye.email
生成 DKIM
继续输入命令生成 DKIM
setup config dkim
生成的 DKIM 在容器内 /tmp/docker-mailserver/opendkim/keys/
目录下,即主机 /opt/1panel/apps/mailserver/mailserver/data/dms/config/opendkim/keys/
,找到其中的 mail.txt
,下载,导入到 DNS 解析中,示例:
DNS 解析
DKIM 记录
域名密钥识别邮件 (DKIM) 是一种身份验证协议,通过对电子邮件中的某些字段进行加密签名来验证邮件的真实性。它允许接收方验证发送方是否有权使用该域名,并确保邮件未被篡改。
mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzJawbBm2L76jTMES9GQyNdmxF/caall4YmalGUkmc00duE47ri0awAVieTgHPQ7GVBSZOO8FNY8TC6XntJij915B2O7dVqTKsZDLl27RN3YFNpu+2Y+XKb6yvpA0ZjlySt+LwIjfKRfz6EY/icuakuOt7s6b1KUodVkgX6ZWn8CyHcy7Msca//BeIsGhxxrYVTcSalOiOYN54i"
"wPiRt/RbjIbbEmB4Enzqk+i2KeBJoNhwDdqhbLMyZXE0W0lX8Ztt5kQO8hJrc1eeH528V59Lp7YOprF5LMFhzoyTdxcg0sDWVItvWcxtIq0Sh6uAq8hubK6QS4x/LIMdWJvNZBWwIDAQAB" ) ; ----- DKIM key mail for anye.email
手动添加 DNS 记录时注意:
字段
值
记录类型
TXT
主机记录
mail._domainkey
记录值
合并上述 txt 文件内的记录值,把文件中的内容去掉双引号和换行,将其合并成一行。例如,示例记录内容会变成:
v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BA...写不下了不写了反正就是那些内容...8hubK6QS4x/LIMdWJvNZBWwIDAQAB
-
default._domainkey
DKIM选择器,标识此记录对应的密钥。通常管理员可自定义选择器名称。 -
v=DKIM1
DKIM协议的版本号,目前唯一有效值为DKIM1
。 -
k=rsa
指定密钥的加密算法,目前主要使用 RSA 。 -
p=MIGfMA0...
公钥内容,用于验证邮件的 DKIM 签名。
SPF 记录
发送方策略框架 (SPF) 记录是一种 DNS TXT 记录,其中列出所有获得授权从特定域发送电子邮件的服务器。DNS TXT(“文本”)记录允许域管理员将任意文本输入到域名系统(DNS) 中。TXT 记录最初是为包含有关域的重要信息而创建的,但后来已经发展为服务其他目的。
# 示例
v=spf1 mx ~all
-
v=spf1
表示这是 SPF记录的版本号,目前只有一个版本 -
mx
表示授权由域名对应的MX记录中列出的IP地址发送邮件 -
SoftFail和HardFail是两种策略,用于指定未经授权的发件人邮件如何处理
-
~all
宽容策略。如果发件人的IP地址不在SPF记录中指定的允许列表中,那么收件方的邮件服务器不会拒绝该邮件,而是将该邮件标记为“软失败”,并将其放入接收方的垃圾邮件文件夹或者标记为垃圾邮件。 -
-all
严格策略。如果发件人的IP地址不在SPF记录中指定的允许列表中,那么收件方的邮件服务器会拒绝该邮件,并将其退回给发件人或者直接删除
-
DMARC 记录
基于域的消息身份验证、报告和一致性 (DMARC) 是一种验证电子邮件的方法。DMARC 政策在检查一个域的发送方策略框架 (SPF) 和 域名密钥识别邮件 (DKIM) 记录(这些都是额外的电子邮件身份验证方法)后,告诉接收电子邮件的服务器该怎么做。
# 示例
v=DMARC1; p=none; sp=none;
-
v=DMARC1
表示这是DMARC记录的版本号,目前唯一的有效值是DMARC1
。 -
p=none
该字段定义了当接收服务器检测到邮件未通过身份验证时应采取的策略:-
none
:无操作。接收服务器不会拒绝或隔离未通过验证的邮件,只记录该行为以供报告。 -
quarantine
:将未通过验证的邮件标记为垃圾邮件并隔离。 -
reject
:拒绝未通过验证的邮件。
-
-
sp=none
针对子域的策略,和p
字段功能类似。如果省略该字段,子域将遵循p
字段指定的策略。 -
rua=mailto:example@domain.com
定义接收DMARC聚合报告的电子邮件地址。报告包含有关验证结果的统计信息,帮助域管理员了解哪些邮件未通过验证。 -
ruf=mailto:example@domain.com
定义接收DMARC失败报告的电子邮件地址。失败报告通常包含有关验证失败的详细信息,用于深入分析问题。 -
pct=100
指定该DMARC策略应用于多少百分比的邮件。默认值是100
,表示策略适用于所有邮件。如果设置为50
,则只有50%的邮件会被应用DMARC策略。 -
aspf=r
定义SPF对齐的严格程度:-
r
:宽松对齐,允许子域发送的邮件。 -
s
:严格对齐,发送的邮件必须完全匹配SPF记录中的域。
-
-
adkim=r
定义DKIM对齐的严格程度:-
r
:宽松对齐,允许子域签名。 -
s
:严格对齐,邮件的DKIM签名必须完全匹配域名。
-
A 记录
-
名称(主机名):
mail
-
类型:
A
-
值:
154.26.209.188(示例)
这个A记录将域名 mail.anye.email
解析到IPv4地址154.26.209.188(示例)
。当用户访问 mail.anye.email
时,DNS 会指向这个IP地址。
MX记录
-
名称(主机名):
@
(代表根域名anye.email
) -
类型:
MX
-
值:
mail.anye.email
这个MX记录表示域名 anye.email
的邮件服务器是mail.anye.email
,并将邮件服务交由该域名处理。
为了保证正常解析,mail.anye.email
需要一个对应的A记录(正好在配置中有对应的A记录:mail -> 154.26.209.188
)。
参考
测试
在邮箱客户端中输入服务器信息进行连接
发送测试邮件
参考文章
[1] https://www.cloudflare.com/zh-cn/developer-platform/products/email-routing/
[2] https://www.cloudflare.com/zh-cn/learning/dns/dns-records/dns-dkim-record/
[3] https://www.cloudflare.com/zh-cn/learning/dns/dns-records/dns-spf-record/
[4] https://www.cloudflare.com/zh-cn/learning/dns/dns-records/dns-dmarc-record/
[5] https://www.mail-tester.com/faq?lang=zh
[6] https://docker-mailserver.github.io/docker-mailserver/v14.0/config/environment/