Docker自建Email服务器 - 私人邮件系统
搭建Email服务,该方法适用于个人,公司或组织
备注:这是我找到唯一简便安装且能正常使用的邮件系统,请留言告诉我你是否有更好的自建解决方案。
踩了很多的坑,经历了一个月左右的时间,才测试收发邮件成功(部分邮箱目的地无法达到,由于互联网上的反垃圾邮件策略),持续更新完善中.
2024年3月18日 新增章节:“维护定时任务”
2024年3月22日 新增章节:“SMTP服务测试” 并修正spf的DNS设置内容;关注到另外一个备选方案:Stalwart Mail Server(All-in-One 邮件服务器)
下一步:朋友提出新需求:如何批量发送邮件?
怎么用
日常收发邮件
- 通过搭建邮件服务来收发你自己域名下的邮件
第三方平台(或自己搭建的服务)上需要设置的SMTP服务(SMTP邮箱设置)邮件通知/告知
相关内容
实现方法
iRedMail Docker搭建
iRedMail docker-compose.yml
1 | version: '3.9' |
Docker启动后,假如一切正常则调试信息类似于:
一切启动正常后,可以开始设置DNS记录,然后端口映射出防火墙。
最后可用系统自带的WEB网页客户端来收发邮件,或使用Outlook等客户端配置SMTP,POP3来收发邮件
设置DNS
Your DNS MX record should point to this value
设置DNS项范例:
| DNS类型 | DNS记录名 | 内容/值 | 说明/备注 |
DNS类型 | DNS记录名 | 内容/值 | 备注/说明 |
---|---|---|---|
MX | carlzeng.com. | mail.carlzeng.com. | 标识邮件服务器名称,DNS MX entry |
A | mail.carlzeng.com. | *.8.18.* | 邮件服务器的IP地址 |
TXT | carlzeng.com. | v=spf1 mx -all | SPF entry/记录 |
TXT | dkim._domainkey.carlzeng.com. | v=DKIM1; k=rsm; p=* | DKIM entry/记录,含DKIM公钥public key,详见下方如何在docker中用命令获取这个内容值 |
TXT | dmarc.carlzeng.com | v=DMARC1; p= reject; rua=* | DMARC entry/记录 |
问:三个TXT记录不知道怎么从iRedMail邮件系统中获取?
答:After installation: Setup DNS records for your iRedMail server (A, PTR, MX, SPF, DKIM, DMARC)
假如想要检测DNS记录的正确性,可以使用:https://mxtoolbox.com/
SPF entry/记录
v=spf1 mx a:mail.carlzeng.com -all
根据SMTP测试报告,这条记录可能存在错误
v=spf1 a mx include:_spf.google.com ~all
CF中编辑DNS记录后使用dig检测:
1 | % dig carlzeng.com txt |
大约半小时时间,修改过后的spf记录仍然没有得到更新,持续关注中….
纠正了这条spf相关的DNS记录以后,测试SMTP;显示成功:
DKIM entry/记录
关于如何获取dkim._domainkey.mydomain.com.的内容/值,举例:
1 |
|
DMARC entry/记录
1 | v=DMARC1; p=reject; sp=none; adkim=s; aspf=s; rua=mailto:postmaster@carlzeng.com; ruf=mailto:postmaster@carlzeng.com |
端口映射
这个步骤的作用是让路由器上接收到的邮件相关的数据,都转发给正确的邮件服务系统。
外部端口 | 内部NAS/Mail主机端口 | 说明 |
---|---|---|
‘587:587’ | ||
‘465:465’ | ||
‘25:25’ | ||
‘993:993’ | ||
‘143:143’ | ||
‘995:995’ | ||
‘110:110’ | ||
4433 | 4433 | 添加到443端口的访问可能 |
将这些端口一一对应,很庆幸这些端口还没有被ISP屏蔽;
SMTP设置发邮件
比如在佰阅发卡kamifaka中设置邮箱信息,用于消息通知之邮箱通知。
错误:无法成功到达邮件目的地
解决办法:详见‘错误及解决办法’的章节:SMTP服务测试
调整了SPF的那条DNS记录(第二天发现生效),再次测试;可以正常发送测试邮箱。
错误及解决方法
Docker启动错误:”Permission denied”
iRedMail | /usr/sbin/mysqld: Can’t create file ‘/var/lib/mysql/mysqld.err’ (errno: 13 “Permission denied”)
iRedMail | 2024-02-28 16:12:07 0 [ERROR] mysqld: Can’t create/write to file ‘/var/lib/mysql/aria_log_control’ (Errcode: 13 “Permission denied”)
解决办法:
chmod 777 -R /volume2/KingchuxingSSD512G/docker/compose/iRedMail
chmod 777 -R /volume2/KingchuxingSSD512G/docker/compose/iRedMail/mysql/
DNS设置错误之No DMARC Record found
错误列表检测自:https://mxtoolbox.com/emailhealth/carlzeng.com/
Category | Host | Result | ||
---|---|---|---|---|
dmarc | carlzeng.com | No DMARC Record found | More Info | |
blacklist | mail.carlzeng.com | Blacklisted by UCEPROTECTL3 | More Info | |
mx | carlzeng.com | No DMARC Record found | More Info |
错误解决:
原来DNS记录的名称搞错了,正确的dmarc DNS记录名必须是(含下划线):_dmarc
iredadmin操作不携带端口错误
操作的后台https://iredmail.carlzeng.com:3/iredadmin,当提交新的确认操作时,页面跳转到未携带端口状态
错误解决:
没有解决自动携带端口的问题,等待docker重启后继续测试
icloud通信受阻rejected due to listing in Spamhaus PBL
host mx01.mail.icloud.com[17.56.9.31] said: 550
5.7.1 Mail from IP 111.197.216.113 was rejected due to listing in Spamhaus
PBL. For details please see
http://www.spamhaus.org/query/bl?ip=111.197.216.113 (in reply to RCPT TO
command)
解决办法:
去给定的IP AND DOMAIN REPUTATION CHECKER网站上提交解封申请,提交成功后,如图:
程序发邮件被自我拦截为SPAM
从网站平台配置的SMTP,程序发邮件被自我拦截为SPAM;
1 | Spam scanner report: |
解决办法: 未知,如何关闭自己对自己发邮件的过度SPAM检测(邮件不是SPAM,系统误判)。。。
- https://docs.iredmail.org/disable.spam. … mails.html
- https://docs.iredmail.org/completely.di … assin.html
docker exec -it iRedMail bash
没有找到这个文件:/etc/amavis/conf.d/50-user
1 | # @bypass_virus_checks_maps = (1); # controls running of anti-virus code |
Restarting Amavisd service is required after changing settings.
1 | > service amavis restart |
environment:
TZ=Asia/Shanghai
发现:使用最初的账户没有这个误判的情况。
是否可删除mail.**的DNS记录?
由于设定了泛域名解析道正确的IP ,目前增加的这条mail.carlzeng.com反而增加了DDNS需要去轮询更新IP的任务数,没有这条DNS解析,直接ping mail.* 也一样得到最新且正确的IP地址。
待实践核实/测试… (理论上没问题,因为iodine已经成功删除/优化掉A记录)
维护定时任务
每天邮箱中都收到6封系统自动备份的邮件:
1 | Cron <root@c7e4835b8e6d> /bin/bash /var/vmail/backup/backup_mysql.sh |
进入docker
1 | docker exec -it iRedMail bash |
注释掉
1 | #40 3 * * * /bin/bash /var/vmail/backup/backup_mysql.sh |
感受:去掉这些每天的自动备份功能以后,清爽许多 :-)
尴尬的是,这种进bash编辑的方式,重启整个NAS后,编辑的内容会重置,还得再去编辑….
这次NAS运行81天多才重启一次,暂且用这种收邮件的方式就知道docker中的内容被恢复了。
纠正邮件系统的时区
修改docker-compose文件,在volumes下面新增这条,可纠正邮件系统的时区:
- “/etc/localtime:/etc/localtime:ro” #这条可纠正邮件系统的时区
SMTP服务测试
优点:实时显示详细的debug日志。赞!
Email Check Spam Score and Improve Quality
优点:可以检测出详细的DNS配置错误(如果有错误的话),并给出修正的建议。赞!
iredMail证书配置
Using http://www.checktls.com/, it’s clear that the Zendesk TLS cert is incorrect in that it doesn’t specify that mail.pod-4 host.
从这点来看,可能是自签证书的问题?那么如何替换和生成一个证书呢?
测试配置步骤:
- 下载NPM中生成的泛域名证书,得到certificate.zip,解压缩一共是4个文件。
- 上传fullchain.pem 和 privkey.pem 到 映射的目录中(/KingchuxingSSD512G/docker/compose/iRedMail/ssl),分别重命名为iRedMail.crt 和 iRedMail.key。再重新上传一遍(备份原文件名)
- 测试https://www.ssllabs.com/ssltest/index.html 和 https://www.checktls.com/
本章节参考:
Request a free cert from Let’s Encrypt (for servers deployed with downloadable iRedMail installer)
确保证书是: mail.carlzeng.com
使用dns challenge的方式,dns_cloudflare_api_token
Processing… This might take a few minutes.
https://dash.cloudflare.com/profile/api-tokens
> Global API Key
fail to get the cert by dns challenge
成功了,原来不是使用Global API KEY;要使用”API 令牌”中的‘创建令牌’ 》 编辑区域 DNS
cp mail.jbritian.com_bundle.crt cert.pem
cp mail.jbritian.com_bundle.crt combined.pem
cp mail.jbritian.com.key key.pem
cert1.pem 重命名成: cert.pem
fullchain1.pem 重命名成:combined.pem
privkey1.pem 重命名成:key.pem
1 | ln -s /etc/letsencrypt/live/mail.mydomain.com/fullchain.pem /etc/ssl/certs/iRedMail.crt |
都检查过这些组件了,确实都是映射到容器中的 /opt/iredmail/ssl 目录中的三个文件
1 | Postfix |
TXT记录变更:
v=spf1 a mx include:_spf.google.com ~all
v=spf1 mx -all
以下为踩坑记录(请跳过)
docker-mailserver
docker-compose.yml (docker-mailserver)
1 | services: |
docker-compose up 测试中…
下一步要生成配置文件?
docker exec -ti mailserver setup
1 | mailserver | [ WARNING ] You need at least one mail account to start Dovecot (120s left for account creation before shutdown) |
docker exec -ti mailserver setup email add service@carlzeng.com
解决办法:未知
文档信息:
https://github.com/docker-mailserver/docker-mailserver?tab=readme-ov-file
https://docker-mailserver.github.io/docker-mailserver/latest/
postfix and postfixadmin
docker-compose for postfix and postfixadmin
postfixadmin
Postfix Admin is a web based interface to configure and manage a Postfix based email server for many users.
1 | version: '3' |
Where to file issues:
https://github.com/postfixadmin/docker/issues
还差一个靠谱可用的postfix
https://gitlab.com/tozd/docker/postfix
https://gitlab.com/tozd/docker/mail
https://hub.docker.com/r/tozd/postfix
Ports
25/tcp
: SMTP port.465/tcp
: SMTPS port.587/tcp
: Mail submission port.
alpine-316`: Postfix 3.7.6
https://hub.docker.com/search?q=postfix
另外一个是:https://github.com/catatnight/docker-postfix
Note:这是我找到唯一简便安装且能正常使用的邮件系统,请留言告诉我你是否有更好的自建解决方案。
感谢列表
Running iRedMail E-Mail Server in Docker
Setup DNS records for your iRedMail server (A, PTR, MX, SPF, DKIM, DMARC)
From zero to full mail server in 20 minutes with Mailu Docker images!