1Panel 自建邮局 - Docker Mailserver

本文首发于 Anyeの小站点击链接 访问体验更佳

前言

首先发一段劝退说辞:我相信点进本文的人自建邮局的目的更多地是为了能用自己的域名邮箱,收发邮件?

自建邮局有以下缺陷:

  1. 配置复杂,技术门槛高。

  2. 维护成本高,需要定期更新和维护服务器。

  3. 邮件送达率不稳定,配置不当容易进入垃圾邮件箱。

好吧,如果你出于学习目的,仍然想要尝试自建邮局,那么就开始吧!

致谢

准备工作

部署

通过 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_PATHSSL_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/

[6] http://www.open-spf.org/SPF_Record_Syntax/