使用docker-mailserver搭建轻量邮件服务器
自建email服务器的一个好处是可以无限发邮件,而qq邮箱 163邮箱等一般都有每日发送上限。
docker-mailserver是一个轻量级的邮件服务器,一般只用来发送邮件,接收邮件的推荐做法是通过设置额外邮箱转发到指定的邮箱,比如你自己的qq邮箱。
目前最新版本是10.4.0,日常占用仅100M+,缺点是没有web管理界面,管理邮箱账户只能通过命令行
需要准备好一个域名,假设为mail.my.com,有步骤需要到dns设置mail._domainkey的txt记录,这样发送的邮件才不会被标记为垃圾邮件。
新建目录
新建目录dms,然后再dms下新建config mail-data mail-logs mail-state目录
mkdir dms cd dms mkdir config mail-data mail-logs mail-state
cd ..
添加邮箱账户
将刚刚新建的目录./dms/config映射到/tmp/docker-mailserver, 添加邮箱admin@mail.my.com 密码456asdqwe
docker run --rm -v $PWD/dms/config:/tmp/docker-mailserver/ mailserver/docker-mailserver setup email add admin@mail.my.com 456asdqwe
设置转发邮箱 xxx@qq.com, admin@my.com收到的邮件都会自动转发到xxx@qq.com
docker run --rm -v $PWD/dms/config:/tmp/docker-mailserver/ mailserver/docker-mailserver setup alias add admin@mail.my.com xxx@qq.com
创建dkim和设置txt记录
docker run --rm -v $PWD/dms/config:/tmp/docker-mailserver/ mailserver/docker-mailserver setup config dkim
此步骤会生成dms/config/opendkim/keys/mail.my.com/mail.my.com.txt文件,可以使用cat输出文件内容
cat dms/config/opendkim/keys/mail.my.com/mail.my.com.txt
输出内容大概如下
然后到dns管理界面去添加一条txt记录 如图所示, 类型选择TXT, 名称输入mail._domainkey, 内容复制上一步文件中的部分内容,注意大体格式是v=DKIM1;h=sha256;k=rsa; p=xxxxxx
每次只复制引号内的内容然后粘贴到dns管理界面就行。
配置完毕可以通过dig mail.my.com TXT来测试dns配置是否已经生效
结果里有一行是mail.my.com 300 IN TXT "v=DKIM1; h=sha256; k=rsa; p=xxx"就说明配置正确,注意里边是否有\",这就表示多复制了引号进去
通过docker-compose启动
新建docker-compose.yml如下
version: '3.8'
services:
mailserver:
image: mailserver/docker-mailserver
container_name: mailserver
hostname: mail.my.com
domainname: mail.my.com
ports:
- "25:25"
- "587:587"
- "465:465"
volumes:
- ./dms/mail-data/:/var/mail/
- ./dms/mail-state/:/var/mail-state/
- ./dms/mail-logs/:/var/log/mail/
- ./dms/config/:/tmp/docker-mailserver/
- /etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/mail.my.com/:/etc/letsencrypt/
- /etc/localtime:/etc/localtime:ro
environment:
- ENABLE_FAIL2BAN=1
- SSL_TYPE=manual
- SSL_CERT_PATH=/etc/letsencrypt/mail.my.com.crt
- SSL_KEY_PATH=/etc/letsencrypt/mail.my.com.key
# Allow sending emails from other docker containers
# Beware creating an Open Relay: https://docker-mailserver.github.io/docker-mailserver/edge/config/environment/#permit_docker
- PERMIT_DOCKER=network
# All env below are default settings:
- DMS_DEBUG=0
- ONE_DIR=1
- ENABLE_POSTGREY=0
- ENABLE_CLAMAV=0
- ENABLE_SPAMASSASSIN=0
# You may want to enable this: https://docker-mailserver.github.io/docker-mailserver/edge/config/environment/#spoof_protection
# See step 8 below, which demonstrates setup with enabled/disabled SPOOF_PROTECTION:
- SPOOF_PROTECTION=0
cap_add:
- NET_ADMIN # For Fail2Ban to work
- SYS_PTRACE
注意我这里用的是自定义证书,通过caddy申请let's encrypt证书,修改了数据目录位置,将证书放到了/etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory下。
所以这里把对应域名的目录映射进去,然后通过SSL_CERT_PATH和SSL_KEY_PATH指定证书位置。官方文档有更多关于ssl证书申请和配置的相关信息。如果是通过云服务商提供的ssl证书直接放到配置的目录下指定路径即可
映射了25(SMTP) 587(ESMTP ) 465(ESMTP ) 端口,记得安全组里要开放这几个端口
最后执行docker-compose up -d就成功启动邮件服务器了,通过smtp就能正常发送邮件了
在grafana、kibana之类的应用就可以配置smtp邮件通知了。