自建邮局 | 邮箱服务搭建教程

Debian 12 /11/ 安装 Docker

 

使用官方源安装 Docker

apt update
apt upgrade -y
apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates

配置Docker的GPG和APT

curl -sSL https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://download.docker.com/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

 

安装 Docker CE

 

apt update
apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

此时可以使用 docker version 命令检查是否安装成功:

 

docker version

 

如何擦看容器ip

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mailer

 

 

容器端口映射管理

 

如何删除这个容器的 80 和443 端口映射

查看当前容易有哪些端口映射

docker container port mailer

如何删除这个容器的 80 和443 端口映射

停止容器:

docker container stop mailer

删除已经停止的容器:

docker container rm mailer

重新运行容器时不指定要删除的端口:

 

docker run --name mailer -d \
    --restart unless-stopped \
    --hostname "mail.supeweus.com" \
    --publish 25:25 \
    --publish 110:110 \
    --publish 143:143 \
    --publish 465:465 \
    --publish 587:587 \
    --publish 993:993 \
    --publish 995:995 \
    --publish 4910:4910 \
    --env "TZ=Asia/Shanghai" \
    --env "DISABLE_CLAMAV=TRUE" \
    --env "DISABLE_RSPAMD=FALSE" \
    --env "DISABLE_ROUNDCUBE=FALSE" \
    --volume ./mailer:/data \
    analogic/poste.io

如何让 mailer 和 容器绑定

sudo sh -c 'echo "172.17.0.2 mailer" >> /etc/hosts'

debian 11 vim 中文粘贴乱码

export LC_ALL=C.UTF-8

echo ":set encoding=utf-8" >> ~/.vimrc

 

检查容器的服务状态

 

使用 docker ps 命令查看正在运行的容器列表

进入该容器的命令行界面,查看容器内部的运行状态

docker exec -it mailer bash

在容器内部,检查 Poste.io 服务的运行状态:

ps aux | grep postfix
ps aux | grep dovecot

 

感谢     u.sb/debian-install-docker/

 

邮局搭建主体

邮局特性

SMTP + IMAP + POP3 + 反垃圾邮件 + 防病毒 + Web 管理 + Web 电子邮件

SPF、DKIM、DMARC、SRS 的原生实现

邮局要求

有独立IP

支持25端口及邮件发

建议内存2Gb以上

 

dns配置

 

记录类型  TYPE 主机记录HOSTNAME 记录值ADDRESS / VALUE
MX @或者your-domain.com mail.your-domain.com
A mail.your-domain.com 1.2.3.4 (your ip)
CNAME imap.your-domain.com mail.your-domain.com
CNAME smtp.your-domain.com mail.your-domain.com
CNAME pop.your-domain.com mail.your-domain.com
TXT @或者your-domain.com v=spf1 mx ~all
TXT _dmarc v=DMARC1; p=none; pct=100; rua=mailto:mail@your-domain.com
TXT _s20240910378._domainkey.your-domain.com k=rsa;p=MII.........

最后还需要到 VPS 服务商处添加一个反向 DNS,也就是 rDNS 解析,把 IP 解析到 mail.your-domain.com 这个邮件域名就好了,这个为可选项,有些 VPS 商家不提供这种服务。

设置DKIM验证

在poste后台 - Virtual domains - 点击对应域名 - DKIM key - 创建key,并按照要求设置txt记录解析。

设置PTR反向解析

PTR记录,是电子邮件系统中的邮件交换记录的一种;另一种邮件交换记录是A记录(在IPv4协议中)或AAAA记录(在IPv6协议中)。PTR记录常被用于反向地址解析。

域名解析到IP被称为正向解析,而IP指向到域名,则被称为反向解析,

反向解析需要在主机服务商处进行操作

添加SPF/DKIM/PTR解析,可提高邮件可信度,从而降低邮件进入垃圾箱的几率,必不可少的关键步骤。

设置TLS SSL

假如您的邮件域名为mail.your-domain.com,需要对这个域名申请SSL证书,可参考《使用acme.sh申请ZeroSSL泛域名证书,Let’s Encrypt替代品》或者在其它服务商申请SSL证书。

获得SSL证书后,打开poste后台 - System settings - TLS Certificate - 选择证书文件进行上传,见截图。

 

参考  watch?v=1Jr8MTNt4yE

 

启动容器

docker run --name mailer -d \        # mailer 为容器的名字 -d: 指定容器以后台模式运行(即守护态)。
    --restart unless-stopped \       #  设置容器的重启策略为除非显式停止,否则重启。
    --hostname "mail.your-domain.com" \  #  设置容器的主机名为 "mail.your-domain.com"
    --publish 80:80 \                 # 使用nginx,前端反代,可以不要这两行
    --publish 443:443 \               # 使用nginx,反代,可以不要这两行
    --publish 25:25 \                 # SMTP    外部 到 容器的端口映射
    --publish 110:110 \               # POP3
    --publish 143:143 \               # IMAP
    --publish 465:465 \               # SMTPS
    --publish 587:587 \               # SMTP STARTTLS
    --publish 993:993 \               # IMAPS 服务端口
    --publish 995:995 \               # POP3S 服务端口
    --publish 4910:4910 \             # 远程筛子设置
    --env "TZ=Asia/Shanghai" \         # 设置时区
    --env "DISABLE_CLAMAV=TRUE" \      # 禁用ClamAV反病毒功能,可大幅减低内存CPU占用
    --env "DISABLE_RSPAMD=FALSE" \     # 不要禁用Rspamd反垃圾邮件功能,可大幅减低内存CPU占用
    --env "DISABLE_ROUNDCUBE=FALSE" \  # 不要禁用WEB收发功能,非必要不建议禁止
    --volume /mailer:/data \           # 主机上的 /mailer 目录挂载到容器内的 /data 目录。这个选项允许在容器内持久化保存数据,例如邮箱数据、配置文件等。  
    analogic/poste.io                  # 指定容器的镜像为 "analogic/poste.io",这是一个预配置了邮件服务器的 Docker 镜像,用于快速搭建邮件服务。

进入系统系统配置

最重要输入  mail.your-domain.com

 

邮件所有端口都支持 SSL加密

 

system settings ---》 TLS certificate --》change certificate settings --》  enabled -

-->  common name : mail.your-domain.com

--> Alternative names : imap.your-domain.com, smtp.your-domain.com,pop.your-domain.com

--> then , Save Change

 

配置邮件客户端

第三方客户端 SMTP/IMAP/POP3 配置
协议 服务器地址 端口 SSL
SMTP mail.your-domain.com,smtp.your-domain.com 25, 465, 587 STARTTLS
IMAP mail.your-domain.com,imap.your-domain.com 993, 143 STARTTLS
POP3 mail.your-domain.com,pop.your-domain.com 995, 110 STARTTLS

参考  www.nodeseek.com/post-20417-1

参考  cloud.tencent.com/developer/article/2072016

参考  www.xiaowangc.com/archives/bd4820af.html 来源: 尤妤

 

代理 web界面 

这是完整的nginx代理配置,请注意你需要将mailer连接到web服务所在的容器,才能使用$scheme://mailer进行反向代理,否则请使用mailer容器的ip地址。

使用脚本时,请注意修改里面的域名和证书路径。文件必须保存为UTF-8编码。

server {

    listen 80;
    listen [::]:80;

    listen 443 ssl ;
    listen [::]:443 ssl ;
    ssl_certificate certs/mail.pem;
    ssl_certificate_key certs/mail.key;

    server_name mail.your-domain.com;

    location / {

        proxy_pass https://172.17.0.2;
        # proxy_pass $scheme://mailer;
        proxy_set_header Host $host;
        # real-ip
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        # websocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_read_timeout 86400;
        ## replace content ##
        sub_filter_once  off;
        sub_filter '撰写新邮件' '写信';
        sub_filter 'Dark mode' '深色';
        sub_filter 'Light mode' '浅色';
        sub_filter '[Administration]' '控制台';
        sub_filter '>Administration<' '>控制台<';
        sub_filter 'Trusted Senders' '可信发件人';
        sub_filter 'Collected Recipients' '收件人集合';
        sub_filter '</style>' '\n.pro,.brand,.nav-sidebar p.alert{display:none !important}\n</style>';
    }
}

 

惊喜彩蛋

细心的小伙伴应该发现了,nginx代理配置中有一段sub_filter代码。这就是我要说的彩蛋:

隐藏付费的pro菜单,使界面更加清爽。
修改部分WEB收发界面的英文菜单或描述。

感谢 :  www.rehiy.com/post/509/

 

root@i-049dfde96baf12919:~# nginx -V | grep quic
nginx version: nginx-n.wtf/1.25.4
built with OpenSSL 3.2.1 30 Jan 2024
TLS SNI support enabled

configure arguments: 
--with-cc-opt='-g -O2 -ffile-prefix-map=/build/nginx=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' 
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' 
--with-openssl=/build/nginx/../openssl 
--prefix=/usr/share/nginx 
--conf-path=/etc/nginx/nginx.conf 
--http-log-path=/var/log/nginx/access.log 
--error-log-path=/var/log/nginx/error.log 
--lock-path=/var/lock/nginx.lock 
--pid-path=/run/nginx.pid 
--modules-path=/usr/lib/nginx/modules 
--http-client-body-temp-path=/var/lib/nginx/body 
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi 
--http-proxy-temp-path=/var/lib/nginx/proxy 
--http-scgi-temp-path=/var/lib/nginx/scgi 
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi 
--with-compat 
--with-debug 
--with-pcre-jit 
--without-pcre2 
--with-http_ssl_module 
--with-http_stub_status_module 
--with-http_realip_module 
--with-http_auth_request_module 
--with-http_v2_module 
--with-http_v3_module 
--with-http_dav_module 
--with-http_slice_module 
--with-threads 
--with-http_addition_module 
--with-http_flv_module 
--with-http_geoip_module=dynamic 
--with-http_gunzip_module 
--with-http_gzip_static_module 
--with-http_image_filter_module=dynamic 
--with-http_mp4_module 
--with-http_perl_module=dynamic 
--with-http_random_index_module 
--with-http_secure_link_module 
--with-http_sub_module 
--with-http_xslt_module=dynamic 
--with-mail=dynamic 
--with-mail_ssl_module 
--with-stream=dynamic 
--with-stream_geoip_module=dynamic 
--with-stream_ssl_module 
--with-stream_ssl_preread_module 
--add-module=/build/nginx/sb-modules/ngx_brotli 
--add-dynamic-module=/build/nginx/debian/modules/http-headers-more-filter 
--add-dynamic-module=/build/nginx/debian/modules/http-auth-pam 
--add-dynamic-module=/build/nginx/debian/modules/http-cache-purge 
--add-dynamic-module=/build/nginx/debian/modules/http-dav-ext 
--add-dynamic-module=/build/nginx/debian/modules/http-ndk 
--add-dynamic-module=/build/nginx/debian/modules/http-echo 
--add-dynamic-module=/build/nginx/debian/modules/http-fancyindex 
--add-dynamic-module=/build/nginx/debian/modules/http-geoip2 
--add-dynamic-module=/build/nginx/sb-modules/ngx_http_ipdb_module 
--add-dynamic-module=/build/nginx/debian/modules/nchan 
--add-dynamic-module=/build/nginx/debian/modules/http-lua 
--add-dynamic-module=/build/nginx/debian/modules/rtmp 
--add-dynamic-module=/build/nginx/debian/modules/http-uploadprogress 
--add-dynamic-module=/build/nginx/debian/modules/http-upstream-fair 
--add-dynamic-module=/build/nginx/debian/modules/http-subs-filter

 

 

一些后缀

 

statement@vpass.ne.jp
statement@vpass.ne.jp
statement@vpass.ne.jp
statement@vpass.ne.jp
mail@contact.vpass.ne.jp
mail@contact.vpass.ne.jp
mail@contact.vpass.ne.jp
mail@contact.vpass.ne.jp
mail@contact.vpass.ne.jp
mail@contact.vpass.ne.jp

ol_entry@smbc-card.com
SMBC_service@dn.smbc.co.jp

noreply@np-reply-contact-239.co.jp
no-reply@robinkamalmd.com
no-reply@robinkamalmd.com