Administrator
发布于 2022-08-26 / 2 阅读 / 0 评论 / 0 点赞

Mailu邮件服务器的搭建

仅限于记录时的软件和环境版本,其他版本和环境均未做过实际测试

前言

搭建许多平台时都避不开用户注册,而用户注册时通常都包含了邮箱回复验证码。虽然自建平台支持使用POP3/IMAP/SMTP等方式授权阿里腾讯等企业邮箱接入平台。但我们也可以选择自建邮箱服务器来接管平台验证码的发送,这样可自定义的程度往往更高。

最近在鼓捣一个维基网站(基于MediaWiki) ,新用户注册时需要接收邮箱验证码,更新维基以及相关的操作提醒都通过邮件发送,因此有一个自建邮件服务器做内容分发也显得更专业。


搭建环境:

服务器物理机:

2核 8G内存 90G ESSD

LNMP环境:

CentOS 7.9.2009 x86_64
Nginx:1.22.0
MySQL:5.7.39
PHP:7.4.30

Docker版本

Docker version 20.10.17, build 100c701

相关链接:

Mailu 文档地址
Mailu Github地址

谷歌邮箱
QQ邮箱

Mailu 是什么?

Mailu是一个简单但功能齐全的邮件服务器,作为一组Docker镜像。它是开源软件。是一款易于安装、易于维护的邮件服务软件

注意: Mailu邮件服务 没有加入用户自注册功能,因此无法像主流邮箱服务一样由用户自己注册邮箱,而是由管理员主动分配账户

主要特点:

  • 标准电子邮件服务器 、IMAP 和 IMAP+、SMTP 和带有客户端自动配置配置文件的提交
  • 高级电子邮件功能 、别名、域别名、自定义路由
  • Web访问 、多个Webmails和管理界面
  • 用户特征 、别名、自动回复、自动转发、提取帐户
  • 管理员功能 、全局管理员、公告、每个域委派、配额
  • 安全 性、强制 TLS、DANE、MTA-STS、Letsencrypt!、传出 DKIM、防病毒扫描程序
  • 反垃圾邮件 、自动学习、灰名单、DMARC 和 SPF

部署 Mailu

1、下载Docker

由于Mailu是基于Docker镜像开发的,其运作基本只能在Docker上作为容器使用,这也使得原本复杂的环境配置变得更加简单。我们需要Docker来部署Mailu

如果您没有使用过或者对Docker的了解较少,对于本文不了解的部分,请参照Docker Linux版官方安装教程

2、 安装数据库

一般都是在Docker内装有数据库,如果不想使用Docker放数据库,也可以使用外部的数据库来做管理
不论是Docker内部还是外部,你都需要创建一个专门的用户如mailu,一个数据库如mailu_db。
示例sql如下所示

创建用户
CREATE DATABASE mailu;
CREATE USER `mailu`@`%` IDENTIFIED WITH mysql_native_password BY `强密码`;
GRANT ALL PRIVILEGES ON mailu.* TO 'mailu'@'%';
FLUSH PRIVILEGES;
创建数据库
CREATE DATABASE [IF NOT EXISTS] <数据库名>

/*字符集名推荐使用utf8mb4*/
[[DEFAULT] CHARACTER SET <字符集名>] 

/*排序规则推荐使用utf8mb4_general_ci*/
[[DEFAULT] COLLATE <排序规则>];

请不要一个root账户给所有数据库使用,请务必做好权限分级且严禁高权限数据库用户的外部IP执行sql的权利

3、Nginx反向代理

如果已有端口占用了80或443之类的,请使用外部的Nginx进行反向代理,

upstream front{
	server x.x.x.x:8443;
}
server{
   #加入段开始===============================================
    listen 443;
    server_name mail.example.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/mail.example.com;
    location / {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_pass https://x.x.x.x:8443;
    }
    location ~ ^/(admin|sso|static|webdav|webmail)/ {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_pass https://front;
    }
   #加入段结尾==============================================
     #其他配置
}

4、 使用 Compose 部署容器

Compose 是用于定义和运行多容器 Docker 应用程序的工具,Mailu使用它来快速生成服务所需要的全部容器,我们所做的仅是需要一个yml文件告知具体的配置方法。

设置 docker-compose.yml

此操作一般不由自己来做,Mailu官方已经使用快速构建网站来完成它,
访问Mailu快速配置
我们可以填入自己所需要的配置来设置Mailu

1.选取生成模式为Compose

图片.png

2.设置Mailu持久化文件安装的路径

图片.png
默认Mailu将安装会把需要持久化存储的数据目录放在Linux服务器的根目录上
其默认值为/mailu
如果需要安装在usr子目录的mailu目录下,则设置为/usr/mailu

3.设置邮件域

图片.png

如果你的邮箱为xxxx@example.com
那么在这里设置的就是example.com

一般二级域名mail.example.com作为前端访问的界面,如mail.qq.com就是QQ邮箱的网页

4.设置TLS(五种模式)

图片.png
由于所有的容器都是在Docker内封闭隔离,在Docker内的Front等容器会使用nginx代理服务,当服务器(非Docker内)已有nginx服务和80、443等端口占用【例如已经挂载了一个web项目】,这两个nginx都会代理到最常用的80和443端口,那么外部的nginx则需要做反向代理来将不同的接口挂载到Docker上

letsencrypt 模式

Letsencrypt是一个证书颁发机构(CA),通过配置的IP和DNS服务将自动颁发证书

注意域名的对应DNS解析的A记录和AAAA记录都需要指向对应服务器的正确IP

cert 模式

需要在/mailu的目录下创建一个名为certs的目录并将已签发的域名证书的cert.pem和key.pem放入目录,它同时作为电子邮件(IMAP 和 SMTP)的TLS认证以及Https的签名

此处的域名应是mail.example.com而不是example.com的邮箱域

mail 模式

此模式和cert模式类似,除了TLS仅用于电子邮件(IMAP 和 SMTP)认证,如果网站需要Https请在Docker以外的nginx反向代理中设置证书

mail-letsencrypt 模式

此模式和letsencrypt模式类似,除了TLS仅用于电子邮件(IMAP 和 SMTP)认证,如果网站需要Https请在Docker以外的nginx反向代理中设置证书

notls 模式 【仅调试用】

此模式将关闭TLS认证,这对邮件服务会产生极大的安全漏洞,对应的大多数邮件服务商都会选择校验此认证,如果不配置TLS,很有可能会使得从本服务器发出的邮件被拦截拒收或者成为垃圾邮件

异常访问限制设置

图片.png

第一个是登录失败和无效用户的IP的访问限制
默认为60次容许/小时

第二个是用户登录次数限制
默认为100次容许/天

第二个是用户向外发送信息的次数限制
默认为200次容许/天

之所以要对此内容做限制,是为了防止使用邮件服务的用户违规使用邮件进行过多的恶意操作从而对邮件服务器的可信度产生影响而被其他邮件服务商拉黑。

由于此处的使用场景不面向大众而是作为一个邮件验证码和内容提醒服务此处不做修改

统计信息收集

图片.png

管理端网页

图片.png
设置你的邮箱服务站点名以及对应的链接,勾选Enable the admin UI选项
才能使用管理面板进行可视化操作,否则所有的邮箱用户管理等操作需要通过CLI命令来执行,可以通过修改/admin来修改管理面板的路由入口

WebMail端网页

图片.png

None

可以选择关闭本身的WebMail端,而通过第三方邮件服务商的POP3或IMAP绑定来收发邮件

roundcobe

易于安装/配置和运行标准LAMPP服务器上的自由和开放源码网络邮件解决方案
图片.png

rainloop

现代化的 Webmail 平台,界面十分简洁
图片.png

反病毒服务

需要内存足,推荐开启

日历和联系人存储

一般用不上,可选装

Fetchmail服务

让邮件服务器具备收发其他邮件服务商邮件的能力,可选装

IP地址以及DNS代理设置

图片.png

IPv4 监听地址

填写服务器对应的内网地址,该地址可通过Linux命令查看

ifconfig eth0

其中输出的值内,inet x.x.x.x 就是内网对应的IP地址

Docker 网络的子网

一般保持默认选项即可,如果与已有的Docker网桥有冲突请更换为其他的网段

启用IPV6

不推荐,Mailu的IPV6网络管理暂时不够完善,部分服务器也未开放IPV6

内部DNS解析

图片.png
当用于多个主机名的解析时需要添加,以主要主机名为第一个,以此以逗号添加其他主机名,例如mail.example.com为当前主机名,需要添加mail.example2.com为额外主机名时,此处设置为

mail.example.com,mail.example2.com

数据库选择

图片.png

sqlite

默认内置,选取此方案则无需配置数据库

mysql & postgresql
数据库用户名

填写先前建立的用户

数据库用户密码

填写用户密码

数据库连接域

数据库host连接为IP地址 x.x.x.x
一般不使用外部数据库则为localhost
如果使用外部数据库则需要指定内网IP地址
如果跨服务器使用数据库则需要指定对应服务器IP

数据库端口若非默认3306,设置为host:port
如3308端口,则为x.x.x.x:3308

数据库名

填写建立的数据库名

导入Composer文件

配置好的Composer.yml在点击Next后会生成,按照给出的提示首先在服务器内创建对应之前填写的目录

mkdir /mailu

进入目录并下载已配置好的文件

cd /mailu
wget https://setup.mailu.io/1.9/file/abc1acfe-908d-48a7-8ee2-461f4df621bd/docker-compose.yml
wget https://setup.mailu.io/1.9/file/abc1acfe-908d-48a7-8ee2-461f4df621bd/mailu.env

有两个文件,其中docker-compose.yml是配置docker的文件,而mailu.env则是mailu的容器环境配置文件

创建容器并运行

下载好配置文件后,使用Composer来根据文件进行配置

cd /mailu
docker-compose -p mailu up -d

全部运行成功后,如果想要打开前端的管理页面或者webmail需要首先通过命令行创建管理员数据,这样才会在数据库生成表和字段

docker-compose -p mailu exec admin flask mailu admin admin sosos.top '密码'

5、测试邮件服务器

注意先不要使用webmail向qq,谷歌等邮箱发送邮件!!!,此时邮件服务器并未设置完全,发送的邮件大概率会被其他邮件服务商识别为垃圾邮件而降低该发件域名的可信度,请在未确认邮件的可信度校验前,使用其他邮箱向邮件服务器发送邮件来测试邮件服务器是否成功运转

测试接受邮件

使用QQ邮箱或谷歌邮箱发送邮件到先前创建的管理员邮箱账号上。

使用可信度校验网站检查邮件服务器配置

打开邮件服务器测试网站 mail-tester
图片.png
使用管理员邮箱向给出的邮箱地址发送邮件,发送后点击查看结果

注意此网站每天只有三次机会,并且计时从第一次使用开始,满3次后需等到第一次使用的24小时后。
测试邮件不要过于简单,请尽量使用正常的标题和文字,添加一些配图和小附件,这封邮件的会不会被判断为垃圾邮件不仅仅限于邮件服务器的配置,也会和邮件的内容有关联,这些都会统计在网站的指标内并且会生成详尽的分析报告。如果使用随意的邮件格式拉低了分数反而白白浪费了一次测试机会!!!
图片.png
测试邮件内容

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。


评论