docker部署mailman3
Mailman 3的核心目标是提供一个灵活、可扩展且现代化的电子邮件列表管理解决方案,使组织能够更好地管理订阅者、发送和接收电子邮件列表,以及与订阅者进行交互。
基于官方提供的docker部署方法部署
官方文档
物理环境
key | value |
---|---|
主机系统 | ubuntu22.04 |
主机IP | 192.168.140.41 |
解析域名
这里是直接设置主机为邮件服务器,所以需要解析邮件域名
这里需要解析成公网地址
假设公网地址是1.1.1.1
这里的域名是 mail.top
mail A 1.1.1.1
mail IN MX 10 mail.top.
mail TXT "v=spf1 include:mail.top mx ip4:1.1.1.1 -all"
下载
下载地址
下载后
解压到 /opt
并将解压的文件夹名改为mailman
修改资源清单文件
修改docker-compose.yaml
文件
version: '2'
services:
mailman-core:
image: maxking/mailman-core:0.4 # Use a specific version tag (tag latest is not published)
container_name: mailman-core
hostname: mailman-core
volumes:
- /opt/mailman/core:/opt/mailman/
stop_grace_period: 30s
links:
- database:database
depends_on:
- database
environment:
- DATABASE_URL=postgresql://mailman:mailmanpass@database/mailmandb
- DATABASE_TYPE=postgres
- DATABASE_CLASS=mailman.database.postgresql.PostgreSQLDatabase
- HYPERKITTY_API_KEY=ASmallAPIKey
# core容器添加下面的环境变量
- MTA=postfix #使用的MTA是postfix
- SMTP_HOST=192.168.140.41 #是指邮件服务器的ip地址
- SMTP_PORT=25 #设置postfix的端口
ports:
- "127.0.0.1:8001:8001" # API
- "127.0.0.1:8024:8024" # LMTP - incoming emails
networks:
mailman:
mailman-web:
image: maxking/mailman-web:0.4 # Use a specific version tag (tag latest is not published)
container_name: mailman-web
hostname: mailman-web
depends_on:
- database
links:
- mailman-core:mailman-core
- database:database
volumes:
- /opt/mailman/web:/opt/mailman-web-data
environment:
- DATABASE_TYPE=postgres
- DATABASE_URL=postgresql://mailman:mailmanpass@database/mailmandb
- HYPERKITTY_API_KEY=ASmallAPIKey
#web容器中添加下面的环境变量
- SERVE_FROM_DOMAIN=mail.top #邮件服务器域名
- MAILMAN_ADMIN_USER=admin #web界面的管理员用户
- MAILMAN_ADMIN_EMAIL=abcd@163.com #web界面的管理员邮箱,为了后面通过邮箱找回密码
- DJANGO_ALLOWED_HOSTS=192.168.140.41 #添加允许访问的主机,因为是允许宿主机访问容器接口,所以这里是宿主机IP
- SECRET_KEY=ASmallAPIKey #cookie使用的一个key
ports:
- "127.0.0.1:8000:8000" # HTTP
- "127.0.0.1:8080:8080" # uwsgi
networks:
mailman:
database:
environment:
- POSTGRES_DB=mailmandb
- POSTGRES_USER=mailman
- POSTGRES_PASSWORD=mailmanpass
image: postgres:11-alpine
volumes:
- /opt/mailman/database:/var/lib/postgresql/data
ports:
- 5432:5432
networks:
mailman:
networks:
mailman:
driver: bridge
ipam:
driver: default
config:
-
subnet: 172.19.199.0/24
起容器
docker compose up -d
然后就是宿主机上安装postfix
安装 MTA
邮件传输代理 (MTA) 负责在服务器上发送和接收电子邮件。
安装postfix
apt install postfix
安装过程中提示选择 Postfix 配置时,选择“Internet 站点”。
输入您在下一步中为 Mailman 选择的域名。
这里我设置的是mail.top
设置postfix
修改配置文件
vim /etc/postfix/main.cf
# 设置域名
myhostname = mail.top
# 后面需要添加容器的网段以及宿主机的ip地址,否则是会被拒绝发送的
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.140.41 172.19.199.0/24
# 添加下面的部分
unknown_local_recipient_reject_code = 550
owner_request_special = no
# 手动创建文件夹/opt/mailman/core/var/data/
transport_maps =
regexp:/opt/mailman/core/var/data/postfix_lmtp
local_recipient_maps =
regexp:/opt/mailman/core/var/data/postfix_lmtp
relay_domains =
regexp:/opt/mailman/core/var/data/postfix_domains
重启服务
systemctl restart postfix
测试
在服务器上安装 mailutils
包来使用 mail
实用工具。
apt-get install mailutils
发送测试邮件
echo "body of your email" | mail -s "This is a subject" abcd@163.com
可以通过 /var/log/syslog
来查看是否成功
安装nginx
apt install nginx
生成相关证书
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=BJ/O=YourOrg/CN=YourName"
#去除密码
openssl rsa -in server.key -out server_nopwd.key
openssl x509 -req -days 365 -in server.csr -signkey server_nopwd.key -out server.crt
修改配置文件
vim /etc/nginx/sites-available/default
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
#server_name mail.top;
location /static/ {
alias /opt/mailman/web/static/;
autoindex off;
}
location / {
uwsgi_pass localhost:8080;
include uwsgi_params;
uwsgi_read_timeout 300;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server_nopwd.key;
}
重启服务
systemctl restart nginx
然后就可以访问了
https://192.168.140.41