本文原载于作者[链接登录后可见],因内容优秀特此分享。若有不妥之处,烦请联系管理员处理,感谢原作者的精彩创作
自建邮件系统教程:前言 + 准备工作
前言
首先发一段劝退说辞:
我相信点进本文的人,自建邮局的目的更多是为了使用自己的域名邮箱,实现邮件的收发?
如果你仅需 接收邮件,强烈推荐使用:
如果你希望收发邮件,建议优先考虑以下托管企业邮箱服务:
这些服务通常都提供免费额度,送达率高、配置简单,有详细文档,足够个人或小团队使用。
自建邮局的缺点:
- 配置复杂,技术门槛较高
- 维护成本高,需定期更新服务器环境
- 邮件送达率不稳定,容易被当作垃圾邮件
- 大部分邮件服务商(如 Gmail)对自建服务器有严格过滤
但如果你出于学习目的、提升技能,仍然决定自己搭建邮箱系统——那就继续往下看吧!
致谢
- 本教程测试服务器由 [链接登录后可见] 提供支持
- 使用 [链接登录后可见] 运维管理面板,方便部署与管理
- 优惠推荐:1Panel 专业版订阅现有 八折优惠
准备工作
你需要:
- 一台已部署 1Panel 的服务器
- 一个自己的域名(示例使用:
anye.email
)
- 基础的 Linux 操作能力(基本语文素养)
第一步:通过 1Panel 申请 TLS 证书
参考教程:👉 [链接登录后可见]获取 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
,设定为 manua
l ,同时修改 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 |
记录值 | 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)
。
参考
[链接登录后可见]
测试
在邮箱客户端中输入服务器信息进行连接
[链接登录后可见]
发送测试邮件
[链接登录后可见]