本来邮箱客户端设置了接收后删除邮件,结果hmailserver还是不删除,导致一直在膨胀,还好有AI,直接搞个计划任务就把旧邮件给删了:
# ============================================
# 配置参数
# ============================================
$AdminUser = "Administrator"
$AdminPass = "123456"
# 多少天前
$DaysToKeep = 40
$FolderName = "INBOX"
# ============================================
# 日志配置
# ============================================
$LogFile = "C:\hMailServerClean.log"
# 写入日志的函数(同时输出到屏幕和文件)
function Write-Log {
param([string]$Message)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logLine = "[$timestamp] $Message"
Write-Host $logLine
Add-Content -Path $LogFile -Value $logLine
}
# ============================================
# 开始清理
# ============================================
Write-Log "==========>>>> 开始清理 $($DaysToKeep) 天前的邮件 <<<<=========="
try {
$hms = New-Object -ComObject "hMailServer.Application"
$hms.Authenticate($AdminUser, $AdminPass)
Write-Log "连接 hMailServer 成功,域数量: $($hms.Domains.Count)"
} catch {
Write-Log "连接 hMailServer 失败: $_"
exit
}
$TotalDeleted = 0
for ($d = 0; $d -lt $hms.Domains.Count; $d = $d + 1) {
$domain = $hms.Domains.Item($d)
Write-Log "处理域: $($domain.Name)"
for ($a = 0; $a -lt $domain.Accounts.Count; $a = $a + 1) {
$account = $domain.Accounts.Item($a)
try {
$messages = $account.IMAPFolders.ItemByName($FolderName).Messages
$deleted = 0
for ($i = $messages.Count - 1; $i -ge 0; $i = $i - 1) {
$msg = $messages.Item($i)
$daysOld = (Get-Date).Subtract($msg.InternalDate).Days
if ($daysOld -gt $DaysToKeep) {
$messages.DeleteByDBID($msg.ID)
$deleted = $deleted + 1
}
}
if ($deleted -gt 0) {
Write-Log " [$($account.Address)] 已删除 $deleted 封过期邮件"
$TotalDeleted = $TotalDeleted + $deleted
}
}
catch {
Write-Log " [$($account.Address)] 跳过 (可能无 INBOX 或权限问题)"
}
}
}
Write-Log "========================================"
Write-Log "全部完成!共删除 $TotalDeleted 封过期邮件。"
Write-Log "日志已保存至: $LogFile"