前言:Mailu搭建的邮箱自带web操作界面,可以通过web发送/接收/阅读邮件,内存占用相对较高,适合非技术人员。技术人员我更推荐Docker-Mailserver,一款不带webUI的邮箱搭建工具,内存占用不到100M,教程在这里
由于自己的网站需要用到登录注册功能,刚开始图方便,接入了第三方登录系统,很不好维护,于是就打算自己写一个登录注册功能。
主流的注册方式有两种,短信验证码注册和邮箱注册。短信验证码是个比较昂贵的方案,就只能选择自建邮箱服务器了
专业名词科普
SMTP
SMTP是用于发送电子邮件的协议
IMAP/POP3
IMAP和POP3都是用于接收电子邮件的协议
POP3 | IMAP | |
---|---|---|
全称 | Post Office Protocol 3 ( 邮局协议 版本3) | Internet Message Access Protocol (互联网消息访问协议) |
端口 | 110、995(SSL) | 143、993(SSL) |
行为 | 下载整封邮件 | 只下载邮件头,查看邮件详情时才会下载整封邮件 |
限制 | 无法对服务器上的邮件进行创建、删除、重命名操作 | 可以在服务器上对邮件进行创建、删除、重命名 |
同步 | 对邮件的修改不会同步到其他设备 | 对邮件的修改会同步到其他设备 |
默认 | 两个模式: delete mode(下载后删除服务器上的邮件) 和 keep mode(下载后不删除服务器上的邮件) | 不会删除服务器上的邮件,本地数据万一丢失,可以从服务器上恢复 |
前提条件
-
运行内存至少1G
-
检测端口号25有没有被屏蔽
在你的linux服务器上输入下面的命令
# 腾讯qq邮箱 telnet smtp.qq.com 25 # 或者谷歌邮箱 telnet smtp.google.com 25
上面的命令将尝试连接其他网站的SMTP服务器,如果运营商没有封闭25端口,那么输出内容应该是下面这个样子
root@my-linux-server:~# telnet smtp.qq.com 25 Trying 43.129.255.54... Connected to smtp.qq.com. Escape character is '^]'. 220 newxmesmtplogicsvrszc2-1.qq.com XMail Esmtp QQ Mail Server.
如果输出信息和上面的不同,那么就代表25端口的
出站流量
被屏蔽,意味着你不能发送邮件。尝试联系服务器运营商,提交工单,诉说自己的需求,让他们开通25端口,开通不了就只能换一家服务商 -
安装docker和docker-compose,还有nginx,我在Debian服务器这篇文章中有写到如何安装docker和部署nginx
创建docker-compose.yml文件
官方提供了一个可以自动生成docker-compose.yml的工具,链接:https://setup.mailu.io/
Step 1 - Initial configuration
Mailu Storage path
mailu数据卷的挂载路径,/mailu
表示将数据卷挂载到服务器上的根目录下的mailu中Main mail domain and server display name
这里是邮箱服务器的名字,也就是@
符号后面显示的内容postmaster local part
管理员的账号,也就是@
符号前面的内容Choose how you wish to handle security TLS certificates
ssl证书类型- cert is the default and requires certificates to be setup manually;
- letsencrypt will use the Letsencrypt! CA to generate automatic certificates;
- mail is similar to cert except that TLS will only be served for emails (IMAP and SMTP), not HTTP (use it behind reverse proxies);
- mail-letsencrypt is similar to letsencrypt except that TLS will only be served for emails (IMAP and SMTP), not HTTP (use it behind reverse proxies);
- notls will disable TLS, this is not recommended except for testing.
- 最推荐服务器用来单独运行mailu邮件服务,此时80端口和443端口不会被占用,可以选择letsencrypt;
- 服务器要运行其他的服务,并且某些进程已经占用了80端口和443端口,这种情况下,需要用nginx进行转发80和443端口,可以选择mail-letsencrypt(下面教你如何配置)
- 测试阶段可以使用notls,但是也不建议用,直接把ssl配置好,后面也会省心很多
- cert和mail都是手动设置ssl证书的,一般不建议选
Website name
进入你自己搭建好的邮箱网站后,左上角显示的网站名字Linked Website URL
可以设置成你自己的邮箱主页url,和上面的website name差不多,基本没什么用Enable the admin UI
是否启用管理员web页面,建议启用Enable the API
是否允许api访问,也就是通过api可以创建用户邮箱,删除用户,可以先不打开,后面如果需要打开的话,可以在mailu.env文件中修改
Step 2 - Pick some features
Enable Web email client (and path to the Web email client)
webemail客户端,需要打开,这样就可以在网页端发邮件,查看邮件- 其他的服务都需要占用更多的资源,内存足够的话可以开启,这里不做介绍
Step 3 - expose Mailu to the world
IPv4 listen address
填写你的服务器公网IP地址Subnet of the docker network
容器内的IP地址段,一般没有特殊情况,默认就好Public hostnames
邮件服务器的域名,也就是外界通过这个域名可以访问到你的邮件服务器,一般都设置成二级域名
检查配置文件
配置信息填好以后,点击生成配置文件,根据官网指示,将配置文件下载到本地,检查配置文件内容,确认信息无误,尤其注意以下几点
- docker-compose.yml中的volume文件挂载路径是否存在(挂载点可以是绝对路径,也可以是相对路径
$PWD
) - docker-compose.yml中的端口映射信息是否正确(服务器上的80和443端口已经被其他进程被占用的话,就要将容器内的80和443映射到服务器上的其他端口)
- mailu.env文件中的TZ是否正确,应该是中国时区,Asia/Shanghai
配置管理员账号
在mail.env文件中添加以下配置,官方文档链接https://mailu.io/2.0/configuration.html
INITIAL_ADMIN_ACCOUNT=admin
INITIAL_ADMIN_DOMAIN=<邮箱域,也就是@符号后面的内容,如:wmwm.me>
INITIAL_ADMIN_PW="<密码中包含符号的话,一定要用双引号扩起来>"
INITIAL_ADMIN_MODE=update
INITIAL_ADMIN_ACCOUNT
the admin username: The first part of the e-mail address before the @.INITIAL_ADMIN_DOMAIN
the domain appendix: Most probably identical to the DOMAIN variable.INITIAL_ADMIN_PW
the admin password.INITIAL_ADMIN_MODE
use one of the options below for configuring how the admin account must be created:-
create: (default) creates a new admin account and raises an exception when it already exists.
-
ifmissing: creates a new admin account when the admin account does not exist.
-
update: creates a new admin account when it does not exist, or update the password of an existing admin account.
官网建议设置成ifmissing或update,而不是使用默认的create,否则在系统重启的时候会发生错误
-
管理员账号可以在配置文件中设置,也可以等到容器运行起来后动态添加
# 用命令行创建管理员账号
docker compose -p mailu exec admin flask mailu admin admin <邮件域,如wmwm.me> "<密码>"
上传
将修改完成后的docker-compose.yml和mailu.env上传到你的服务器的/mailu目录下,我使用的是scp命令
scp -r /mailu root@[服务器IP地址]:/mailu
上传后登录你的服务器再次确认文件中的内容是否是自己修改之后的内容
添加A记录
我使用的是cloudflare,设置如下
如果你不了解邮箱协议,❗❗❗一定不要开启Proxy
,也就是上面的橘黄色开关,因为涉及到cloudflare专用证书的配置,配置起来会很麻烦(老鸟可以无视)
Nginx反向代理(可选)
如果你像我一样,在服务器上运行了不止mailu一个服务,那么80端口和443端口必定会造成冲突,可以通过nginx做端口映射。
方便起见,我会直接给你一份配置文件,首先你要在服务器上安装好docker并运行nginx容器,详细的教程在这里,配置文件的内容为
server {
listen 80;
listen 443 ssl http2;
server_name mail.wmwm.me;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privatekey.pem;
location / {
proxy_pass http://<服务器公网IP地址>:<你的mailu容器映射出来的http端口,也就是docker-compose中80:80,冒号前面的数字不是80,看你自己的配置>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
运行mailu容器
切换到docker-compose.yml所在目录
# 运行
docker compose -p mailu up -d
# 停止
docker compose -p mailu down
访问你的邮箱域名,看到登录界面,代表你已经成功一大半了,用之前设置的管理员账号密码进行登录
设置DKIM/SPF/DMARC
DKIM、SPF、DMARC都是用于电子邮件身份验证和防止电子邮件欺诈的技术,提高邮件服务器的可信度,避免被当成垃圾邮件处理
登录admin账号,生成DKIM、SPF、DMARC密钥
将MX条目
,DNS SPF条目
,DNS DKIM条目
,DNS DMARC条目
,DNS TLSA entry
添加到dns解析中,我使用的是cloudflare,在cloudflare后台设置就行。
需要注意的是,DKIM条目中的"
引号要去掉,包括中间的空行,让上下两行的内容连接在一起
配置时遇到问题就百度一下,或者留言
配置完成后的最终效果(一共6条DNS记录)
测试
🎉🎉🎉成功了!是不是很酷,拥有自己域名的专属邮箱
https://www.mail-tester.com/这个网站可以检测你的邮箱是否符合规范,不符合规范的邮箱发出去的邮件会被当成垃圾邮件,甚至拒收
常用命令
创建邮箱用户
docker compose exec admin flask mailu user myuser example.net 'password123'
更多命令行操作指南https://mailu.io/2.0/cli.html