自建的意义
本次搭建邮件服务器基于CentOS Stream 9系统,手把手教大家自建一套完整的邮局,以SendMail为SMTP核心、Dovecot为IMAP接收服务、Roundcube为Web客户端,实现局域网收发+外部邮件接收功能,云服务器端口限制无法对外发送。
虽然现今大部分国内云服务供应商默认都封禁25端口出站,且解封难度堪比登天,导致目前大部分自建邮局教程都是使用第三方邮件服务商进行发件,但是搭建邮件服务器的原理还是有必要探讨一下,并且自建还可以实现局域网内部的邮件收发,并不是完全没有意义。

系统环境预处理
开局第一步,必须关闭防火墙和 SELinux,避免后续出现奇奇怪怪的权限问题。
sudo yum update -y # 更新系统软件包
sudo setenforce 0 # 临时关闭SELinux
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config # 永久关闭
sudo systemctl stop firewalld # 停止防火墙
sudo systemctl disable firewalld # 禁止防火墙开机自启
然后直接将所需要用到的域名,绑定在配置主机名与 hosts 文件。
sudo hostnamectl set-hostname mail.mybug.cn
sudo echo "mybug.cn mail.mybug.cn roundcube.mybug.cn" >> /etc/mail/local-host-name
不要忘记在服务器安全组开放端口:TCP 25(SMTP)、143(IMAP),如果使用了宝塔面板防火墙,也要放行相同端口。

安装配置SendMail
操作非常简单,终端执行安装命令,自动安装核心组件和依赖。
sudo yum install -y sendmail sendmail-cf m4
安装完成后就可以直接修改配置了,编辑m4宏配置文件,当然最好是备份原始配置,避免配置错误无法回滚。
sudo cp /etc/mail/sendmail.mc /etc/mail/sendmail.mc.bak
sudo vi /etc/mail/sendmail.mc
当然也可以通过宝塔面板找到/etc/mail/sendmail.mc文件编辑,就不用改的那么累了。主要还是修改一些关键的配置项,其他保持默认即可,根据下方的前缀直接查找,找到相对应的部分修改值。
SendMail关键配置项
dnl # 定义本地域名
define(`confDOMAIN_NAME', `mybug.cn')dnl
dnl # 允许所有网络接口访问
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
dnl # 配置SMTP认证
TRUST_AUTH_MECH(`LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `LOGIN PLAIN')dnl
define(`confAUTH_REALM', `mybug.cn')dnl
define(`confRELAY_FROM_HOSTS', `127.0.0.1')dnl
修改好后由m4宏文件生成SendMail核心配置文件sendmail.cf,设置权限并启动SendMail服务。
sudo m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
sudo chown -R apache:apache /var/www/html/mail
sudo chmod -R 755 /var/www/html/mail
sudo systemctl start sendmail # 启动服务
sudo systemctl enable sendmail # 开机自启
sudo systemctl status sendmail # 查看服务状态
接下来就要配置邮件中继,允许内部用户发送,编辑访问控制文件,添加IP中继如下。
sudo vi /etc/mail/access
Connect:localhost.localdomain RELAY
Connect:127.0.0.1/24 RELAY
Connect:x.x.x.x/24 RELAY # 服务器公网IP段
To:mybug.cn RELAY
最后还得生成访问控制数据库就完成了。
sudo makemap hash /etc/mail/access < /etc/mail/access
安装配置Dovecot
一样可以直接在终端执行安装命令,自动安装依赖包。
sudo yum install -y dovecot
接着还是备份原始配置,编辑主配置文件。
sudo cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.bak
sudo vi /etc/dovecot/dovecot.conf
这里还是给出关键的配置内容,照着前缀找到对应位置就可以修改了。
Dovecot关键配置项
protocols = imap # 启用IMAP协议
listen = * # 监听所有接口
disable_plaintext_auth = no # 启用明文认证
auth_mechanisms = plain login # 认证方式
mail_location = maildir:~/Maildir # 邮件存储位置
userdb { driver = passwd } # 用户名认证
passdb { driver = pam } # 密码认证
同步修改10-mail.conf文件保存邮件的位置。
sudo vi /etc/dovecot/conf.d/10-mail.conf
mail_location = mbox:~/mail:INBOX=/var/mail/%u
为了安全还要在10-auth.conf启用系统用户认证,即可禁用匿名登录。
sudo vi /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
修改完毕后就可以启动Dovecot服务。
sudo systemctl start dovecot
sudo systemctl enable dovecot
sudo systemctl status dovecot
部署Roundcube
在Roundcube官网下载邮局程序安装包https://roundcube.net/download/,上传安装包到站点根目录,通过宝塔面板解压,访问安装向导,进行环境检测和配置数据库与邮件服务。
Roundcube关键配置项
数据库:填写MySQL账号、密码、数据库名
IMAP服务:域名/IP地址:143
SMTP服务:域名/IP地址:25
设置des_key,自定义秘钥,用于加密密码

安装完成后,非常建议删除installer目录,因为Roundcube的安装程序是可以重复进入并随意修改配置文件的。
创建用户及测试
根据上面的配置后,SendMail默认使用Linux系统用户作为邮箱账号,终端执行创建系统用户即可映射邮箱账号。
sudo useradd -m user # 创建账号
sudo passwd password # 设置密码
访问搭建好的Roundcube客户端,使用第一个测试用户登录,撰写邮件并发送给第二个测试邮箱。

切换到第二个测试用户登录,验证接收,可以正常展示邮件内容。

使用外部邮箱例如QQ邮箱,向我们本机的测试邮箱发送一封邮件,登录Roundcube查看,依然能够接收成功。

至此,我们已经成功在CentOS上搭建自己的邮件服务器。
S-nail客户端测试
我们还可以在系统安装S-nail,使用终端进行收发操作。
sudo yum install -y s-nail
以下是使用telnet连接SMTP服务器,并使用终端发送邮件的示范。
telnet IP地址 25
EHLO 来源域名.com
AUTH LOGIN # 输入Base64编码的用户名和密码
MAIL FROM:发送邮件的邮箱@mail.com
RCPT TO:接收邮件的邮箱@mail.com
DATA
Subject: 测试邮件
这是终端发送的测试邮件
. # 输入点号结束
QUIT

最后发送与接收到的邮件都可以查看日志和在指定用户的邮件文件进行确认。
tail -f /var/log/maillog # 查看邮件服务日志
cat /var/spool/mail/用户名 # 查看指定邮箱的内容