⚠️本篇属于过程回忆,我的搭建过程并不完全按照文章路线来,期间解决dovect和certbot导致我的整个搭建过程比较混乱,本篇文章是事后总结出的一条比较可靠的搭建路线,如果照着文章搭建有概率碰到奇怪的小问题,毕竟我也没有验证^_^

一个合格的hacker一定有一个自己的邮箱地址和服务

我的搭建环境为AWS送的一年EC2,系统Debian(一年后到期再说吧= =

域名为porkbun买的.space,并套上cf监控域名访问情况(如果有小可爱在渗透就可以看到)

采购阶段

首先是域名,这个没啥好说的,想在哪里买域名都可以

截屏2025-03-31 17.12.58

不过有个比较想骂人的地方是在porkbun买的时候碰到身边七年老用户都没见过的逆天支付bug

image-20250331171606137

成功付款后域名并未到账= = 当时急得不行,发邮件反馈等了一天,最后官方给我平台自己的等值货币

image-20250331171937314

但是……

image-20250331172017510

image-20250331172031862

处理很人性化,后来朋友说应该是striple接口的问题而不是porkbun的问题,所以大家要想用porkbun还是可以放心用,要是碰到我这样的情况也别慌,发邮件反馈,一天内就会回复(应该不是每个人都有我这样的bug触发圣体……

然后是vps,EC2领取教程网上一搜一把,我就不多介绍了

搭建阶段

1 - 安装postfix和dovecot并进行基本配置

AWS选择debian系统,进去后先安装postfix和devocot。前者用于发件,后者用于收件

sudo apt update && sudo apt upgrade -y
sudo apt install postfix dovecot-core dovecot-imapd mailutils -y

这里我没有安装pop3,如果需要pop3可以再加一句apt install dovecot-pop3d -y

顺便简单介绍一下pop3和imap的区别

  • POP3: POP3通过将邮件从服务器下载到本地设备(如电脑或手机)来工作。下载后,邮件通常会从服务器上删除(除非手动设置保留副本)。它更像是一种“取走邮件”的方式,适合离线阅读。
  • IMAP: IMAP允许你在服务器上直接管理和查看邮件,而无需将它们下载到本地设备。本地设备只是显示服务器上的邮件内容,所有操作(如删除、移动文件夹)都会同步到服务器。

接着配置postfix

vim /etc/postfix/main.cf

myhostname = yourdomainname.com
mydomain = yourdomainname.com
myorigin = /etc/mailname
mydestination = $myhostname, localhost.$mydomain, localhost
inet_interfaces = all
inet_protocols = all
home_mailbox = Maildir/

然后配置dovecot,首先配置主文件

vim /etc/dovecot/dovecot.conf

#确保存在这句即可。如果要pop3可以在后面添加一个pop3,空格分隔
protocols = imap

接着配置存储文件

vim /etc/dovecot/conf.d/10-mail.conf

#将下面这句配置修改为这样
mail_location = maildir:/home/你想要的邮箱用户名(后面用akaRed代替)/Maildir

接着配置认证配置

vim /etc/dovecot/conf.d/10-auth.conf

#确保这两项即可
disable_plaintext_auth = no
auth_mechanisms = plain login

然后重启这两个服务

sudo systemctl restart postfix
sudo systemctl restart dovecot

2 - 创建邮箱用户

添加系统用户作为邮箱账户

sudo adduser --shell /bin/bash akaRed

按步骤设置完密码。接着创建目录

sudo maildirmake.dovecot /home/akaRed/Maildir
sudo chown -R akaRed:akaRed /home/akaRed/Maildir

3 - 将域名套用到 Cloudflare 并设置 DNS

如果你没有在cloudflare上绑定过域名可以看这个教程

https://blog.csdn.net/yzixin/article/details/133189358

接着点进你的域名DNS记录管理页面,然后添加下面这几条记录

A 记录

  • 类型:A
  • 名称:@(代表根域名)
  • 值:你的 VPS IP
  • TTL:自动
  • 代理状态:关闭(DNS Only)(邮件服务需要直接指向服务器 IP,不能通过 Cloudflare 代理)。

MX 记录

  • 类型:MX
  • 名称:@
  • 值:yourdomainname.com
  • 优先级:10
  • TTL:自动
  • 代理状态:关闭(DNS Only)

TXT 记录(SPF)

  • 类型:TXT
  • 名称:@
  • 值:v=spf1 a mx ~all
  • TTL:自动

4 - 设置TLS

cf虽然提供TLS,但是由于我们没有开启代理选项,所以仍需在 VPS 上配置证书。这里我用certbot来实现

由于我的VPS情况是80端口跑着不能暂停的服务,所以需要用DNS-01验证。

首先安装certbot

sudo apt install certbot -y
sudo certbot certonly --standalone -d yourdomainname.com

证书储存在/etc/letsencrypt/live/yourdomainname.com/

然后来到cloudflare,跟着截图走

image-20250331180554542

image-20250331180621162

image-20250331180731952

image-20250331180756942

image-20250331180854208

上图的select要选上你绑进来的域名。点击继续后就可以复制一段令牌。接着我们要在vps保存这段令牌

sudo mkdir -p /etc/letsencrypt
sudo vim /etc/letsencrypt/cloudflare.ini

#输入这段内容
dns_cloudflare_api_token = 你的API令牌

然后设置权限

sudo chmod 600 /etc/letsencrypt/cloudflare.ini

然后用certbot进行认证

sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d yourdomainname.com

Certbot 会:

  • 提示输入邮箱(填入一个你的真实邮箱,用来接收证书过期提示。例如114514@qq.com)。
  • 询问是否分享给 EFF(建议选 N)。
  • 自动在 Cloudflare 添加 TXT 记录进行验证。

验证完成后,证书会存储在 /etc/letsencrypt/live/youdomainname.com/。这里为了确保证书路径对postfix拥有权限,建议执行下面的命令

sudo chmod 644 /etc/letsencrypt/archive/yourdomainname.com/fullchain1.pem
sudo chmod 640 /etc/letsencrypt/archive/yourdomainname.com/privkey1.pem
sudo chown root:postfix /etc/letsencrypt/archive/yourdomainname.com/fullchain1.pem
sudo chown root:postfix /etc/letsencrypt/archive/yourdomainname.com/privkey1.pem

5 - 为postfix和dovecot配置TLS

先配postfix

vim /etc/postfix/main.cf

smtpd_tls_cert_file = /etc/letsencrypt/live/yourdomainname.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/yourdomainname.com/privkey.pem
smtpd_use_tls = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may

其中

  • smtpd_tls_cert_file:指向证书链文件。
  • smtpd_tls_key_file:指向私钥文件。
  • smtpd_use_tls = yes:启用 TLS。
  • smtp_tls_security_level = may:允许客户端选择是否使用 TLS。

接着重启

systemctl restart postfix

没有报错即可。接着配置dovecot

vim /etc/dovecot/conf.d/10-ssl.conf

ssl = yes
ssl_cert = </etc/letsencrypt/live/yourdomainname.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/yourdomainname.com/privkey.pem

注意:< 是必需的,表示从文件读取内容

接着重启

systemctl restart dovecot

没报错即可。

6 - 配置rDNS(可选)

配置这一步的目的是为了提高你邮箱地址的可信度。减少被认为是垃圾邮件的可能

每家vps配置有所区别,这里我就以EC2为例子

进到EC2控制台,进入弹性ip

image-20250331182450287

点击分配,按默认走即可

image-20250331182511152

之后勾上分配的ip,点操作,选择关联

image-20250331182608319

关联上再回到这个页面,选择更新反向DNS。在反向 DNS 域名一栏填写你的域名即可

7 - 配置SASL

目的是为了启用587端口,后面才能配合我的设备的邮件软件使用

首先编辑Postfix的master.cf文件

vim /etc/postfix/master.cf

#找到或添加 Submission 服务
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  • submission:启用 587 端口。
  • smtpd_tls_security_level=encrypt:强制使用 TLS。
  • smtpd_sasl_auth_enable=yes:启用 SASL 认证。
  • smtpd_sasl_path=private/auth:与 Dovecot 认证对接。

接着配置dovecot的

vim /etc/dovecot/conf.d/10-master.conf

#找到 service auth 部分
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

重启他俩,然后用netstat -tunlp看到587端口正在监听就说明启动正常。接着用openssl验证一下

openssl s_client -connect yourdomainname.com:587 -starttls smtp

如果返回 250-AUTH 和证书信息,说明 587 端口正常工作。

8 - 端口开放、证书自动续签设置

确保下面这些端口开放

sudo ufw allow 25
sudo ufw allow 587
sudo ufw allow 465
sudo ufw allow 143
sudo ufw allow 993

接着为certbot配置自动续签

sudo certbot renew --dry-run

使用阶段

这里我以macos自带的邮件为例

点击右上角的邮件、添加账户、添加其他账户

image-20250331184000337

电子邮件地址填akaRed@yourdomain.com,其他的根据实际情况填写。密码就是你在添加系统用户时填写的密码

添加完成后点击右上角邮件、设置,进入到你刚添加的账户,点击服务器设置。

主机名填写你的域名,将两个自动管理链接设置取消,认证方式全选密码。IMAP端口为993,SMTP端口为587,将使用TLS勾选上。接着等待连接就可以愉快的使用啦

小problem

如果你遇到邮件发不出去的情况,大概率是因为你的邮件地址不被一些大邮件商认可。比如腾讯、Google。你可以在你的vps里输入sudo mailq查看邮件发送队列,如果出现类似connection timeout的字样就说明你的邮件地址不被认可和接收,而不是你的vps真的连不上腾讯或者Google(这种情况也常出现在学校邮箱收不到境外邮件一个道理)。

解决办法也很简单,就是收购腾讯

一般只有你的域名是.com或者.cn这样的才有可能被认可。所以更换域名应该是个可行的解决方案