如何编写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
相关产品推荐
相关产品推荐

