如何搭建自己的域名邮箱xxx@yourdomain.com|Mailu教程|全方位避坑指南

2023年 7月 31日 19.5k 0

原文链接:wmwm.me/article/456…

mailu搭建的邮箱服务器自带web操作界面,可以通过web发送/接收/阅读邮件,内存占用相对较高。当然你也可以选择用不带webUI的邮箱服务器,内存占用不到100M,文章在这里:目前为止最详细的教程:搭建自己的邮箱服务器|Docker-Mailserver详细教程|避坑指南

由于自己的网站需要用到登录注册功能,刚开始图方便,接入了第三方登录系统,很不好维护,于是就打算自己写一个登录注册功能。

主流的注册方式有两种,短信验证码注册和邮箱注册。短信验证码是个比较昂贵的方案,就只能选择自建邮箱服务器了

专业名词科普

SMTP

SMTP是用于发送电子邮件的协议

IMAP/POP3

IMAP和POP3是用于接收电子邮件的协议

区别在于,IMAP允许邮件客户端对邮件服务器上的邮件进行读写操作(创建、删除、移动和标记邮件),而POP3仅允许邮件客户端从邮件服务器上下载邮件,只能读,不能写

前提条件

  • 运行内存至少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,我在这篇文章中有教你如何用Docker安装Nginx代理

  • 创建docker-compose.yml文件

    官方提供了一个可以自动生成docker-compose.yml的工具,链接: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文件中添加以下配置,官方文档链接mailu.io/2.0/configu…

    INITIAL_ADMIN_ACCOUNT=admin
    INITIAL_ADMIN_DOMAIN=
    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  ""
    

    上传

    将修改完成后的docker-compose.yml和mailu.env上传到你的服务器的/mailu目录下,我使用的是scp命令

    scp -r /mailu root@[服务器IP地址]:/mailu
    

    上传后登录你的服务器再次确认文件中的内容是否是自己修改之后的内容

    添加A记录

    我使用的是cloudflare,设置如下

    如果你不了解邮箱协议,❗❗❗一定不要开启Proxy,也就是上面的橘黄色开关,因为涉及到cloudflare专用证书的配置,配置起来会很麻烦(老鸟可以无视)

    Nginx反向代理(可选)

    如果你像我一样,在服务器上运行了不止mailu一个服务,那么80端口和443端口必定会造成冲突,可以通过nginx做端口映射。

    方便起见,我会直接给你一份配置文件,首先你要在服务器上安装好docker并运行nginx容器,详细的教程在这里,配置文件的内容为

    ###################### mail #######################
    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://:;
            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
    

    访问你的邮箱域名,看到登录界面,代表你已经成功一大半了,用之前设置的管理员账号密码进行登录

    登录界面.png

    设置DKIM/SPF/DMARC

    DKIM、SPF、DMARC都是用于电子邮件身份验证和防止电子邮件欺诈的技术,提高邮件服务器的可信度,避免被当成垃圾邮件处理

    登录admin账号,生成DKIM、SPF、DMARC密钥

    选择邮件域.png

    生成密钥.png

    MX条目,DNS SPF条目,DNS DKIM条目,DNS DMARC条目,DNS TLSA entry添加到dns解析中,我使用的是cloudflare,在cloudflare后台设置就行。

    需要注意的是,DKIM条目中的"引号要去掉,包括中间的空行,让上下两行的内容连接在一起

    去掉引号.webp

    配置时遇到问题就百度一下,或者留言

    配置完成后的最终效果(一共6条DNS记录)

    dns配置结果1.png

    dns配置结果2.png

    测试

    发送:邮件.png

    邮件发送成功.png

    🎉🎉🎉成功了!是不是很酷,拥有自己域名的专属邮箱

    www.mail-tester.com/这个网站可以检测你的邮箱是否符合规范,不符合规范的邮箱发出去的邮件会被当成垃圾邮件,甚至拒收

    常用命令

    创建邮箱用户

    docker compose exec admin flask mailu user myuser example.net 'password123'
    

    更多命令行操作指南mailu.io/2.0/cli.htm…

    更多文章在我的博客:wmwm.me

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论