Shell编程实战案例:带交互式输入的邮件服务一键自动化配置
前言
前面我们完成了数据库自动备份实战脚本,掌握了变量、定时清理、日志、文件同步等基础自动化能力。本次实战聚焦服务器邮件告警自动化部署,完整运用前面学到的read用户交互、cat << EOF多行文本写入、静默软件安装、输出重定向、系统服务管理等核心语法。
本脚本面向运维新手,全程交互式输入,只需填写邮箱服务商、账号、授权码,一键完成邮件工具安装、配置文件写入、服务启动、发信测试,搭建服务器告警邮件能力,后续可结合监控脚本实现故障自动发邮件告警。
一、案例整体介绍
1. 应用场景
- 服务器初始化批量配置:新服务器一键部署邮件发送能力,无需手动修改系统配置文件;
- 运维监控告警底座:数据库宕机、磁盘爆满、服务异常时,脚本自动发送告警邮件给运维人员;
- 标准化环境交付:零基础运维人员无需了解SMTP、mailx配置细节,输入信息即可完成部署。
2. 核心脚本需求
- 交互式输入:使用
read -p友好中文提示,接收用户输入【邮箱服务商、邮箱账号、第三方授权码】; - 静默安装依赖:自动安装
mailx、sendmail邮件工具,屏蔽安装冗余输出; - 动态写入配置:通过
cat >> /etc/mail.rc << EOF将用户输入的信息写入系统邮件配置; - 自动启动邮件服务:配置完成后启动 sendmail 服务;
- 自动发送测试邮件,验证配置是否生效;
- 全程无复杂手动操作,降低配置门槛。
3. 前置关键知识点梳理
(1)read 交互式输入命令
基础语法:
read-p"提示文字"自定义变量名执行逻辑:终端打印提示文字,等待用户键盘输入,输入完成回车后,内容存入指定变量。
本案例会三次调用 read,分别获取服务商、邮箱账号、授权码。
(2)cat << EOF 多行文本写入
作用:脚本内批量写入多行固定文本,支持解析$变量,动态填充用户输入的邮箱信息;
语法规则:首尾EOF标记包裹文本块,使用>>追加写入,不会覆盖原有配置。
(3)静默安装yum install xxx -y >/dev/null
>/dev/null标准输出黑洞,屏蔽yum安装过程大量打印,界面干净整洁。
(4)邮件发送测试命令
echo"邮件正文内容"|mail-s"邮件主题"接收邮箱地址管道符将echo输出的文本作为邮件内容,-s指定邮件标题。
(5)授权码说明(重要避坑)
- 获取路径:邮箱网页设置 → POP3/SMTP服务 → 开启服务 → 短信验证生成授权码;
- 区分:授权码 ≠ 网页登录密码,第三方客户端/脚本发邮件必须使用授权码;
- 数量限制:普通邮箱最多2个授权码,VIP账号最多10个。
(6)主流邮箱SMTP地址对照表
| 邮箱服务商 | SMTP服务器地址 | SMTP端口 |
|---|---|---|
| 163邮箱 | smtp.163.com | 465 |
| QQ邮箱 | smtp.qq.com | 465 |
| 126邮箱 | smtp.126.com | 465 |
二、完整可执行脚本 mail_auto.sh
#!/bin/bash# 脚本名称:mail_auto.sh# 功能:交互式一键部署邮件发送服务,支持163/QQ/126邮箱# 适用系统:CentOS/RHEL 系列# 编写时间:2026-07-08echo"==================== 邮件服务自动化配置工具 ===================="echo"仅支持 163 / QQ / 126 邮箱,配置前请提前开启POP3/SMTP并获取授权码"echo"================================================================="# 1. 交互式读取用户输入read-p"请输入邮箱服务商(填写163/qq/126):"providerread-p"请输入完整发件邮箱账号:"mail_userread-p"请输入邮箱SMTP授权码:"mail_pass# 2. 根据服务商匹配对应SMTP服务器地址if[$provider=="163"];thensmtp_server="smtp.163.com"elif[$provider=="qq"];thensmtp_server="smtp.qq.com"elif[$provider=="126"];thensmtp_server="smtp.126.com"elseecho"输入服务商错误,仅支持163/qq/126,脚本退出!"exit1fi# 3. 静默安装邮件依赖工具,屏蔽安装输出echo"正在自动安装 mailx、sendmail 邮件组件..."yuminstallmailxsendmail-y>/dev/null2>/dev/null# 4. 动态追加邮件配置到 /etc/mail.rcecho"正在写入系统邮件配置文件 /etc/mail.rc ..."cat>>/etc/mail.rc<<EOF # ========== 自动化脚本生成邮件配置 ========== set from=${mail_user}set smtp=${smtp_server}:465 set smtp-auth-user=${mail_user}set smtp-auth-password=${mail_pass}set smtp-auth=login set smtp-use-starttls set ssl-verify=ignore EOF# 5. 启动sendmail邮件服务echo"启动sendmail邮件服务..."systemctl startsendmailsystemctlenablesendmail>/dev/null2>/dev/null# 6. 发送测试邮件验证配置read-p"请输入接收测试邮件的目标邮箱:"target_mailecho"这是Shell脚本自动发送的测试邮件,邮件服务配置成功!"|mail-s"【服务器邮件告警测试】"${target_mail}echo"================================================================="echo"配置完成!请登录目标邮箱查看是否收到测试邮件"echo"若未收到,请检查授权码、SMTP服务是否正常开启"echo"================================================================="三、逐行代码拆解 + 执行前后效果演示
1. 脚本头部 Shebang 与注释
#!/bin/bash# 脚本名称:mail_auto.sh# 功能:交互式一键部署邮件发送服务,支持163/QQ/126邮箱# 适用系统:CentOS/RHEL 系列# 编写时间:2026-07-08echo"==================== 邮件服务自动化配置工具 ===================="echo"仅支持 163 / QQ / 126 邮箱,配置前请提前开启POP3/SMTP并获取授权码"echo"================================================================="- 代码含义:
#!/bin/bash指定Bash解释器;注释用于后期维护;开头echo打印提示分割线,提升交互可读性。 - 运行效果:执行脚本后终端先打印两行提示文字,告知用户前置准备工作。
2. read交互式输入核心代码
read-p"请输入邮箱服务商(填写163/qq/126):"providerread-p"请输入完整发件邮箱账号:"mail_userread-p"请输入邮箱SMTP授权码:"mail_pass- 语法解析:
-p后跟自定义中文提示,输入内容自动存入后方变量; - 执行效果演示:
请输入邮箱服务商(填写163/qq/126):163 请输入完整发件邮箱账号:test123@163.com 请输入邮箱SMTP授权码:ABCDEFG123456输入完成后变量赋值:provider="163"、mail_user="test123@163.com"、mail_pass="ABCDEFG123456"
- 关键注意:授权码不能填登录密码,否则发邮件会认证失败。
3. if多分支匹配SMTP服务器地址
if[$provider=="163"];thensmtp_server="smtp.163.com"elif[$provider=="qq"];thensmtp_server="smtp.qq.com"elif[$provider=="126"];thensmtp_server="smtp.126.com"elseecho"输入服务商错误,仅支持163/qq/126,脚本退出!"exit1fi- 代码含义:根据用户输入的服务商,自动匹配对应SMTP地址;输入错误直接提示并退出脚本;
- 空格避坑:
[ ]括号两侧必须保留空格,否则脚本直接报错。
4. 静默安装邮件依赖
yuminstallmailxsendmail-y>/dev/null2>/dev/null- 参数解析:
mailx:Linux发送邮件工具;sendmail:邮件传输服务;> /dev/null屏蔽标准输出,2>/dev/null屏蔽安装报错;
- 执行效果:终端仅打印「正在自动安装 mailx、sendmail 邮件组件…」,不会刷屏打印yum下载、安装日志,界面简洁。
5. cat << EOF 动态写入系统配置文件
cat>>/etc/mail.rc<<EOF # ========== 自动化脚本生成邮件配置 ========== set from=${mail_user}set smtp=${smtp_server}:465 set smtp-auth-user=${mail_user}set smtp-auth-password=${mail_pass}set smtp-auth=login set smtp-use-starttls set ssl-verify=ignore EOF- 核心原理:
>>追加写入,保留原有/etc/mail.rc全部配置,不会覆盖;- EOF作为文本起止标记,中间内容支持解析
$变量,自动替换为用户输入的邮箱信息;
- 执行前后对比:
- 执行前:
/etc/mail.rc无SMTP发件配置; - 执行后:文件末尾自动追加完整邮箱配置,变量全部替换为真实内容:
- 执行前:
# ========== 自动化脚本生成邮件配置 ========== set from=test123@163.com set smtp=smtp.163.com:465 set smtp-auth-user=test123@163.com set smtp-auth-password=ABCDEFG123456 set smtp-auth=login set smtp-use-starttls set ssl-verify=ignore6. 启动并开机自启sendmail服务
systemctl startsendmailsystemctlenablesendmail>/dev/null2>/dev/null- 代码含义:立即启动邮件传输服务;设置开机自动启动,屏蔽开机输出日志;
- 运行效果:服务启动成功,服务器重启后邮件功能自动生效。
7. 交互式输入接收邮箱 + 发送测试邮件
read-p"请输入接收测试邮件的目标邮箱:"target_mailecho"这是Shell脚本自动发送的测试邮件,邮件服务配置成功!"|mail-s"【服务器邮件告警测试】"${target_mail}- 管道逻辑:
echo输出文本作为邮件正文;-s指定邮件标题; - 执行效果:输入接收邮箱回车后,后台自动发送邮件,登录目标邮箱即可收到测试消息;
- 失败排查:收不到邮件优先检查授权码、是否开启POP3/SMTP、SMTP服务器地址是否匹配。
四、脚本完整部署、执行与验证步骤
步骤1:创建脚本文件
vimmail_auto.sh粘贴完整代码,保存退出。
步骤2:添加执行权限
新建文件默认无执行权限,必须授权:
chmod+x mail_auto.sh步骤3:运行交互式配置脚本
./mail_auto.sh按照终端提示依次输入:邮箱服务商、发件邮箱、授权码、接收测试邮件的邮箱。
步骤4:功能验证操作
- 查看系统邮件配置是否写入成功
cat/etc/mail.rc拉到文件末尾,确认存在脚本自动生成的SMTP配置;
2. 检查sendmail服务运行状态
systemctl statussendmail显示active (running)代表服务正常;
3. 登录接收邮箱,查看收件箱/垃圾邮件,确认测试邮件送达。
五、核心知识点总结与避坑指南
1. read交互式命令重点
read -p必须搭配提示文字,降低用户操作门槛;- 所有用户输入统一存入变量,后续配置直接调用,无需重复输入;
- 适合运维标准化工具,不懂技术的人员也能按提示完成配置。
2. cat << EOF 配置写入易错点
- 必须使用
>>追加,禁止使用>,否则清空系统原有邮件配置; - EOF前后不能加空格、引号,否则文本写入失效;
- 块内可直接使用
$变量,脚本运行时自动解析替换。
3. 邮箱授权码高频踩坑
- 填网页登录密码:直接报认证失败,必须使用授权码;
- 未开启POP3/SMTP服务:无法生成授权码,邮件发送失败;
- 授权码过期/达到数量上限:删除旧授权码重新生成。
4. 输出重定向使用规范
> /dev/null屏蔽标准打印,2>/dev/null屏蔽报错;- 脚本调试阶段删除重定向,方便查看报错;上线后添加,保持界面干净。
5. 邮件发送失败排查清单
- 核对服务商与SMTP地址是否匹配;
- 确认授权码正确、POP3/SMTP已开启;
- sendmail服务是否正常运行;
- 服务器防火墙是否放行465端口。
六、脚本拓展方向(结合运维监控实战)
- 去掉交互式read,固定写入邮箱信息,集成到服务器监控脚本,服务异常自动发告警;
- 增加附件发送功能,监控脚本自动打包日志作为邮件附件推送;
- 添加邮件发送日志,每次发送记录时间、接收邮箱、发送结果;
- 判断邮件发送失败时,重复重试2次,提升告警可靠性;
- 对接企业微信/钉钉机器人,实现多渠道告警。