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

posted @ 2023-08-31 11:30  厚礼蝎  阅读(131)  评论(0编辑  收藏  举报