返回首页

Postfix DKIM Docker:仅发送服务器设置

在 Ubuntu 22.04 的 Docker 容器中部署仅发送 Postfix 和 DKIM 的指南。涵盖 Docker 安装、Certbot、SPF/DKIM DNS 记录、rDNS 和投递率测试。适用于中高级开发者。

Docker Postfix 带 DKIM:开发者完整指南
Advertisement 728x90

在 Ubuntu 上使用 Docker 部署带 DKIM 的仅发送 Postfix

本指南介绍如何在 Ubuntu 22.04(1 GB 内存,1 vCPU)上部署 boky/postfix Docker 容器,启用 OpenDKIM 和 TLS。该服务器仅通过认证会话或来自本地主机的 587 端口发送邮件。支持自动 DKIM 密钥生成,并挂载 Let's Encrypt 证书。前提条件:一个在 Cloudflare 管理的域名,以及主机提供商允许出站 25 端口的 VPS。

服务器准备

更新软件包:

apt update && apt upgrade -y

移除旧 Docker 软件包:

Google AdInline article slot
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

安装官方 Docker:

apt update
apt install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装 Certbot:

apt install certbot

在 Cloudflare 添加 A 记录:mail → VPS IP,并禁用代理。颁发证书:

Google AdInline article slot
certbot certonly --standalone -d mail.yourdomain.com

创建续期钩子以重启容器:

nano /etc/letsencrypt/renewal-hooks/post/restart-postfix.sh

内容:

#!/bin/bash
docker restart postfix

使其可执行:chmod +x /etc/letsencrypt/renewal-hooks/post/restart-postfix.sh

Google AdInline article slot

创建用户和 docker-compose

创建非特权用户:

useradd -m emailuser -G docker -s /bin/bash
passwd emailuser
su emailuser

创建 docker-compose.yml

services:
  postfix:
    image: boky/postfix
    container_name: postfix
    restart: unless-stopped
    ports:
      - "587:587"
    volumes:
      - ./dkim:/etc/opendkim/keys
      - /etc/letsencrypt/live/mail.yourdomain.com/fullchain.pem:/etc/opendkim/keys/mail.crt:ro
      - /etc/letsencrypt/live/mail.yourdomain.com/privkey.pem:/etc/opendkim/keys/mail.key:ro
    environment:
      HOSTNAME: mail.yourdomain.com
      DOMAIN: yourdomain.com
      DKIM_SELECTOR: mail
      DKIM_DOMAINS: yourdomain.com
      DKIM_KEY_LENGTH: 2048
      ENABLE_DKIM: 1
      ENABLE_TLS: 1
      TLS_KEY: /etc/opendkim/keys/mail.key
      TLS_CERT: /etc/opendkim/keys/mail.crt
      SMTP_USER: [email protected]|password
      RELAY_NETWORKS: 127.0.0.1/32
      FORCE_HELO: 1
      LOG_TO_STDOUT: 1
      ALLOWED_SENDER_DOMAINS: mail.yourdomain.com
      DKIM_AUTOGENERATE: "true"

运行:docker compose up -d。密钥生成后,移除 DKIM_AUTOGENERATE

DNS 配置

./dkim 目录中,找到包含公钥的 .txt 文件。提取类似这样的行:

v=DKIM1; h=sha256; k=rsa; s=email; p=MNOGO_SIMVOLOV

(将密钥部分连接起来,不带括号/引号)。在 Cloudflare 添加 TXT 记录:

  • 名称:mail._domainkey
  • 内容:密钥字符串

域的 SPF 记录:

  • 名称:yourdomain.com
  • 内容:v=spf1 a mx ip4:YOUR_VPS_IP -all

rDNS 和 25 端口

联系您的主机提供商:

  • 开放出站 25 端口。
  • mail.yourdomain.com 设置 rDNS → VPS IP。

测试

在 mail-tester.com 或 appmaildev.com 上测试。进入容器:

docker exec -it postfix bash
echo -e "Subject: DKIM Test\n\nThis is a test message" | sendmail -f [email protected] [email protected]

预期结果:测试得分 10/10,邮件进入 Gmail 收件箱。

  • DKIM:自动生成 2048 位密钥。
  • SPF:通过 IP 限制发送。
  • TLS:Let's Encrypt 带自动续期。
  • 认证:SMTP_USER 用于中继。

关键点

  • boky/postfix 容器开箱即用包含 Postfix + OpenDKIM。
  • 为密钥和证书挂载卷时使用 :ro 以增强安全性。
  • RELAY_NETWORKS=127.0.0.1/32 阻止未经认证的外部发送。
  • DKIM 生成后禁用 AUTOGENERATE。
  • rDNS 对主要提供商的可投递性至关重要。

— Editorial Team

Advertisement 728x90

继续阅读