企业内部邮件系统的搭建
因公司发展需要,原先依赖第三方进行的邮件系统不符合公司需求,因此公司决定搭建一套公司内部的邮件系统。
本文基于 iRedMail 1.8.0 + MariaDB + Roundcube 编写。
基础邮件系统的搭建
选型
目前,市面上的邮件系统较为丰富,经过一番比对,最终决定选用 iRedMail。
关于 iRedMail,它的官网上是这么写的:
以最佳的方式搭建基于 Linux/BSD 和开源软件的邮件服务器。始于 2007 年。
获取
前往官网下载页面,获取最新安装包。截止 2026/04/21 前,最新版本为 1.8.0。
# 获取安装包。
wget https://github.com/iredmail/iRedMail/archive/refs/tags/1.8.0.tar.gz
# 解压,获取到一个 iRedMail-1.8.0 目录
tar zxf 1.8.0.tar.gz
cd iRedMail-1.8.0
安装
在安装前,需要做一些前置准备。
首先是配置本地主机为邮件域名。
hostnamectl set-hostname "mail.example.com"
接着,修改本地的 hosts 文件,将邮件域名指向本机 IP 地址。
# 127.0.1.1 是本地 IP 地址
# 如果有公网 IP 地址,则将 127.0.1.1 替换为公网 IP 地址
sed -i "s/127.0.1.1.*/127.0.1.1 mail.example.com mail/" /etc/hosts
iRedMail 官方有提供一个 iRedMail.sh 安装脚本来辅助安装。
需要注意的是,安装脚本需要使用 sudo 执行。
sudo bash iRedMail.sh
执行脚本之后,按照提示选择并输入即可。
DNS 配置
参照以下内容添加 DNS 记录到邮件域名中。
| 类型 | 名称 | 内容 |
|---|---|---|
| A | <服务器公网地址> | |
| MX | @ | 10 mail.example.com. |
| TXT | @ | v=spf1 mx ~all |
| TXT | dkim._domainkey | DKIM 内容请访问 iRedMail.tips 获取 |
| TXT | _dmarc | v=DMARC1; p=quarantine; rua=mailto:postmaster@example.com |
iRedMail.tips 文件位于 iRedMail.sh 同级目录下,是在脚本执行完毕后创建的。
在其中找到 DNS record for DKIM support: 这一段:
// ...
DNS record for DKIM support:
; key#1 2048 bits, s=dkim, d=example.com, /var/lib/dkim/example.com.pem
dkim._domainkey.example.com. 3600 TXT (
"v=DKIM1; p="
"XXXX/1G"
"XXXX+Mri+XXXX"
"XXXX+XXXX/XXXX/kz"
"XXXX+XXXX+XXXX+XXXX"
"XXXX+XXXX"
"XXXX//XXXX/XXXX"
"XXXX")
// ...
将括号内的内容去掉引号,整理为一行,将内容复制到 DNS 记录中即可:
v=DKIM1; p=XXXXXXXXXXXXXXXXXXXXXXXXX...
完成以上配置之后,重启服务器即可。
访问
访问 邮件服务器地址/mail 可以进入 Roundcube 界面。
访问 邮件服务器地址/iredadmin 可以进入 iRedMail 管理后台。
Google SMTP 中继转发
首先在 Google Workspace 控制台中,通过侧边栏选项”账号 -> 域名 -> 管理网域“ 进入配置。添加远程邮件域名作为辅助域名。
同时,将添加的域名加入许可名单,并修改 DNS TXT @ 记录从 v=spf1 mx ~all 更改为 "v=spf1 include:_spf.google.com ~all"。
SMTP 转发
在 Google Workspace 控制台中,通过侧边栏选项”应用 -> Google Workspace -> Gmail -> 转送“ 进入配置。
新增 “SMTP 中继服务” 规则。
- 允许的寄件者设置为仅限在网域中的地址
- 仅接收来自指定 IP 地址的邮件,将邮件服务器的 IP 地址填入
- 不需要 SMTP 验证
编辑 /etc/postfix/main.cf 文件,增加配置:
relayhost = smtp-relay.gmail.com:25
接收邮件
在 Google Workspace 控制台中,通过侧边栏选项”应用 -> Google Workspace -> Gmail -> 转送“ 进入配置。
新增 “使用收件人地址映射设置电子邮件转发” 规则。
- 增加 <原地址> <对应地址> 条目
- 设置受影响的邮件为所有传入邮件
- 转发设置为一并转发到原始目的地保留原地址接收功能
不存在的邮箱账户也可以作为原地址。
共享邮箱
共享邮箱,简单来说就是多个用户可以共用一个邮箱进行收发。
iRedMail 默认支持这个功能。
首先创建一个邮箱账户 support@example.com。
# 为 admin@example.com 增加邮箱 support@example.com 的 lookup,read,write 权限
sudo doveadm acl set -u support@example.com INBOX user=admin@example.com lookup read write
# 为 admin@example.com 增加订阅 support@example.com 邮件
sudo doveadm mailbox subscribe -u example.com Shared/support@example.com
前往 Roundcube 首页,已经可以看见 support@example.com 邮件文件夹了。
但此时,仅能查看 support@example.com 邮箱邮件,暂时无法使用它作为发件人发送邮件。
邮箱别名
iRedMail 默认是允许自行管理发件人身份的,但在企业内部,这肯定是不行的,因此我们需要关掉。
进入 Roundcube 所在目录 /opt/www/roundcubemail/config/,编辑 defaults.inc.php 文件:
将 identities_level 设置为 3,表示可以修改发件人身份除邮箱外的任意属性。
$config['identities_level'] = 3;
添加 roundcube 的 identities:
USE roundcubemail;
-- 获取用户列表
-- SELECT * FROM users;
-- 分别为用户 id 为 1,2,3,4 的用户增加一个发件人身份 support@example.com
INSERT INTO identities(user_id, name, email) VALUES
(1, "support", "support@example.com"),
(2, "support", "support@example.com"),
(3, "support", "support@example.com"),
(4, "support", "support@example.com");
配置后,重新进入 Roundcube 界面,尝试写一封新邮件,在发件人身份处,可以选择新加的发件邮箱了。
自动替换别名
编辑 /etc/postfix/main.cf 文件,增加配置:
sender_canonical_maps = hash:/etc/postfix/sender_canonical
sender_canonical_classes = envelope_sender, header_sender
编辑 /etc/postfix/sender_canonical 文件,以 <源邮件域名> <替换的邮件域名> 的格式增加配置:
@local @remote
sudo postmap /etc/postfix/sender_canonical 将映射文件编译为 Postfix 的数据库文件。
sudo postfix reload 重载配置文件。
配置之后,当使用 xxx@local 发送邮件时,发件人会被自动替换为 xxx@remote 邮件地址。
自动化安装脚本
以下是一个自动化的安装脚本
#!/bin/bash
#===============================================================================
#
# 自动化部署 iRedMail 脚本
#
# 使用方式:
#
# $ sudo bash install.sh <hostname> <root_password> <http_proxy>
# - hostname: 邮件域名 e.g. example.com
# - root_password: Root 密码
# - http_proxy: 代理地址 e.g. http://proxy.example.com:8080
#
# 使用示例:
#
# $ sudo bash install.sh example.com root_password http://proxy.example.com:8080
#
#===============================================================================
random_string() {
local length=32
tr -dc 'A-Za-z0-9' </dev/urandom | head -c "$length"
}
# 主机名称,对应邮件域名 e.g. example.com
HOSTNAME=$1
# Root 密码
ROOT_PASSWORD=$2
# 代理地址 e.g. http://proxy.example.com:8080
export http_proxy=$3
# iRedMail 版本
VERSION=1.8.0
# 邮件存储目录
MAILDIR=/var/mail
IREDMAILDIR=iRedMail-$VERSION/
export https_proxy=$http_proxy
export DEBIAN_FRONTEND=noninteractive
pre_handle() {
ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 更新系统和安装必要的软件包
apt update -y
apt install -y tar gzip software-properties-common nfs-common
echo 配置主机名和 hosts 文件
NEW_HOST="mail.$HOSTNAME"
hostnamectl set-hostname "$NEW_HOST"
sed -i "s/127.0.1.1.*/127.0.1.1 $NEW_HOST mail/" /etc/hosts
echo 下载 iRedMail 并解压
wget https://github.com/iredmail/iRedMail/archive/refs/tags/$VERSION.tar.gz
tar zxf $VERSION.tar.gz
}
if [ "$EUID" -ne 0 ]; then
echo "请以 root 用户运行此脚本"
exit 1
fi
if [ ! -d "$IREDMAILDIR" ]; then
pre_handle
fi
if [ -f "config" ]; then
rm config
fi
if [ -f "$IREDMAILDIR/config" ]; then
rm "$IREDMAILDIR/config"
fi
echo 创建配置文件
cat > $PWD/config <<EOF
export STORAGE_BASE_DIR='$MAILDIR'
export FIRST_DOMAIN='$HOSTNAME'
export MYSQL_ROOT_PASSWD='$ROOT_PASSWORD'
export DOMAIN_ADMIN_PASSWD_PLAIN='$ROOT_PASSWORD'
export WEB_SERVER='NGINX'
export BACKEND='MYSQL'
export BACKEND_ORIG='MARIADB'
export USE_IREDADMIN='YES'
export USE_ROUNDCUBE='YES'
export USE_NETDATA='YES'
export USE_FAIL2BAN='YES'
export AMAVISD_DB_PASSWD='$(random_string)'
export FAIL2BAN_DB_PASSWD='$(random_string)'
export IREDAPD_DB_PASSWD='$(random_string)'
export IREDADMIN_DB_PASSWD='$(random_string)'
export MLMMJADMIN_API_AUTH_TOKEN='$(random_string)'
export NETDATA_DB_PASSWD='$(random_string)'
export RCM_DB_PASSWD='$(random_string)'
export SOGO_DB_PASSWD='$(random_string)'
export SOGO_SIEVE_MASTER_PASSWD='$(random_string)'
export VMAIL_DB_ADMIN_PASSWD='$(random_string)'
export VMAIL_DB_BIND_PASSWD='$(random_string)'
#EOF
EOF
cp $PWD/config $PWD/iRedMail-$VERSION/config
cd $PWD/iRedMail-$VERSION/
echo 安装 iRedMail
export AUTO_USE_EXISTING_CONFIG_FILE=y
export AUTO_INSTALL_WITHOUT_CONFIRM=y
export AUTO_CLEANUP_REMOVE_SENDMAIL=y
export AUTO_CLEANUP_REPLACE_FIREWALL_RULES=y
export AUTO_CLEANUP_RESTART_FIREWALL=y
export AUTO_CLEANUP_REPLACE_MYSQL_CONFIG=y
yes '' | bash iRedMail.sh
cat <<EOF
DNS 配置:
| 类型 | 名称 | 内容 |
| --- | --- | --- |
| A | mail | <服务器公网地址> |
| MX | @ | 10 mail.${HOSTNAME}. |
| TXT | @ | v=spf1 mx ~all |
| TXT | dkim._domainkey | DKIM 内容请访问 iRedMail.tips 获取 |
| TXT | _dmarc | v=DMARC1; p=quarantine; rua=mailto:postmaster@${HOSTNAME} |
EOF