通过Docker使用Poste.io搭建一个可以收发邮件的邮箱服务器并配置DKIM防止进入垃圾邮箱

ShowUNow 发布于 2024-11-22 347 次阅读


写在前面

Poste.io是一个很好用的邮箱服务器搭建工具,在配置好DKIM key 之后,可以给绝大部分的大厂邮箱发送邮件,而不会进入垃圾邮箱。当然,微软邮箱比较特殊,它狠起来连自己人都不放过,所以下文提到各大邮箱厂商时,默认不包括微软邮箱。

本次搭建使用的是 .top 域名,即本站域名。优势就是首年/续费都很便宜,并且更重要的是经过测试,该域名后缀本身不会被各大厂商列入”垃圾域名“而拒收。至于你使用 .com 的话,就更没问题了。

Poste.io 的优势很多,缺点就是不能让用户自主注册邮箱,这点比较麻烦。也许可以通过一些其他方式实现,但是本人暂未做研究。

开始搭建

推荐/需要的服务器配置

最好是2核2G及以上配置的服务器,不过1核1G也不是不能用。关闭邮件杀毒检测后,Poste.io本身大概要占用0.5G内存,内存不够可以开虚拟内存来缓解一下。

首先需要检测一下服务器IP质量,进入第一个网站。如果显示ip has no issues,则说明IP可以正常使用;如果被告知列入黑名单了,则建议放弃使用该服务器搭建。第二个网站,看看是否黑名单过多。否则即使搭建好了,发送的邮件也是会进其他邮箱的垃圾邮箱。

接着,测试一下25端口是否可用,这一点算是重要,但不是25端口不能用就搭建不了邮箱服务器了,只是用起来会受到一些限制,不能直接发送邮件,而是需要配置一下SSL证书,通过465端口来发送。一些厂商基本都不允许25端口使用,不必大惊小怪。华为云的轻量云系列除北京一以外都默认开启25端口;腾讯云会禁止25端口的出站流量;阿里云据说25端口出站入站都禁。

telnet smtp.qq.com 25

这个如果输出

Trying 183.47.101.192...
Connected to smtp.qq.com.
Escape character is '^]'.
220 newxmesmtplogicsvrszb16-1.qq.com XMail Esmtp QQ Mail Server.

则说明可以使用25端口直接发送邮件,如果一直卡在connecting 那就说明25端口至少封禁出站流量。

使用

nc -l 25

然后去这个ping测试网站上输入 ip:25测试。如果能ping通,说明服务器不封禁25入站流量。

说明

25端口允许出站流量说明可以直接使用25端口进行发送邮件;允许入站流量说明可以接受来自其他服务器25端口发送的邮件。所以禁25端口出站不那么重要

DNS配置

记录类型主机记录记录值
MX@mail.tingyun.top
TXT@v=spf1 mx ~all
Amail你的服务器ip
CNAMEsmtpmail.tingyun.top
CNAMEpopmail.tingyun.top
CNAMEimapmail.tingyun.top
TXT后续填写后续填写

把上面tingyun.top 更换为自己的域名。

安装Docker

# 安装docker,如果遇到问是否继续的就输入y来确定 
apt install docker.io 

# 设置docker开机自启和启动docker 
systemctl enable docker && systemctl start docker 

# 检查是否安装成功,若安装成功会显示 Docker version x.x.x 
docker -v

Docker换镜像源

如果你使用的是国内服务器的话,需要进行换源操作,否则Docker 基本无法直接使用。

# 创建或修改 /etc/docker/daemon.json 文件
apt install nano && nano /etc/docker/daemon.json

# 然后输入下面内容:(输入完后按Ctrl+O,然后回车保存,接着按Ctrl+X退出编辑器)
{
  "registry-mirrors": ["https://docker.1ms.run",
                       "https://dockerhub.icu",
                       "https://docker2.awsl9527.cn"
  ]
}

# 重启docker服务
systemctl restart docker.service

安装 Docker Compose

sudo apt install -y docker-compose

创建docker-compose.yaml文件

建议先新建一个文件夹,在里面创建一个docker-compose.yaml文件

nano docker-compose.yaml
version: '3.7'

services:
  mailserver:
    image: analogic/poste.io
    hostname: mail.your-domain.com
    ports:
      - "25:25"
      - "110:110"
      - "143:143"
      - "587:587"
      - "993:993"
      - "995:995"
      - "4190:4190"
      - "465:465"
      - "8808:80"
      - "8843:443"
    environment:
      - LETSENCRYPT_EMAIL=admin@your-domain.com
      - LETSENCRYPT_HOST=mail.your-domain.com
      - VIRTUAL_HOST=mail.your-domain.com
      - DISABLE_CLAMAV=TRUE
      - TZ=Asia/Shanghai
      - HTTPS=OFF
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./mail-data:/data

说明

- "8808:80"
- "8843:443"

这一部分是将邮局的web页面部署在了8808和8843端口,来实现对这两个端口和其他web服务的复用,后续还需要配置一下nginx端口反代。如果嫌麻烦并且这个服务器只用来作为邮箱服务器可以直接写为80:80443:443,让其独占80/443端口。

服务端口说明
SMTP25SMTP 服务端口
IMAP143IMAP 服务端口
POP3110POP3 服务端口
SMTPS465SMTPS 服务端口
IMAPS993IMAPS 服务端口
POP3S995POP3S 服务端口
MSA587SMTP 端口主要由电子邮件客户端在 STARTTLS 和身份验证之后使用
Sieve4190远程筛子设置
Webmail8808Webmail 服务端口
Webmail8843Webmail 服务端口

启动镜像

# 启动poste.io
docker-compose up -d

登录Poste.io邮箱服务器

容器启动后,在浏览器地址栏输入 http://IP:8808/admin/install/server 或者是 http://你的域名:8808/admin/install/server 进入配置页面。

在这个页面,我们输入你邮箱的域名,管理员邮箱地址,以及生成密码(也可以自己手动输入)后提交即可。切记记录一下邮箱的域名和管理员账户。

进入后台,找到System settings → TLS certificate,点击issue free letsencrypt.org certificate进行申请SSL证书(申请SSL证书后浏览器地址栏会变小绿锁,不会显示不安全了)。

然后我们在Virtual domains点击域名,申请DKIM。

这一步很重要,直接决定了你发送的邮件是否会进入其他邮件大厂的垃圾邮箱!

然后我们在Virtual domains点击域名,申请DKIM

申请完成后,需要按照页面提示更新DNS记录,新建一个TXT记录即可。

例如我的DKIM为

s20241121653._domainkey.tingyun.top. IN TXT "k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5yloCVqzqAVWPDbtHr9d3D2RfRJiI/Bi/oZJSHi1SQ+uBsIvVgbY00d76xlr8cEZHwJK9t8reQ69DkSddakYnO2MyzhUXvm/xQtAsS2613u6aMKIve8EW1wNVP8NrnQvo6lYcrTpl66WJ9sq7pm/4EI4GpZzXffA+2rgz/R6pKW6rhreu0tjswNKycp/Wq+xYRau0MT4P0X76/DdRifoPNyUVe5QmQyU2Ph5I2JFup7UlrkXLs5+uwTbZbH7vE9YNtxPxW5iTubSHO+Stocd7lrdL+8rhnFPR4E0lIcsnstMxah4NTA4Zs1IWDyk2PpXbf3Zu1KoKI6O4PKx1Nf9kwIDAQAB"

主机记录就填写s20241121653._domainkey,记录值则填写k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5yloCVqzqAVWPDbtHr9d3D2RfRJiI/Bi/oZJSHi1SQ+uBsIvVgbY00d76xlr8cEZHwJK9t8reQ69DkSddakYnO2MyzhUXvm/xQtAsS2613u6aMKIve8EW1wNVP8NrnQvo6lYcrTpl66WJ9sq7pm/4EI4GpZzXffA+2rgz/R6pKW6rhreu0tjswNKycp/Wq+xYRau0MT4P0X76/DdRifoPNyUVe5QmQyU2Ph5I2JFup7UlrkXLs5+uwTbZbH7vE9YNtxPxW5iTubSHO+Stocd7lrdL+8rhnFPR4E0lIcsnstMxah4NTA4Zs1IWDyk2PpXbf3Zu1KoKI6O4PKx1Nf9kwIDAQAB

以上每个人的都不一样,根据自己生成的进行填写。另外,如果你使用的是华为云解析dns,生成2048bit格式的DKIM一次性写入会提示长度过长,中间加几个英文""就好了。

配置Nginx反向代理(非必须)

如果你之前是将Poste.io的web端设置为非80/443端口,那么建议执行这部操作,可以免去输入端口号的问题。

server {
    listen 443 ssl http2;
    server_name mail.tingyun.top;

    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://127.0.0.1:8808;
        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;
    }
}

# HTTP to HTTPS redirection
server {
    listen 80;
    server_name mail.tingyun.top;

    location / {
        return 301 https://$host$request_uri;
    }
}

以上配置中将ssl_certificatessl_certificate_key更改为你ssl证书实际所在位置。

proxy_pass http://127.0.0.1:8808;这一段中的8808改为你实际部署的端口。如果你是按我前文所述的配置则不需要更改。

然后

#调试一下nginx
sudo nginx -t

#重新加载nginx以生效配置
sudo nginx -s relaod

这样配置好后基本大功告成!

测试发送的邮件质量

前往这个网站检测一下。

最好是10分,8分以上也可以。有能力可以自己找qq邮箱、gmail、163等主流大厂邮箱实际发送邮件测试一下!

关于rDNS

rDNS就相当于DNS的的逆向过程,是通过IP地址来找域名。这项服务一般往往用于邮件服务器上,目的是增加邮件服务器发送邮件的信任度,防止发送的邮件被送入垃圾邮箱。

但是很多服务器厂商并不提供这项服务。这里还是推荐华为云服务器,进入其反向列表页面来创建反向解析。具体教程参考这个页面。腾讯云创建反向解析记录需要掏钱,而且非常贵,一条记录300元!阿里云似乎也是这样。

nslookup -qt=ptr IP地址

如果以上代码能正确返回你的域名,则说明rDNS已经生效。

不过rDNS并不是必须的,不是说不配置rDNS发送的邮件就一定会进入大厂的垃圾邮箱。只是说能配置rDNS更佳。

如何更便于使用

将自己搭建好的域名邮箱添加到大厂邮箱app中

如果我们只是通过web端来进行邮件的收发,那么一是操作起来麻烦;二是当有人给我们发送邮件时,我们不能及时地收到通知。下面讲一下如何将我们的邮箱添加到其他大厂的邮箱app。

这里以gmail为例,其他邮箱同理。

首先点击添加Other (IMAP)

接着输入你邮箱的信息。这里如果你25端口能收能发,可以直接使用25端口。如果25端口使用受限,则需要使用465端口,前提是你需要为你的域名服务器配置了ssl证书,前面已经配置过了。我也更推荐这种方式收发邮件,使邮件内容的保密性更佳。密码就输入你创建这个邮箱时设置的密码。

后面验证好后,写一个名字基本就大功告成了。可以测试一下用这个客户端app是否能够正常的收发邮件。

为WordPress添加自动发送的邮件的服务器

这里我使用的是WP Mail SMTP插件,其他插件或者代码实现的方式同理。

点击添加 其他SMTP

输入你的邮箱信息。依然是如果你为你的mail.域名添加了ssl证书,那么SMTP主机这部分就写mail.域名,而不是smtp.域名。启用ssl,密码还是填写你改域名邮箱地址创建时设置的密码。然后保存设置。

然后到这个插件的工具这一栏中,测试一下邮件是否可以正常发送。

我的测试结果是刚设置好后,这封测试邮件会进大厂邮箱的垃圾邮箱里,但是除了这封测试邮件以外,其余比如新文章通知,或者新评论通知等邮件则可正常接收。并且接受完之后,再发送测试邮件,又可以正常接收了,很神奇!

接下来就可以愉快的使用了!

我的其他文章

如何用代码实现给WordPress启用评论回复邮件通知

纯代码实现开启WordPress新文章的发布的邮件通知

临时起意搭建的博客,不知道能坚持下去多久。
最后更新于 2024-12-04