企业内部邮件系统的搭建

因公司发展需要,原先依赖第三方进行的邮件系统不符合公司需求,因此公司决定搭建一套公司内部的邮件系统。

本文基于 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 mail <服务器公网地址>
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 中继服务” 规则。

  1. 允许的寄件者设置为仅限在网域中的地址
  2. 仅接收来自指定 IP 地址的邮件,将邮件服务器的 IP 地址填入
  3. 不需要 SMTP 验证

编辑 /etc/postfix/main.cf 文件,增加配置:

relayhost = smtp-relay.gmail.com:25

接收邮件

在 Google Workspace 控制台中,通过侧边栏选项”应用 -> Google Workspace -> Gmail -> 转送“ 进入配置。

新增 “使用收件人地址映射设置电子邮件转发” 规则。

  1. 增加 <原地址> <对应地址> 条目
  2. 设置受影响的邮件为所有传入邮件
  3. 转发设置为一并转发到原始目的地保留原地址接收功能

不存在的邮箱账户也可以作为原地址

共享邮箱

共享邮箱,简单来说就是多个用户可以共用一个邮箱进行收发。

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

企业内部邮件系统的搭建
https://www.inksha.com/archives/qi-ye-nei-bu-you-jian-xi-tong-de-da-jian
作者
inksha
发布于
2026年04月21日
许可协议