📖 背景介绍

Poste.io 是一个基于 Docker 的全功能邮件服务器解决方案,集成了 SMTP、IMAP、POP3、Webmail、反垃圾邮件(Rspamd)、病毒扫描(ClamAV)等功能。通过 Docker 部署,可以快速搭建并管理自己的邮件服务器,即装即用,非常适合个人和小型企业部署。

一:前期准备 🧰

✅ 系统要求

  • 操作系统:Ubuntu / Debian / 其他 Linux 系统均可
  • 权限:具有 root 权限或 sudo 权限的用户。
  • 公网 IP:确保 VPS 拥有公网 IP。
  • 域名:已注册的域名,并可管理其 DNS 设置。

✅ 安装 Docker 和 Docker Compose 此处默认大家都有 Docker 环境,没有的话可以使用官方提供的一键脚本自行安装。

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

二:配置防火墙和端口 🔒

✅ 检查并开放必要端口 poste.io 需要以下端口:

  • SMTP:25, 465, 587

  • IMAP/POP3:110, 143, 993, 995

  • Web 管理界面:80, 443

这里有个很关键的点在于,你需要确认你的 VPS 提供商开放 25 端口,像我了解到的 RN、Netcup 都是开放的。(这里博主是购买的 Netcup-RS1000 机器)

25 端口开放测试:

telnet smtp.aol.com 25

留坑:

一般来说,这里通过 Docker 安装,会自动对 iptables 防火墙进行相关端口设置,所以只要确认 25 端口开放,其他端口可以暂时不用管。

当然,如果安装后发现端口防火墙设置有问题,可以使用 UFW 来进行防火墙端口管理。

sudo ufw allow 25,80,110,143,443,465,587,993,995,4190/tcp
sudo ufw enable

✅ 设置 RDNS(反向 DNS) RDNS 是邮件服务器信誉的重要因素,强烈建议开启。

rDNS(反向域名解析)在网络管理和安全方面具有重要意义。以下是一些关键点:

  • 验证身份:rDNS 可以帮助验证连接到服务器或网络的主机的身份。通过将 IP 地址解析回域名,网络管理员可以确认连接请求是否来自预期的来源。
  • 邮件服务器的信誉:许多电子邮件服务器使用 rDNS 来验证发件服务器的身份。如果发件服务器的 IP 地址没有有效的 rDNS 记录,收件服务器可能会将其标记为垃圾邮件源,从而拒绝接受邮件。
  • 日志分析:在分析网络日志时,rDNS 可以将 IP 地址转换为更易于理解的域名,帮助管理员更轻松地识别和追踪网络活动来源。
  • 安全性:通过 rDNS,管理员可以检测潜在的恶意行为。例如,如果一个 IP 地址声称来自某个可信域,但其 rDNS 记录却显示不同的信息,这可能表明存在欺诈行为。
  • 合规性:一些合规标准和法规要求实施 rDNS 以确保网络通信的透明度和可追溯性。 总之,rDNS 有助于增强网络安全,改善邮件交付率,并提供更好的网络管理和分析工具。

以 Netcup 服务商为例,可以在 ccp 里进行管理。填上自己想要解析的域名就好。RN 服务器的话可以自行发工单咨询客服解决。 1748266964830.png

三:配置 DNS 记录 🌐

在你的域名 DNS 管理面板中添加以下记录:

  • A 记录:将 mail.yourdomain.com 指向你的 VPS 公网 IP。

  • MX 记录:指向 mail.yourdomain.com,优先级设为 10。

  • SPF 记录(TXT):

    v=spf1 ip4:你的服务器 IP 地址 ~all
    
  • _dmarc 记录: 处理验证失败的邮件

映射关系可以按照下表填写:

名称(主机记录) 记录类型 记录值 优先级 / 说明
@ MX mail.yourdomain.com 优先级 10,邮件服务器域名
mail A 你的服务器 IP 地址 邮件服务器 IP 地址
@ TXT v=spf1 ip4:你的服务器 IP 地址 ~all SPF 记录,指定允许发送邮件的服务器
_dmarc TXT v=DMARC1; p=none; rua=mailto:dmarc@mail.yourdomain.com DMARC 记录,处理验证失败的邮件

可以参考我的 DNS 配置,如下图所示: dns.mail.jpg

四:使用 Docker Compose 部署 poste.io 📦

✅ 1. 创建对应docker目录和数据目录

mkdir -p ~/posteio && cd ~/posteio
mkdir -p ./data

✅ 2. 创建docker-compose.yml文件:

version: "3"

services:
  poste:
    image: analogic/poste.io
    container_name: poste
    restart: always
    ports:
      # 邮件相关端口
      - "25:25"
      - "110:110"
      - "143:143"
      - "465:465"
      - "587:587"
      - "993:993"
      - "995:995"
      # 管理界面端口(将被Nginx反代)
      - "127.0.0.1:8443:443"
    environment:
      - TZ=Asia/Shanghai # 设置时区
      - HTTPS=ON # 启用HTTPS
      - HTTPS_PORT=443 # HTTPS端口
      - DISABLE_CLAMAV=FALSE # 启用ClamAV防病毒
      - DISABLE_RSPAMD=FALSE # 启用Rspamd反垃圾邮件
      - WEBMAIL_LITE=TRUE # 使用轻量级Webmail
      - REPORT_ADMIN_EMAIL=admin@xxx.de # 管理员邮箱
      - OVERRIDE_HOSTNAME=mail.xxx.de # 主机名

    volumes:
      - ./data:/data # 数据持久化
    cap_add:
      - NET_ADMIN # 允许网络管理权限
    ulimits: # 设置资源限制
      nofile:
        soft: 65536
        hard: 65536
    logging: # 日志配置
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "5"

networks:
  default:
    driver: bridge

✅ 3. 启动容器

docker compose up -d

五:使用 Nginx 进行反代 🪜

✅ 编辑nginx配置文件

nano /etc/nginx/sites-available/mail

以我的 nginx 配置为例,可根据需求自定义修改

server {
    listen 80;
    server_name mail.xxx.de;

    # 将HTTP请求重定向到HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name mail.thehogwarts.de;

    # SSL配置(稍后会通过Let's Encrypt获取证书)
    ssl_certificate /etc/letsencrypt/live/xxx/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xxx/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    # 启用HSTS
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    # 反向代理到Poste.io管理界面
    location / {
        proxy_pass https://127.0.0.1:8443;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket支持(用于实时通知)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 超时设置
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }
}

Ctrl + X 保存配置。

✅ 链接到 enable 文件,并重启nginx使配置生效。

ln -s /etc/nginx/sites-available/mail /etc/nginx/sites-enabled/mail
nginx -t && nginx -s reload

六: 使用并配置 DKIM 记录 🎈

  1. 首先,进入 Virtual Domains 生成 DKIM 记录,并添加进 DNS 解析。 1748274156745.png

  2. 在 Email Account 中添加邮箱账户,务必保存好每个邮箱账户的账户密码。(建议生成 30 位复杂密码) 1748274419125.png

  3. 点击 webmail 访问邮箱服务,至此你可以愉快地使用这个自建邮局进行玩耍啦~ 1748274862198.png 1748274984925.png

七:问题排错 & 邮局检查 🛠️

当然,每个人环境不一样,搭建可能出现问题,可以使用mail-test进行邮局自检,然后在 poste.io 内部也有基础的邮局检测能力。 可以根据检测情况进行排错及修改,有问题欢迎私聊/邮件交流~ 贴一张邮局检测全检图: 1748275447079.png