第05章 邮件服务器配置详解

第05章 邮件服务器配置详解

5.1 邮件传输协议深入理解

要成功运营邮件服务器,深入理解邮件传输协议至关重要。本节将详细介绍 SMTP、IMAP、POP3 等核心协议及其在 BillionMail 中的实现。

5.1.1 SMTP 协议详解

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是互联网上发送邮件的标准协议。它定义了邮件客户端和邮件服务器之间、以及邮件服务器之间如何传输邮件。

SMTP 工作流程

SMTP 通信遵循客户端-服务器模型,基本流程包括:

  1. 建立连接:客户端连接到服务器的 SMTP 端口(通常是 25、465 或 587)
  2. 握手:服务器发送欢迎消息,客户端发送 EHLO 或 HELO 命令
  3. 认证(如果需要):客户端提供用户名和密码
  4. 传输邮件:客户端使用 MAIL FROM、RCPT TO、DATA 命令发送邮件
  5. 关闭连接:发送完成后使用 QUIT 命令关闭连接

SMTP 命令详解

HELO/EHLO:客户端向服务器问候并标识自己

EHLO mail.client.com

EHLO(Extended HELO)支持扩展功能,服务器会响应支持的扩展列表。

MAIL FROM:指定发件人地址

MAIL FROM:<sender@example.com>

RCPT TO:指定收件人地址

RCPT TO:<recipient@example.com>

可以有多个 RCPT TO 命令,发送给多个收件人。

DATA:开始传输邮件内容

DATA
Subject: Test Email
From: sender@example.com
To: recipient@example.com

This is the email body.
.

邮件内容以单独一行的句点(.)结束。

QUIT:关闭连接

QUIT

AUTH:认证

AUTH LOGIN

然后提供 Base64 编码的用户名和密码。

STARTTLS:升级到加密连接

STARTTLS

SMTP 端口说明

  • 25 端口:标准 SMTP 端口,用于服务器之间的邮件传输。许多 ISP 封锁此端口以防止垃圾邮件。
  • 465 端口:SMTPS(SSL 上的 SMTP),从连接开始就使用 SSL/TLS 加密。
  • 587 端口:邮件提交端口,邮件客户端应使用此端口提交邮件。支持 STARTTLS 升级到加密连接。

BillionMail 配置:

  • 25 端口:用于接收来自其他邮件服务器的邮件
  • 587 端口:用于邮件客户端提交邮件(需要认证)
  • 465 端口:可选,用于旧版邮件客户端

SMTP 响应代码

SMTP 服务器使用三位数字代码响应客户端命令:

  • 2xx:成功

    • 220:服务就绪
    • 221:服务关闭传输通道
    • 250:请求的邮件操作完成
    • 251:用户非本地,将转发
  • 3xx:等待继续

    • 354:开始邮件输入
  • 4xx:临时失败

    • 421:服务不可用
    • 450:邮箱不可用
    • 451:本地错误,处理中止
    • 452:存储空间不足
  • 5xx:永久失败

    • 500:语法错误,命令不可识别
    • 501:参数语法错误
    • 502:命令未实现
    • 503:错误的命令序列
    • 550:邮箱不可用(如不存在)
    • 551:用户非本地
    • 552:存储分配超出
    • 553:邮箱名不允许
    • 554:交易失败

5.1.2 IMAP 协议详解

IMAP(Internet Message Access Protocol,互联网消息访问协议)是一种邮件访问协议,允许客户端访问和管理存储在邮件服务器上的邮件。

IMAP 的优势

相比 POP3,IMAP 有以下优势:

  • 服务器端存储:邮件保存在服务器上,可以从多个设备访问
  • 文件夹同步:支持多层文件夹结构,在各设备间同步
  • 部分获取:可以只下载邮件头或邮件的一部分,节省带宽
  • 搜索功能:支持服务器端搜索
  • 离线模式:支持离线访问已缓存的邮件

IMAP 基本操作

连接和认证

* OK IMAP4rev1 Service Ready
C: A001 LOGIN username password
S: A001 OK LOGIN completed

列出文件夹

C: A002 LIST "" "*"
S: * LIST (\HasNoChildren) "." INBOX
S: * LIST (\HasNoChildren) "." Sent
S: * LIST (\HasNoChildren) "." Drafts
S: A002 OK LIST completed

选择文件夹

C: A003 SELECT INBOX
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
S: * 172 EXISTS
S: * 1 RECENT
S: * OK [UNSEEN 12] Message 12 is first unseen
S: A003 OK [READ-WRITE] SELECT completed

获取邮件

C: A004 FETCH 1 BODY[]
S: * 1 FETCH (BODY[] {2555}
S: ...邮件内容...
S: )
S: A004 OK FETCH completed

IMAP 端口

  • 143 端口:标准 IMAP 端口(明文或 STARTTLS)
  • 993 端口:IMAPS(SSL/TLS 加密的 IMAP)

BillionMail 默认启用 993 端口,建议邮件客户端使用加密连接。

5.1.3 POP3 协议详解

POP3(Post Office Protocol version 3,邮局协议第3版)是另一种邮件访问协议,比 IMAP 更简单但功能较少。

POP3 工作流程

  1. 连接到服务器的 POP3 端口(110 或 995)
  2. 认证(用户名和密码)
  3. 列出并下载邮件
  4. 可选:删除服务器上的邮件
  5. 关闭连接

POP3 基本命令

# 连接
+OK POP3 server ready

# 认证
USER username
+OK
PASS password
+OK Logged in

# 列出邮件
LIST
+OK 2 messages
1 1234
2 5678
.

# 获取邮件
RETR 1
+OK 1234 octets
...邮件内容...
.

# 删除邮件
DELE 1
+OK Marked for deletion

# 退出
QUIT
+OK Logging out

POP3 端口

  • 110 端口:标准 POP3 端口
  • 995 端口:POP3S(SSL/TLS 加密的 POP3)

POP3 vs IMAP

特性 POP3 IMAP
服务器存储 下载后通常删除 保留在服务器上
多设备同步 不支持 支持
文件夹管理 不支持 支持
部分获取 不支持 支持
服务器搜索 不支持 支持
带宽使用 需下载全部邮件 可只下载需要的部分
适用场景 单设备,不需要同步 多设备,需要同步

现代应用通常推荐使用 IMAP。BillionMail 同时支持两种协议,用户可以根据需要选择。

5.2 DNS 记录优化

正确配置 DNS 记录是确保邮件成功送达的关键。本节将详细介绍各种 DNS 记录的最佳实践。

5.2.1 MX 记录优化

MX(Mail eXchange)记录指定接收邮件的服务器。

单服务器配置

如果只有一台邮件服务器:

example.com.    IN MX   10 mail.example.com.
mail.example.com. IN A  203.0.113.10

优先级数字越小,优先级越高。单服务器通常使用 10。

多服务器配置(高可用)

如果有多台邮件服务器,可以配置备份 MX:

example.com.    IN MX   10 mail1.example.com.
example.com.    IN MX   20 mail2.example.com.
example.com.    IN MX   30 mail3.example.com.

mail1.example.com. IN A  203.0.113.10
mail2.example.com. IN A  203.0.113.11
mail3.example.com. IN A  203.0.113.12

发件服务器会首先尝试优先级最高的(数字最小的)服务器,如果失败则尝试下一个。

MX 记录最佳实践

  1. 不要使用 CNAME:MX 记录不能指向 CNAME,必须指向 A 记录或 AAAA 记录。

错误示例:

example.com.    IN MX   10 mail.example.com.
mail.example.com. IN CNAME server1.hosting.com.

正确示例:

example.com.    IN MX   10 mail.example.com.
mail.example.com. IN A  203.0.113.10
  1. 使用完全限定域名(FQDN):MX 记录的值应该是完全限定域名,以点结尾。

  2. 设置合理的 TTL:MX 记录的 TTL 可以设置为 3600(1小时)或更长,因为邮件服务器地址不常变化。

  3. 避免使用邮件服务器域名作为网站:不要让 mail.example.com 同时作为网站服务器,这可能会影响邮件送达率。

5.2.2 SPF 记录深入配置

SPF(Sender Policy Framework)记录指定哪些服务器被授权发送邮件。

SPF 语法

SPF 记录是一个 TXT 记录,基本格式:

v=spf1 [mechanisms] [qualifiers] [modifiers]

机制(Mechanisms)

  • ip4:指定 IPv4 地址或地址段

    v=spf1 ip4:203.0.113.10 ~all
    v=spf1 ip4:203.0.113.0/24 ~all
    
  • ip6:指定 IPv6 地址或地址段

    v=spf1 ip6:2001:db8::1 ~all
    
  • a:使用域名的 A 记录

    v=spf1 a ~all
    v=spf1 a:mail.example.com ~all
    
  • mx:使用域名的 MX 记录

    v=spf1 mx ~all
    v=spf1 mx:example.com ~all
    
  • include:包含其他域名的 SPF 记录

    v=spf1 include:_spf.google.com ~all
    

    用于使用第三方邮件服务时。

  • all:匹配所有地址(通常放在最后作为默认规则)

限定符(Qualifiers)

  • +:通过(Pass),默认限定符
  • -:失败(Fail),硬失败,邮件应该被拒绝
  • ~:软失败(SoftFail),邮件应该被标记但不拒绝
  • ?:中性(Neutral),既不通过也不失败

常见 SPF 配置

简单配置(只允许 MX 记录中的服务器):

v=spf1 mx ~all

指定 IP 地址

v=spf1 ip4:203.0.113.10 ~all

组合配置(自己的服务器 + Google Workspace):

v=spf1 ip4:203.0.113.10 include:_spf.google.com ~all

复杂配置(多个邮件源):

v=spf1 ip4:203.0.113.0/24 ip4:198.51.100.10 include:_spf.google.com include:spf.protection.outlook.com ~all

SPF 记录限制

  • SPF 记录不能超过 255 字符(DNS TXT 记录限制)
  • include 机制的查询次数不能超过 10 次
  • void lookup(无效查询)不能超过 2 次

如果超过限制,需要优化记录或使用 SPF flattening 技术。

测试 SPF 记录

# 查询 SPF 记录
dig example.com TXT | grep spf

# 或使用在线工具
# https://www.kitterman.com/spf/validate.html

5.2.3 DKIM 签名配置

DKIM(DomainKeys Identified Mail)为邮件提供加密签名,证明邮件确实来自声称的域名。

DKIM 工作原理

  1. 发送服务器使用私钥对邮件的某些部分(头部和正文)生成签名
  2. 签名添加到邮件头的 DKIM-Signature 字段
  3. 接收服务器从 DNS 获取公钥
  4. 使用公钥验证签名
  5. 验证成功则说明邮件未被篡改且确实来自声称的域名

DKIM 密钥生成

BillionMail 自动生成 DKIM 密钥对,但也可以手动生成:

# 生成 2048 位 RSA 密钥对
openssl genrsa -out dkim_private.pem 2048

# 提取公钥
openssl rsa -in dkim_private.pem -pubout -out dkim_public.pem

# 转换公钥为 DNS 记录格式
# 移除头尾和换行,组合成一行
cat dkim_public.pem | grep -v "PUBLIC KEY" | tr -d '\n'

DKIM DNS 记录格式

selector._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC..."

字段说明:

  • selector:选择器,用于支持多个 DKIM 密钥,常用 "default" 或日期(如 "202401")
  • v=DKIM1:DKIM 版本
  • k=rsa:密钥类型(RSA)
  • p=:Base64 编码的公钥

DKIM 选择器策略

单一选择器

default._domainkey.example.com.

适合简单场景,一个域名一个密钥。

基于时间的选择器

202401._domainkey.example.com.
202402._domainkey.example.com.

定期轮换密钥,提高安全性。

基于用途的选择器

marketing._domainkey.example.com.
transactional._domainkey.example.com.

不同类型的邮件使用不同的密钥,便于管理和追踪。

DKIM 签名头示例

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
    d=example.com; s=default;
    h=from:to:subject:date;
    bh=2jmj7l5rSw0yVb/vlWAYkK/YBwk=;
    b=dzdVyOfAKCdLXdJOc9G2q8LoXSlEniSbav+yuU4zGeeruD00lszZVoG4ZHRNiYzR

字段说明:

  • v:版本
  • a:签名算法(rsa-sha256)
  • c:规范化算法
  • d:签名域
  • s:选择器
  • h:签名的邮件头字段
  • bh:邮件正文哈希
  • b:签名值

DKIM 最佳实践

  1. 使用 2048 位或更长的密钥:1024 位密钥已被认为不够安全。

  2. 签名重要的邮件头:至少应该签名 From、To、Subject、Date 头。

  3. 定期轮换密钥:建议每年至少轮换一次 DKIM 密钥。

  4. 保护私钥安全:私钥应该妥善保管,设置严格的文件权限。

  5. 测试 DKIM 配置

# 使用 dig 查询 DKIM 记录
dig default._domainkey.example.com TXT

# 发送测试邮件到检查服务
# check-auth@verifier.port25.com
# 查看返回的认证报告

5.2.4 DMARC 策略配置

DMARC(Domain-based Message Authentication, Reporting and Conformance)建立在 SPF 和 DKIM 之上,提供额外的验证和报告机制。

DMARC 工作原理

  1. 接收服务器检查邮件的 SPF 和 DKIM
  2. 验证 From 头中的域名与 SPF/DKIM 验证的域名是否对齐
  3. 根据 DMARC 策略决定如何处理未通过验证的邮件
  4. 生成报告发送给域名所有者

DMARC 记录格式

_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com; ruf=mailto:dmarc-forensic@example.com; fo=1; adkim=r; aspf=r; pct=100"

DMARC 标签详解

必需标签

  • v:版本,必须是 "DMARC1"
  • p:策略,应用于域名本身
    • none:仅监控,不采取行动(适合初期部署)
    • quarantine:将可疑邮件放入垃圾邮件文件夹
    • reject:直接拒绝可疑邮件

可选标签

  • sp:子域名策略,可以与主域名策略不同

    p=reject; sp=quarantine
    
  • rua:聚合报告接收地址(每天一次的汇总报告)

    rua=mailto:dmarc-reports@example.com
    
  • ruf:取证报告接收地址(单个失败的详细报告)

    ruf=mailto:dmarc-forensic@example.com
    
  • fo:取证报告选项

    • 0:默认,SPF 和 DKIM 都失败时生成报告
    • 1:SPF 或 DKIM 失败时生成报告
    • d:DKIM 失败时生成报告
    • s:SPF 失败时生成报告
  • adkim:DKIM 对齐模式

    • r:宽松模式(relaxed),子域名也算对齐
    • s:严格模式(strict),必须完全匹配
  • aspf:SPF 对齐模式

    • r:宽松模式
    • s:严格模式
  • pct:策略应用百分比(0-100)

    pct=50
    

    只对 50% 的邮件应用策略,适合逐步部署。

  • ri:报告间隔(秒)

    ri=86400
    

    默认是 86400(24小时)。

DMARC 部署策略

阶段 1:监控模式(建议持续 1-2 周)

v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com; pct=100
  • 策略设为 none,不影响邮件投递
  • 收集报告,了解当前的邮件来源
  • 识别合法的邮件源和问题

阶段 2:部分强制(建议持续 1-2 周)

v=DMARC1; p=quarantine; pct=10; rua=mailto:dmarc-reports@example.com; ruf=mailto:dmarc-forensic@example.com
  • 对 10% 的邮件应用隔离策略
  • 观察是否有误判
  • 逐步增加百分比(10% -> 25% -> 50% -> 75%)

阶段 3:完全强制

v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com; pct=100; adkim=r; aspf=r
  • 对所有邮件应用隔离策略
  • 继续监控报告

阶段 4:最严格策略(可选)

v=DMARC1; p=reject; sp=reject; rua=mailto:dmarc-reports@example.com; pct=100; adkim=s; aspf=s
  • 直接拒绝未通过验证的邮件
  • 使用严格对齐模式
  • 只有在完全确信配置正确时才使用

DMARC 报告分析

DMARC 报告是 XML 格式的,可以使用工具解析:

在线工具

自托管工具

  • DMARC Analyzer
  • Parsedmarc

报告内容包括

  • 发送 IP 地址
  • SPF 和 DKIM 验证结果
  • 邮件数量
  • 对齐结果

通过分析报告,可以:

  • 识别未授权的邮件源
  • 发现配置问题
  • 监控品牌滥用

5.2.5 PTR 记录配置

PTR(Pointer)记录也称为反向 DNS(rDNS),将 IP 地址映射回域名。

PTR 记录的重要性

许多邮件服务器会检查发件服务器的 PTR 记录:

  • 缺少 PTR 记录可能导致邮件被拒绝或标记为垃圾邮件
  • PTR 记录应该与邮件服务器的主机名匹配
  • PTR 记录应该能正向解析回原 IP(FCrDNS 检查)

配置 PTR 记录

PTR 记录通常需要在 IP 提供商(VPS 提供商)的控制面板中设置,而不是域名注册商。

设置步骤

  1. 登录 VPS 提供商的控制面板
  2. 找到网络或 DNS 设置
  3. 设置反向 DNS(PTR 记录)
  4. 输入:mail.example.com
  5. 保存并等待生效(通常几分钟到几小时)

验证 PTR 记录

# 使用 dig 查询
dig -x 203.0.113.10 +short
# 应该返回:mail.example.com.

# 使用 host 命令
host 203.0.113.10
# 应该返回:10.113.0.203.in-addr.arpa domain name pointer mail.example.com.

# 验证正向解析
dig mail.example.com A +short
# 应该返回:203.0.113.10

PTR 记录最佳实践

  1. PTR 记录应该与 HELO/EHLO 主机名匹配

    • Postfix 的 myhostname 参数应该设置为 mail.example.com
    • PTR 记录应该指向 mail.example.com
  2. 确保正向和反向 DNS 一致

    • mail.example.com 解析到 203.0.113.10
    • 203.0.113.10 反向解析到 mail.example.com
  3. 每个 IP 只设置一个 PTR 记录:不要有多个 PTR 记录指向同一个 IP。

  4. 使用完全限定域名:PTR 记录应该是 FQDN(如 mail.example.com),而不是相对域名。

5.3 Postfix 高级配置

Postfix 是 BillionMail 的核心邮件传输组件,本节将介绍高级配置选项。

5.3.1 主配置文件(main.cf)

Postfix 的主配置文件是 /etc/postfix/main.cf,包含了服务器的核心配置。

基本身份设置

# 主机名
myhostname = mail.example.com

# 域名
mydomain = example.com

# 源地址
myorigin = $mydomain

# 目标域名
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 网络设置
inet_interfaces = all
inet_protocols = ipv4

# 监听端口
smtp_bind_address = 0.0.0.0

邮件大小限制

# 最大邮件大小(50MB)
message_size_limit = 52428800

# 邮箱大小限制(500MB)
mailbox_size_limit = 524288000

速率限制和连接控制

# 每秒最大连接数
anvil_rate_time_unit = 60s
smtpd_client_connection_rate_limit = 10

# 每个客户端最大并发连接数
smtpd_client_connection_count_limit = 10

# 收件人速率限制
smtpd_client_recipient_rate_limit = 100

# 错误软退回限制
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20

TLS 加密设置

# SMTP 客户端 TLS 设置
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# SMTPD 服务器 TLS 设置
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

# 证书和密钥
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem

# TLS 协议和加密套件
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_ciphers = medium
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_ciphers = medium

认证设置

# SASL 认证
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname

# 认证后允许中继
smtpd_sender_restrictions = permit_sasl_authenticated, reject
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

5.3.2 发送队列优化

Postfix 使用多级队列系统管理邮件,理解和优化队列对性能和可靠性至关重要。

队列目录

  • incoming:新接收的邮件
  • active:正在投递的邮件
  • deferred:暂时失败等待重试的邮件
  • corrupt:损坏的邮件
  • hold:被管理员保留的邮件

队列管理命令

# 查看队列
postqueue -p

# 刷新队列(尝试立即投递)
postqueue -f

# 查看特定邮件
postcat -q QUEUE_ID

# 删除特定邮件
postsuper -d QUEUE_ID

# 删除所有邮件
postsuper -d ALL

# 删除延迟队列中的所有邮件
postsuper -d ALL deferred

队列性能优化

# active 队列大小
qmgr_message_active_limit = 20000

# 每个目标的活动投递数
qmgr_message_recipient_limit = 20000

# 并发投递进程数
default_process_limit = 100

# 每个目标的最大并发连接数
smtp_destination_concurrency_limit = 2

# 每个收件人域名的最大并发连接数
smtp_destination_recipient_limit = 50

重试策略

# 最小重试时间(默认 300 秒 = 5 分钟)
minimal_backoff_time = 300s

# 最大重试时间(默认 4000 秒 ≈ 1 小时)
maximal_backoff_time = 4000s

# 队列中邮件的最大生存时间(默认 5 天)
maximal_queue_lifetime = 5d

# 退回邮件的最大生存时间(默认 5 天)
bounce_queue_lifetime = 5d

5.3.3 虚拟域名和邮箱配置

Postfix 支持虚拟域名,允许托管多个域名的邮件服务。

虚拟邮箱配置

# 启用虚拟邮箱
virtual_mailbox_domains = pgsql:/etc/postfix/pgsql-virtual-mailbox-domains.cf
virtual_mailbox_maps = pgsql:/etc/postfix/pgsql-virtual-mailbox-maps.cf
virtual_alias_maps = pgsql:/etc/postfix/pgsql-virtual-alias-maps.cf

# 虚拟邮箱基础目录
virtual_mailbox_base = /var/mail/vhosts

# 虚拟邮箱用户和组
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

# 虚拟传输
virtual_transport = lmtp:unix:private/dovecot-lmtp

数据库查询配置示例

/etc/postfix/pgsql-virtual-mailbox-domains.cf

user = mailuser
password = mailpass
hosts = localhost
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

/etc/postfix/pgsql-virtual-mailbox-maps.cf

user = mailuser
password = mailpass
hosts = localhost
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'

/etc/postfix/pgsql-virtual-alias-maps.cf

user = mailuser
password = mailpass
hosts = localhost
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'

5.4 Dovecot 高级配置

Dovecot 负责邮件存储和 IMAP/POP3 访问,本节介绍其高级配置。

5.4.1 主配置文件

Dovecot 的配置分散在多个文件中,主要位于 /etc/dovecot/ 目录。

dovecot.conf

# 协议
protocols = imap pop3 lmtp

# 监听地址
listen = *, ::

# 基础目录
base_dir = /var/run/dovecot/

# 实例名称
instance_name = dovecot

conf.d/10-mail.conf

# 邮箱位置
mail_location = maildir:/var/mail/vhosts/%d/%n

# 邮件 UID 和 GID
mail_uid = vmail
mail_gid = vmail

# 邮箱权限
mail_privileged_group = vmail

# 首次登录自动创建邮箱
mail_plugin_dir = /usr/lib/dovecot/modules

conf.d/10-auth.conf

# 禁用明文认证(除非使用 TLS)
disable_plaintext_auth = yes

# 认证机制
auth_mechanisms = plain login

# 包含认证数据库配置
!include auth-passwdfile.conf.ext
!include auth-sql.conf.ext

conf.d/auth-sql.conf.ext(PostgreSQL 认证):

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

dovecot-sql.conf.ext

driver = pgsql
connect = host=localhost dbname=mailserver user=mailuser password=mailpass

password_query = SELECT email as user, password FROM virtual_users WHERE email='%u'

user_query = SELECT '/var/mail/vhosts/%d/%n' as home, 'maildir:/var/mail/vhosts/%d/%n' as mail, 5000 AS uid, 5000 AS gid FROM virtual_users WHERE email='%u'

5.4.2 SSL/TLS 配置

conf.d/10-ssl.conf

# 启用 SSL
ssl = required

# 证书和密钥
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem

# SSL 协议
ssl_min_protocol = TLSv1.2
ssl_protocols = !SSLv2 !SSLv3 !TLSv1 !TLSv1.1

# 加密套件
ssl_cipher_list = ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384

# 优先使用服务器加密套件
ssl_prefer_server_ciphers = yes

# DH 参数
ssl_dh = </etc/dovecot/dh.pem

生成 DH 参数:

openssl dhparam -out /etc/dovecot/dh.pem 2048

5.4.3 性能优化

conf.d/10-master.conf

service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
  
  # 进程设置
  service_count = 1
  process_min_avail = 2
  vsz_limit = 64M
}

service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}

service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}

service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    group = vmail
  }
  
  user = dovecot
}

service auth-worker {
  user = vmail
}

邮箱配额设置

conf.d/90-quota.conf

plugin {
  quota = maildir:User quota
  quota_rule = *:storage=1GB
  quota_rule2 = Trash:storage=+100M
  quota_warning = storage=95%% quota-warning 95 %u
  quota_warning2 = storage=80%% quota-warning 80 %u
}

5.5 Rspamd 反垃圾邮件配置

Rspamd 是一个现代化的垃圾邮件过滤系统,本节介绍其配置。

5.5.1 基本配置

Rspamd 的配置文件位于 /etc/rspamd/

local.d/options.inc

# DNS 服务器
dns {
  nameserver = ["8.8.8.8", "8.8.4.4"];
}

# 最大邮件大小
max_message = 50M;

local.d/worker-normal.inc

# 绑定地址
bind_socket = "localhost:11333";

local.d/worker-controller.inc

# Web 界面绑定地址
bind_socket = "localhost:11334";

# 密码(需要加密)
password = "$2$...";

生成密码:

rspamadm pw

5.5.2 DKIM 签名配置

local.d/dkim_signing.conf

# 启用 DKIM 签名
enabled = true;

# 域名配置
domain {
  example.com {
    selector = "default";
    path = "/var/lib/rspamd/dkim/example.com.default.key";
  }
}

# 签名算法
sign_alg = "rsa-sha256";

# 签名的邮件头
sign_headers = ["from", "to", "subject", "date", "message-id"];

5.5.3 垃圾邮件检测规则

Rspamd 使用多种技术检测垃圾邮件:

贝叶斯过滤

# local.d/classifier-bayes.conf
autolearn = true;

训练贝叶斯分类器:

# 学习垃圾邮件
rspamc learn_spam /path/to/spam/*.eml

# 学习正常邮件
rspamc learn_ham /path/to/ham/*.eml

自定义规则

local.d/local.lua

-- 自定义规则:检查特定关键词
rspamd_config.MY_RULE = {
  callback = function(task)
    local subject = task:get_header('Subject')
    if subject and subject:find('viagra') then
      return true
    end
    return false
  end,
  score = 5.0,
  description = 'Contains suspicious keyword'
}

5.5.4 白名单和黑名单

local.d/whitelist.conf

# 白名单域名
whitelist_domains = [
  "example.com",
  "trusted-partner.com"
];

# 白名单 IP
whitelist_ip = [
  "203.0.113.0/24",
  "198.51.100.10"
];

local.d/blacklist.conf

# 黑名单域名
blacklist_domains = [
  "spam-domain.com"
];

# 黑名单 IP
blacklist_ip = [
  "192.0.2.100"
];

5.6 小结

在本章中,我们深入探讨了 BillionMail 邮件服务器的详细配置,包括:

  1. 邮件传输协议:详细了解了 SMTP、IMAP、POP3 协议的工作原理和配置。

  2. DNS 记录优化:学习了 MX、SPF、DKIM、DMARC、PTR 记录的配置和最佳实践,这对邮件送达率至关重要。

  3. Postfix 高级配置:掌握了 Postfix 的各种配置选项,包括 TLS 加密、队列管理、虚拟域名等。

  4. Dovecot 高级配置:了解了 Dovecot 的认证、SSL、性能优化等配置。

  5. Rspamd 反垃圾邮件配置:学习了如何配置 Rspamd 来过滤垃圾邮件和签名邮件。

正确的邮件服务器配置是确保邮件系统稳定运行和邮件成功送达的关键。在下一章中,我们将学习如何使用 BillionMail 的邮件营销功能进行实际的邮件活动。

posted @ 2025-12-17 07:35  我才是银古  阅读(2)  评论(0)    收藏  举报