最近在部署自己的服务器,又想开网站又想做一个自己的邮箱系统,邮箱可以说是把Pmail能踩的坑都踩了一遍,所以写个文章发布一下,希望能帮到使用Pmail的人
在开始之前,要说明几个问题,什么是Pmail,以及为什么要部署Pmail。
Pmail是一个开源邮箱项目,它允许你使用自己的服务器和域名定义一个专属于你自己的独一无二的邮箱系统。
我们常见的邮箱尾缀基本都是qq.com、126.com、163.com、outlook.com、gmail.com等等邮箱,它们代表了所属公司的域名,而Pmail这类个人邮箱服务允许你在服务器上使用自己的域名构建一个专属的邮件域名,例如@moriaruruka.com这个域名,我就可以使用它搭建一个专属于我自己的网站邮箱服务。而且其用户名完全由你自行定义,热门名字被占用了?没关系,这里的每一个用户名都完全由你控制,你喜欢的角色的名字专属于你自己,如果服务器资源充裕还是非常建议搞一个玩的。
为什么要部署Pmail而不是其他的邮箱服务。答案很简单,那就是Pmail超低的占用,只有20几M的服务器内存占用,对配置不高的服务器来说非常友好,不会占用服务器本身太多的存储资源就能获得响应的服务,如果你想要节省宝贵的服务器资源,又尽可能多的扩展服务,Pmail是一个不错的选择。
除去上述的低占用之外,Pmail部署还有一个绝佳的好处就是你可以隐藏自己真正的私人电子邮件地址!
例如,你使用iPhone软件通过Apple ID登录了一个应用或者网站,Apple允许你通过设置一个隐藏电子邮箱的方式登录而保护你真正的iCloud邮箱地址。
另外,在注册一些可能的推送服务网站时,私人邮件服务可以在隐藏你的私人地址的同时允许你完成注册,使用服务而不用担心自己的邮件地址暴露。总之就是隐私,安全,值得用用。
接下来进入正题,在部署Pmail之前,你需要知道一些事情,这是必须的前提条件,否则Pmail使用不会非常完美,甚至可能运行起来失败。
一、前提条件
- 请确保你的服务器开放25端口出站流量,这是SMTP的基础端口
- 确保你的服务器开放邮件服务端口,包括25、465、995、110、993、143,它们是邮件服务的基础
- 确保你的服务器拥有公网IP,同时该IP所在IP段没有被邮件黑名单记录商加入黑名单,否则你的请求包可能会被直接丢弃导致timeout。
关于25端口出站:25端口通常会被你的云服务提供商封锁,比如阿里云,腾讯云都会对服务器的25端口出站流量进行封锁,另外,以我使用的腾讯云为例,如果你使用的是 轻量应用服务器,那么你无法申请开放25端口,所以尽量避免使用此类型的服务器部署私人邮箱服务。对于包年包月的阿里云服务器ECS,腾讯 云服务器 可以申请开放25端口。但是不要直接用25端口发SMTP,会被封,而且不给你解….
开放端口:这个在你服务器的购买商处操作,一般服务器都会有防火墙,功能等同于你服务器的防火墙设置,在这里开放端口就可以了,记得添加备注,一般来说一个服务器运行的服务多了之后你需要记得每个端口的功能,如果又不需要的端口,记得及时关闭。
公网IP:这个大家买了服务器都会有的,不用担心。主要说一下IP黑名单的问题。因为你的IP有很多机器用过,所以可能会在黑名单里。大家可以去必应搜索邮件黑名单,输入你的域名,查找有没有黑名单,有的话去对应的服务商官网申请解禁,一般来说不会要求你很多,申请并发一封验证邮件就可以。这一步建议在搭建好PMAIL后执行,且确保你的PMAIL能正常收信,因为要求的收信邮箱可能不允许免费邮箱,比如gmail, outlook这种,用你自己新建立的PMAIL就可以。
二、部署
pmail的部署需要使用docker,所以请确保你的服务器安装了docker,使用此命令验证。
docker
如果没有docker,请通过如下命令安装(如果你选的是初始带有宝塔面板的LINUX服务器,一般都是不用安装的,自带docker,直接用就行,如果需要部署,请确认你的linux包管理器是apt,yum还是其他的管理器,否则命令不对,sudo命令用于提升权限,避免权限问题导致安装失败,这里用的yum命令。)
sudo yum install docker.io sudo yum install docker-compose
安装后通过docker拉取镜像并安装Pmail容器(docker容器名是分大小写的,注意后续使用命令不要搞混)。
docker pull ghcr.io/jinnrry/pmail:latest
#新建工作目录 mkdir pmail #进入工作目录 cd pamil
运行docker安装
需要注意的是,这里你的80端口和443端口可能会被Nginx接管,也就是端口冲突,你可以选择将这两个端口映射到一个高位端口8000->80,8443->443以解决端口映射问题,格式是你的主机端口 : 容器端口
docker run -p 25:25 -p 8000:80 -p 8443:443 -p 110:110 -p 465:465 -p 995:995 -v $(pwd)/config:/work/config ghcr.io/jinnrry/pmail:latest
运行成功后,系统会提示你可以通过访问127.0.0.1:80这个本地回环地址来进行配置,我们也可以通过公网访问你的服务器ip+8000端口号的形式使用你的浏览器访问并配置
接下来就是跟着流程走了,因为我自己已经部署过了,所以这里用几张网图代替一下

在数据库设置这里,Pmail支持SQLITE3和Mysql,如果你在指定的文件夹下建立了数据库,可能容器访问不到,你得给这个数据库做一下映射,具体方法可以必应/Google或者问大D老师(DeepSeek)一般都能解决,因为每个人的配置不一,所以这一步需要自己配置。

密码设置这里,账户名可以默认,这是你的管理员账户,后续也可以新建别的账户,这个保持默认就好,密码自己搞一个,可以直接大写的PMAIL,没有要求,务必得记住。

域名这里,需要你填写的域名很简单,一个是控制面板的域名,一个是smtp服务器的域名,请注意:这里的域名务必确保通过ICP备案,否则会403,这在后边SSL申请会出问题。
你购买的域名是顶级域名,你可以在前面加其他的任意名字的二级域名,它都属于你,这里的只需要填写你的顶级域名即可。

接下来需要配置你的DNS解析。这里需要前往你购买域名的服务商,比如百度云,腾讯云,阿里云,哪里买的域名去哪里,买域名会提供DNS解析服务,根据PMAIL给你提供的参数一步步添加DNS解析。

接下来需要配置SSL,一般来说,如果你的服务器的25口没有禁用并且80口没有NGINX代理在运行的话,等会儿自己就好了,但是,如果你建过网站,服务器中又Nginx在运行,这里就比较难绷了。
首先,你要确保自己的DNS解析正常,smtp\imap\pop\pmail这四个子域名需要都PING的通同时完成备案。然后,你需要确保外部的流量被正确的导向docker容器,因为此时你服务器的80端口是被Nginx接管监听的,你的Docker容器无法访问,这时候证书就会超时失败。
如果你的服务器预装了宝塔面板以及支持AI智能操作,你可以让它帮你创建新的Nginx配置文件以重定义代理规则,我的配置文件在如下目录中。
/www/server/panel/vhost/nginx
接下来做一个配置文件参考,大家可以参考此法则设置Nginx配置文件,让80端口流量转发到docker容器
imap
server {
listen 80;
server_name imap.moriaruruka.com;
# 处理Let's Encrypt ACME HTTP-01验证请求
location /.well-known/acme-challenge/ {
proxy_pass http://localhost:8000;
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;
}
# 其他请求也代理到pmail容器
location / {
proxy_pass http://localhost:8000;
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;
}
}
POP
# 反向代理配置,将请求转发到pmail容器
server {
listen 80;
server_name pop.moriaruruka.com;
location /.well-known/acme-challenge/ {
proxy_pass http://localhost:8000;
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;
}
location / {
proxy_pass http://localhost:8000;
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;
}
}
SMTP
server {
listen 80;
server_name smtp.moriaruruka.com;
# ACME HTTP-01 验证文件路径
location /.well-known/acme-challenge/ {
proxy_pass http://localhost:8000;
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;
}
# 其他请求也代理到Pmail容器
location / {
proxy_pass http://localhost:8000;
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;
}
}
Pmail面板(转发到回环地址依旧需要启用HTTPS,否则Chrome判定比较严格的话会直接拦截你的请求)
# 反向代理配置,将 pmail.moriaruruka.com 的请求转发到 pmail 容器
server {
listen 80;
server_name pmail.moriaruruka.com;
# ACME HTTP-01 验证文件路径 - 代理到PMAIL容器处理
location /.well-known/acme-challenge/ {
proxy_pass http://127.0.0.1:8000;
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;
}
# 其他请求转发到 pmail 容器
location / {
proxy_pass http://127.0.0.1:8000;
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;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
# HTTPS 反向代理配置
server {
listen 443 ssl http2;
server_name pmail.moriaruruka.com;
# SSL 证书配置 - 使用PMAIL容器内生成的证书
ssl_certificate /data/pmail/config/ssl/public.crt;
ssl_certificate_key /data/pmail/config/ssl/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 代理配置
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;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
配置成功后会自动跳转pmail.你的域名,如果正常跳转看到界面,说明配置正常,如果浏览器拦截了,应该是你的证书有问题导致的,所以可能需要重新配置证书。
三、问题和结束
这时配置已经基本上完成了,如果你的服务器封锁不严格从安装DOCKER开始并且没有NGINX代理,应该都是正常的。接下来就是测试收发邮件,一般来说,如果你的服务器预装了这些程序,并且有25口限制,你应该只能发送126/163的邮件,其他的outlook\gmail\qq\icloud全都发不了,这些邮件地址的握手依旧会用到25口出站建立SMPT,然而你的25口是挂的,所以没卵用,你要访问对方的25口,自己反代理也没用,加一个中继服务器,那为什么不一开始就选那台服务器呢,所以,这个问题无解。。。
至于其他的问题,无法接收邮件应该依旧是网络问题或者证书问题,基本绝大部分的Pmail问题都在网络和证书上,我第一次搭只手申请了Pmail面板的证书,POP,SMTP,IMAP都没申请,自然没法收到邮件,所以这里十分建议大家通过PMAIL自动申请域名SSL证书,这样证书不会有问题,至少你的收信功能不会有太多的问题。另外Pmail的github项目ISSUE支持大多都是中文提问,很方便大家快速查找定位问题。
到这里大概配置就结束了,如果不明白可以先去github查找自己的问题,基本上都能解决,部署Pmail证书和网络是主要问题,其他的并不太严重,程序自身很少出问题的。
