我们用宝塔邮局,会发现宝塔邮局的收件箱的右上角的保留天数有时候无效,或者就是我们想全部清理一下怎么办?
尤其是做注册的收件需求的,所有邮件不需要保留,结果却因为邮件无法清理,硬盘满了进不去服务器了
本篇教程,教您,怎么不删除账号,删除宝塔邮局所有收件箱、发件箱内容,腾出空间
目标:
1、清理全部邮件
2、不删除邮箱账号,不影响邮箱运行
3、服务器腾出空间,把日志什么不需要的全删了
第一步 连上SSH
第二步 执行下面清理命令
全选复制下面命令,在ssh粘贴,执行
注意:清理期间,无法访问宝塔什么的,因为满负荷运行,等执行完毕就好了
# 创建脚本文件
cat > /root/mail_cleaner.sh << 'EOF'
#!/bin/bash
echo "=== 邮件文件夹清理工具(交互版)==="
# 记录开始时间
START_TIME=$(date +%s)
# 查找所有域名
MAIL_BASE="/www/vmail"
DOMAINS=($(find "$MAIL_BASE" -maxdepth 1 -type d -exec basename {} \; | grep -v "^vmail$" | sort))
# 检查是否有域名
if [ ${#DOMAINS[@]} -eq 0 ]; then
echo "错误:在 $MAIL_BASE 下未找到任何域名!"
exit 1
fi
# 显示域名列表
echo "可用的域名列表:"
echo "0. 全部清理 (all)"
for i in "${!DOMAINS[@]}"; do
echo "$((i+1)). ${DOMAINS[$i]}"
done
# 用户选择域名(直接回车默认全部清理)
echo ""
echo -n "请选择要清理的域名 (输入数字 0-${#DOMAINS[@]} 或 all,直接回车默认全部清理): "
read choice
# 处理域名选择(直接回车默认为全部清理)
if [[ "$choice" == "0" || "$choice" == "all" || "$choice" == "全部" || -z "$choice" ]]; then
SELECTED_DOMAINS=("${DOMAINS[@]}")
if [[ -z "$choice" ]]; then
echo "您选择了:全部清理(默认)"
else
echo "您选择了:全部清理"
fi
else
# 检查输入是否有效
if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le ${#DOMAINS[@]} ]; then
index=$((choice-1))
SELECTED_DOMAINS=("${DOMAINS[$index]}")
echo "您选择了:${DOMAINS[$index]}"
else
echo "错误:无效的选择!"
exit 1
fi
fi
# 清理范围选择
echo ""
echo "请选择清理范围:"
echo "1. 清理发件箱 (cur、tmp 目录)"
echo "2. 清理收件箱 (new、tmp 目录)"
echo "3. 全部清理 (cur、new、tmp 目录)"
echo -n "请输入选择 (直接回车默认3-全部清理): "
read cleanup_scope
# 处理清理范围选择
case "$cleanup_scope" in
"1")
FOLDERS=("cur" "tmp")
SCOPE_NAME="发件箱 (cur、tmp)"
;;
"2")
FOLDERS=("new" "tmp")
SCOPE_NAME="收件箱 (new、tmp)"
;;
"3"|"")
FOLDERS=("cur" "new" "tmp")
SCOPE_NAME="全部邮箱 (cur、new、tmp)"
;;
*)
echo "错误:无效的清理范围选择!"
exit 1
;;
esac
if [[ -z "$cleanup_scope" ]]; then
echo "您选择了:$SCOPE_NAME(默认)"
else
echo "您选择了:$SCOPE_NAME"
fi
# 确认操作(直接回车默认为y)
echo ""
echo "========================================"
echo "即将执行以下操作:"
echo "- 清理域名: ${SELECTED_DOMAINS[*]}"
echo "- 清理范围: $SCOPE_NAME"
echo "========================================"
echo -n "确认开始清理吗?(Y/n,直接回车默认确认): "
read confirm
# 处理确认选择(直接回车、y、Y 都确认为继续)
if [[ "$confirm" =~ ^[Nn]$ ]]; then
echo "操作已取消"
exit 0
else
echo "确认执行清理操作..."
fi
# 清理函数(带进度显示)
clean_domain() {
local domain="$1"
echo ""
echo "====== 开始清理域名: $domain ======"
local mail_base="/www/vmail/$domain"
local mail_users=($(find "$mail_base" -maxdepth 1 -type d -exec basename {} \; | grep -v "^$domain$" | sort))
if [ ${#mail_users[@]} -eq 0 ]; then
echo "在 $domain 下未找到任何邮箱账号"
return
fi
local total_cleaned=0
local total_accounts=0
local total_users=${#mail_users[@]}
local current_user=0
echo "该域名下共有 $total_users 个邮箱账号需要处理"
echo "----------------------------------------"
for user in "${mail_users[@]}"; do
if [ -n "$user" ]; then
current_user=$((current_user + 1))
user_dir="$mail_base/$user"
# 显示进度
echo "[$current_user/$total_users] 处理账号: $user"
local user_cleaned=0
for folder in "${FOLDERS[@]}"; do
target_dir="$user_dir/$folder"
if [ -d "$target_dir" ] && [ "$(ls -A "$target_dir")" ]; then
file_count=$(ls -1 "$target_dir" | wc -l)
echo " 清理: $folder/ ($file_count 个文件)"
rm -rf "$target_dir"/*
user_cleaned=$((user_cleaned + file_count))
fi
done
total_cleaned=$((total_cleaned + user_cleaned))
total_accounts=$((total_accounts + 1))
if [ $user_cleaned -gt 0 ]; then
echo " ✓ 此账号清理了 $user_cleaned 个文件"
else
echo " ○ 此账号无需清理"
fi
# 显示剩余账号和进度百分比
remaining=$((total_users - current_user))
progress=$((current_user * 100 / total_users))
echo " 进度: $progress% | 剩余: $remaining 个账号"
echo " ------------------------------------"
fi
done
echo "✓ 域名 $domain 清理完成: $total_accounts 个账号, 共 $total_cleaned 个文件"
}
# 格式化时间函数
format_duration() {
local total_seconds=$1
if [ $total_seconds -lt 60 ]; then
echo "${total_seconds}秒"
elif [ $total_seconds -lt 3600 ]; then
minutes=$((total_seconds / 60))
seconds=$((total_seconds % 60))
echo "${minutes}分钟${seconds}秒"
else
hours=$((total_seconds / 3600))
minutes=$(( (total_seconds % 3600) / 60 ))
seconds=$((total_seconds % 60))
echo "${hours}小时${minutes}分钟${seconds}秒"
fi
}
# 主清理流程
echo ""
echo "开始清理操作..."
echo "========================================"
# 停止邮件服务
echo "停止邮件服务..."
MAIL_START_TIME=$(date +%s)
sudo bt stop mail
# 执行清理
TOTAL_DOMAINS=${#SELECTED_DOMAINS[@]}
CURRENT_DOMAIN=0
for domain in "${SELECTED_DOMAINS[@]}"; do
CURRENT_DOMAIN=$((CURRENT_DOMAIN + 1))
echo ""
echo ">>> 正在处理域名 [$CURRENT_DOMAIN/$TOTAL_DOMAINS]: $domain"
DOMAIN_START_TIME=$(date +%s)
clean_domain "$domain"
DOMAIN_END_TIME=$(date +%s)
DOMAIN_DURATION=$((DOMAIN_END_TIME - DOMAIN_START_TIME))
echo ">>> 域名 $domain 处理耗时: $(format_duration $DOMAIN_DURATION)"
echo "========================================"
done
# 重启邮件服务
echo ""
echo "重启邮件服务..."
sudo bt start mail
MAIL_END_TIME=$(date +%s)
MAIL_DURATION=$((MAIL_END_TIME - MAIL_START_TIME))
# 计算邮件清理阶段耗时
CLEAN_END_TIME=$(date +%s)
CLEAN_DURATION=$((CLEAN_END_TIME - START_TIME))
echo ""
echo "=== 邮件清理操作完成 ==="
echo "清理范围: $SCOPE_NAME"
echo "处理域名: ${SELECTED_DOMAINS[*]}"
echo "邮件清理耗时: $(format_duration $MAIL_DURATION)"
echo "总运行时间: $(format_duration $CLEAN_DURATION)"
echo ""
# 询问是否清理系统日志
echo "========================================"
echo -n "是否安全清理系统日志?可能占用很大 (y/N,直接回车默认不清理): "
read clean_logs
if [[ "$clean_logs" =~ ^[Yy]$ ]]; then
echo ""
echo "开始清理系统日志..."
LOG_START_TIME=$(date +%s)
# 清理当前系统日志
echo "正在清理使用中的系统日志..."
sudo truncate -s 0 /var/log/syslog 2>/dev/null || true
sudo truncate -s 0 /var/log/messages 2>/dev/null || true
sudo truncate -s 0 /var/log/maillog 2>/dev/null || true
echo "✓ 安全清理使用中的日志完成"
# 清理压缩的旧日志文件
echo "正在清理备份的早期日志..."
sudo find /var/log -name "*.gz" -o -name "*.bz2" -o -name "*.[0-9]" -exec rm -f {} \; 2>/dev/null || true
echo "✓ 清理备份的早期日志完成"
# 清理宝塔日志
echo "正在清理宝塔面板日志..."
sudo find /www/server/panel/logs -name "*.log" -exec truncate -s 0 {} \; 2>/dev/null || true
echo "✓ 清理宝塔面板日志完成"
LOG_END_TIME=$(date +%s)
LOG_DURATION=$((LOG_END_TIME - LOG_START_TIME))
echo "系统日志清理完成!耗时: $(format_duration $LOG_DURATION)"
else
echo "跳过系统日志清理"
fi
# 显示磁盘使用情况
echo ""
echo "========================================"
echo "当前磁盘使用情况:"
echo "========================================"
df -h | awk '
NR==1 {
print "文件系统 容量 已用 可用 已用% 挂载点"
print "--------------------------------------------"
}
NR>1 {
printf "%-12s %5s %5s %5s %5s %s\n", $1, $2, $3, $4, $5, $6
}'
# 计算总耗时
END_TIME=$(date +%s)
TOTAL_DURATION=$((END_TIME - START_TIME))
echo ""
echo "========================================"
echo "=== 所有操作完成 ==="
echo "总耗时: $(format_duration $TOTAL_DURATION)"
echo "完成时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"
EOF
# 赋予执行权限
chmod +x /root/mail_cleaner.sh
# 执行脚本
/root/mail_cleaner.sh
清理效果如下,还自带进度显示,有几万个账号的时候,也不怕了
直接全部回车即可
最后还有个,是否清理日志,建议也清理下,可能会清理出大量的空间
第三步 将这个清理功能加入服务器的计划任务(可选,不建议,因此隐藏)
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。



评论(0)