shtools/mailserver/mailserver.sh
2025-03-15 11:31:13 +08:00

201 lines
5.6 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
##############################################################
# 参数占位(请根据实际情况替换)
# 注意事项:请在执行前确认所有参数均被正确替换
##############################################################
MAIL_DOMAIN="{{your-mail-domain.com}}" # 邮件域名example.com
MAIL_IP="{{your-server-ip}}" # 邮件服务器IP地址
ADMIN_EMAIL="{{admin@your-domain.com}}" # 管理员邮箱用于Postfix收件
USER_NAME="{{username}}" # 系统用户账号(用于邮箱存储)
USER_PASSWORD="{{password}}" # 用户密码
WEBROOT_PATH="{{/var/www/html}}" # Certbot使用HTTP验证的网站目录
##############################################################
# 初始配置
##############################################################
echo "==> 开始初始化..."
# 预检测
echo ">> 检查root权限..."
if [ "$(id -u)" != "0" ]; then
echo "请使用root权限执行脚本" >&2
exit 1
fi
# 更新系统
echo ">> 更新软件源..."
apt update && apt upgrade -y
# 安装必要组件
echo ">> 安装Postfix/Dovecot..."
apt install -y postfix mailutils dovecot-core dovecot-imapd dovecot-lmtpd openssl certbot
echo ">> 初始配置完成"
##############################################################
# 配置Postfix邮件服务器
##############################################################
echo "==> 配置Postfix..."
# 配置Postfix主配置文件
cat > /etc/postfix/main.cf <<EOF
# 主配置参数
myhostname = $MAIL_DOMAIN
mydomain = $MAIL_DOMAIN
myorigin = \$mydomain
inet_interfaces = all
inet_protocols = all
# 通用邮件参数
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
# 虚拟域名配置
virtual_mailbox_domains = $MAIL_DOMAIN
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_alias_maps = hash:/etc/postfix/virtual
virtual_alias_domains =
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_transport = lmtp:unix:private/dovecot-lmtp
# TLS设置自动替换SSL路径
smtpd_use_tls = yes
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/$MAIL_DOMAIN/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/$MAIL_DOMAIN/privkey.pem
# 防垃圾邮件设置
disable_vrfy_command = yes
smtpd_helo_restrictions = permit_mynetworks,reject_invalid_helo_hostname,permit
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
EOF
echo ">> Postfix基础配置完成"
##############################################################
# 配置邮箱用户与域名映射
##############################################################
echo "==> 创建虚拟邮箱配置..."
# 创建邮箱存储目录
mkdir -p /var/mail/vhosts/$MAIL_DOMAIN
chown -R vmail:vmail /var/mail
# 创建虚拟别名(管理员收件)
echo "$ADMIN_EMAIL" > /etc/postfix/virtual
# 创建用户邮箱映射(示例用户)
echo "user1@example.com $MAIL_DOMAIN/user1/" > /etc/postfix/vmailbox
# 生成哈希数据库
postmap /etc/postfix/virtual
postmap /etc/postfix/vmailbox
echo ">> 邮箱账户配置完成"
##############################################################
# Dovecot 配置
##############################################################
echo "==> 配置Dovecot..."
# 创建主配置
cat > /etc/dovecot/dovecot.conf <<EOF
protocols = imap lmtp
listen = *
disable_plaintext Authentication = yes
# 账户配置
defaultibble_uid = vmail
defaultibble_gid = vmail
mail_location = maildir:/var/mail/vhosts/%d/%n
# SSL证书路径自动替换
ssl = required
ssl_cert = </etc/letsencrypt/live/$MAIL_DOMAIN/fullchain.pem
ssl_key = </etc/letsencrypt/live/$MAIL_DOMAIN/privkey.pem
EOF
# 配置IMAP/LMTP协议
cat > /etc/dovecot/conf.d/10-master.conf <<EOF
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service imap {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
}
EOF
echo ">> Dovecot配置完成"
##############################################################
# 获取SSL证书Let's Encrypt
##############################################################
echo "==> 申请SSL证书..."
if [ ! -d "/etc/letsencrypt/live/$MAIL_DOMAIN" ]; then
certbot certonly --standalone --agree-tos --no-eff-email \
--email $ADMIN_EMAIL \
-d $MAIL_DOMAIN
# 设置定时更新
(crontab -l ; echo "0 0 * * * certbot renew --quiet") | crontab -
fi
echo ">> SSL证书获取完成"
##############################################################
# 防火墙配置
##############################################################
echo "==> 配置防火墙..."
if ! systemctl is-active --quiet ufw; then
ufw allow 'OpenSSH'
ufw allow "$MAIL_IP"/4
ufw enable
fi
ufw allow 25/tcp # SMTP
ufw allow 587/tcp # Submission
ufw allow 465/tcp # SMTPS
ufw allow 143/tcp # IMAP
ufw allow 993/tcp # IMAPS
ufw reload
echo ">> 防火墙配置完成"
##############################################################
# 启动服务并测试
##############################################################
echo "==> 启动服务..."
systemctl restart postfix
systemctl restart dovecot
# 检查服务状态
systemctl status postfix
systemctl status dovecot
echo "--------------------"
echo "部署完成,请验证服务:"
echo "1. 检查端口 25/587/993 是否开放"
echo "2. 发送测试邮件echo \"测试邮件正文\" | mail -s \"测试标题\" $ADMIN_EMAIL"
echo "3. 查看日志tail -f /var/log/mail.log"
echo "--------------------"