You need to enable JavaScript to run this app. 如何编写PowerShell脚本实现每分钟发邮件不阻塞输入直至输入Y/y退出
优惠活动
大模型
产品
解决方案
定价
更多

如何编写PowerShell脚本实现每分钟发邮件不阻塞输入直至输入Y/y退出

PowerShell 非阻塞定时发邮件交互脚本实现

依靠PowerShell原生后台作业机制解耦两个独立流程,完全满足「邮件定时发送不阻塞输入、输入即时响应」的核心要求,无需依赖第三方扩展模块。

核心实现逻辑

  • 将每分钟发邮件的循环逻辑封装到独立后台作业中,与主控制台进程完全隔离,作业运行时不会抢占前台的输入响应能力
  • 主控制台进程全程运行即时输入监听循环,每次读取到用户输入后立刻校验,非有效退出指令时马上回到输入提示界面,不存在额外等待
  • 收到Y/y退出指令时,第一时间终止后台邮件作业,完成脚本退出

完整可运行脚本

# -------------------------- 用户可自定义配置区 --------------------------
$smtpServer = "你的SMTP服务器地址"
$smtpPort = 587
$senderAccount = "发件人邮箱@xxx.com"
$senderAuth = "发件人邮箱授权码"
$recipientList = @("收件人1@xxx.com")
$mailSubject = "定时告警提醒"
$mailBody = "这是脚本定时发送的告警邮件"
# -----------------------------------------------------------------------

# 启动独立后台作业,承载每分钟发邮件的逻辑
$mailJob = Start-Job -ScriptBlock {
    param(
        $smtpServer,
        $smtpPort,
        $senderAccount,
        $senderAuth,
        $recipientList,
        $mailSubject,
        $mailBody
    )
    while ($true) {
        try {
            $mailParams = @{
                SmtpServer  = $smtpServer
                Port        = $smtpPort
                From        = $senderAccount
                To          = $recipientList
                Subject     = $mailSubject
                Body        = $mailBody
                Credential  = (New-Object System.Management.Automation.PSCredential(
                    $senderAccount, 
                    (ConvertTo-SecureString $senderAuth -AsPlainText -Force)
                ))
                UseSsl      = $true
                ErrorAction = "Stop"
            }
            Send-MailMessage @mailParams
        }
        catch {
            # 邮件发送异常时可在此扩展日志记录逻辑
        }
        # 间隔60秒发送下一封邮件
        Start-Sleep -Seconds 60
    }
} -ArgumentList $smtpServer, $smtpPort, $senderAccount, $senderAuth, $recipientList, $mailSubject, $mailBody

# 前台主循环:即时处理用户输入,无阻塞等待
while ($true) {
    $userInput = Read-Host 'Enter "Y" to exit alert >>:'
    $cleanInput = $userInput.Trim()
    if ($cleanInput -eq 'Y' -or $cleanInput -eq 'y') {
        # 立刻终止后台邮件作业
        Stop-Job -Job $mailJob
        Remove-Job -Job $mailJob -Force
        Write-Output "Exited"
        break
    }
}

运行说明

  • 使用前需要替换配置区内的SMTP服务器、账号、收件人等参数,匹配实际邮件发送环境
  • 脚本运行效果和示例交互完全一致:后台按固定每分钟频率发送邮件,前台每次输入完成后立刻返回提示,无需等待邮件发送周期
  • 邮件发送的耗时、异常处理逻辑全部在后台作业内运行,不会拖慢前台的输入响应速度

内容的提问来源于stack exchange,提问作者Moshin Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 12:45:03