服务器选择:阿里云 ECS(CentOS 7.9 64 位,2 核 4G+50GB 系统盘 + 200GB 数据盘),需开通公网 IP并绑定弹性 IP(避免 IP 变动)。
安全组配置(阿里云控制台):
放行以下端口(需手动添加规则):
端口 | 协议 | 用途 |
---|---|---|
25/tcp | TCP | SMTP(邮件发送) |
110/tcp | TCP | POP3(邮件接收) |
143/tcp | TCP | IMAP(邮件管理) |
465/tcp | TCP | SMTPS(加密发送) |
993/tcp | TCP | IMAPS(加密管理) |
80/tcp | TCP | HTTP(Webmail 访问) |
443/tcp | TCP | HTTPS(加密 Webmail) |
域名解析(阿里云万网):
必须添加以下记录(conkl.com
为例):
类型 主机记录 记录值 优先级 TTL
A @ 服务器公网IP - 600
A mail 服务器公网IP - 600
MX @ mail.conkl.com 10 600
TXT @ "v=spf1 a mx ~all" - 600 # SPF记录(防伪造)
# 切换root用户
sudo su -
# 更新系统并安装依赖
yum -y update && yum -y install wget vim net-tools lsof bind-utils # bind-utils含nslookup
# 关闭SELINUX(避免权限干扰)
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
setenforce 0
yum -y install postfix
systemctl enable postfix
/etc/postfix/main.cf
)# 基础标识配置(必须与域名强绑定)
myhostname = mail.conkl.com # 邮件服务器主机名(必须与MX记录一致)
mydomain = conkl.com # 邮件域名(所有邮件的@后缀)
myorigin = $mydomain # 发件人域名自动补全(如用户输入"user"会自动转为[email protected])
# 网络监听(阿里云服务器需监听所有接口)
inet_interfaces = all # 监听所有网卡(包括公网IP)
inet_protocols = ipv4 # 仅使用IPv4(避免IPv6干扰)
# 收件人限制(防垃圾邮件)
mydestination = $myhostname, $mydomain, localhost.$mydomain, localhost # 允许接收的域名
smtpd_recipient_restrictions = # 收件人验证策略(按顺序执行)
permit_mynetworks, # 信任内网IP(如127.0.0.1)
permit_sasl_authenticated, # 认证通过的用户
reject_unauth_destination # 拒绝未授权的收件域名
# 加密与认证(关键安全配置)
smtpd_use_tls = yes # 启用TLS加密(客户端必须支持)
smtpd_tls_cert_file = /etc/ssl/certs/server.crt # 替换为你的SSL证书(后续申请)
smtpd_tls_key_file = /etc/ssl/private/server.key # 替换为你的证书私钥
smtpd_sasl_type = dovecot # 使用Dovecot的SASL认证(与Dovecot联动)
smtpd_sasl_path = private/auth # Dovecot提供的认证接口路径
smtpd_sasl_auth_enable = yes # 启用SASL认证(用户登录必须)
systemctl restart postfix
postconf -n # 查看生效的配置(确认myhostname/mydomain正确)
telnet mail.conkl.com 25 # 测试SMTP端口(成功会显示"220 mail.conkl.com ESMTP")
yum -y install dovecot
systemctl enable dovecot
/etc/dovecot/dovecot.conf
)# 协议与监听(支持IMAP/POP3)
protocols = imap pop3
listen = * # 监听所有接口(包括公网IP)
# 邮件存储(使用Maildir格式,支持多文件夹)
mail_location = maildir:~/Maildir # 邮件存储路径(用户家目录下的Maildir)
# 认证配置(与Postfix联动)
auth_mechanisms = plain login # 支持的认证方式(明文/登录)
passdb {
driver = pam # 使用PAM认证(与系统用户绑定)
}
userdb {
driver = passwd # 从系统用户读取信息
}
# SASL接口(供Postfix调用)
service auth {
unix_listener /var/spool/postfix/private/auth { # Postfix访问路径
mode = 0660
user = postfix
group = postfix
}
}
systemctl restart dovecot
ss -antlp | grep -E '143|993' # 检查IMAP端口(143/993)是否监听
# 安装Nginx+PHP环境
yum -y install nginx php-fpm php-mysqlnd php-imap php-gd php-mbstring
# 下载Roundcube
wget https://github.com/roundcube/roundcubemail/releases/download/1.6.3/roundcubemail-1.6.3-complete.tar.gz
tar -zxvf roundcubemail-1.6.3-complete.tar.gz -C /var/www/
mv /var/www/roundcubemail-1.6.3 /var/www/roundcube
# 配置Nginx(/etc/nginx/conf.d/roundcube.conf)
cat > /etc/nginx/conf.d/roundcube.conf <<EOF
server {
listen 80;
server_name mail.conkl.com; # 必须与域名解析一致
root /var/www/roundcube;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
}
EOF
/var/www/roundcube/config/config.inc.php
)$config['db_dsnw'] = 'mysql://roundcube:Roundcube@123@localhost/roundcube'; # 数据库连接(需提前创建)
$config['default_host'] = 'ssl://mail.conkl.com'; # IMAP服务器(SSL加密)
$config['default_port'] = 993; # IMAPS端口
$config['smtp_server'] = 'ssl://mail.conkl.com'; # SMTP服务器(SSL加密)
$config['smtp_port'] = 465; # SMTPS端口
$config['username_domain'] = 'conkl.com'; # 自动补全域名(用户输入"user"即[email protected])
$config['des_key'] = 'your-secret-key-123456'; # 必须修改为随机字符串(会话加密)
systemctl restart nginx php-fpm
curl http://mail.conkl.com # 访问应显示Roundcube登录页
现象:用客户端发送邮件时提示550 5.1.1 Recipient address rejected: User unknown
。
可能原因:
mydestination
未包含conkl.com
(无法识别本地域名)。解决步骤:
创建系统用户(与邮箱名一致):
useradd -m -s /sbin/nologin admin # 创建[email protected](-m自动创建家目录)
echo "Admin@123" | passwd --stdin admin # 设置密码
检查/etc/postfix/main.cf
的mydestination
是否包含$mydomain
(即conkl.com
)。
现象:Outlook/Thunderbird 提示 “无法连接到服务器”。
可能原因:
解决步骤:
检查阿里云安全组(控制台→网络与安全→安全组),确认端口已放行。
替换为 Let’s Encrypt 免费证书(避免自签名信任问题):
yum -y install certbot python3-certbot-nginx
certbot --nginx -d mail.conkl.com # 自动申请并配置HTTPS(会同步更新Nginx和Postfix/Dovecot的证书路径)
现象:Roundcube 登录页提示SQL error: Connection failed
。
可能原因:
config.inc.php
中的数据库账号 / 密码错误。解决步骤:
确认$config['db_dsnw']
中的用户名、密码、数据库名与 MySQL 一致。
登录 MySQL 授权:
GRANT ALL ON roundcube.* TO 'roundcube'@'localhost' IDENTIFIED BY 'Roundcube@123';
FLUSH PRIVILEGES;
现象:发送到 Gmail/QQ 邮箱的邮件进入垃圾箱。
可能原因:
解决步骤:
配置 SPF 记录(已在前期准备添加,需验证):
nslookup -type=txt conkl.com # 应显示"v=spf1 a mx ~all"
配置 DKIM(通过 Postfix+dovecot-dkimpy):
yum -y install dovecot-dkimpy
# 生成DKIM密钥
dkimpy-genkey -d conkl.com -s mail # 生成mail._domainkey.conkl.com的TXT记录
将生成的公钥添加到域名解析的 TXT 记录中,格式:
类型 主机记录 记录值
TXT mail._domainkey "v=DKIM1; k=rsa; p=公钥内容"
现象:发送到外部邮箱(如 Gmail)失败,日志提示connect to smtp.gmail.com:25: Connection refused
。
可能原因:阿里云默认封锁 25 端口(防垃圾邮件)。
解决步骤:
通过以上步骤,可在阿里云 Linux 服务器上搭建完整的@conkl.com
邮件系统。关键注意点:
freshclam
)和反垃圾规则(sa-update
),确保系统安全。