如何通过PowerShell实现Office365在线Outlook的定时邮件发送
Office 365 在线版PowerShell脚本定时发信实现方法
现有脚本已跑通即时发信逻辑,无需重构核心发信代码,通过两种方式即可实现定时需求:
推荐方案:依托Windows任务计划程序触发发信
这是稳定性最高、故障排查最便捷的实现方式,完全适配现有代码结构:
- 保留脚本中所有SMTP配置、邮件内容构造的逻辑,将
$Smtp.Send($Message)作为脚本的最终执行动作 - 打开系统自带的「任务计划程序」新建定时任务:触发器按需配置发送规则(支持单次定点发送、按固定周期重复发送),操作项设置为启动PowerShell进程,执行路径指向已写好的发信脚本
- 任务配置中务必勾选「不管用户是否登录都要运行」「使用最高权限运行」选项,避免到点因会话锁定、权限不足导致脚本无法执行
这种方案不存在脚本长时间挂起等待的资源占用问题,发信执行结果会被任务计划完整记录日志,不会因机器休眠、进程被误关导致邮件漏发
备选方案:脚本内置等待逻辑实现单次定时
如果需要在单次脚本运行流程中直接嵌入定时逻辑,不需要依赖外部调度工具,仅需在发信动作前增加一段等待判断,代码改动量极小:
- 在完成SMTP配置、邮件内容对象构造后,先定义目标发送时间,例如固定写定需要发送的时间点:
$TargetSendTime = Get-Date "2024-06-20 16:00:00" - 计算当前时间与目标时间的差值,等待到点后再执行原有Send动作,参考代码:
# 计算当前时间到目标发送时间的等待时长 $WaitDuration = New-TimeSpan -Start (Get-Date) -End $TargetSendTime # 仅当等待时长为正值时执行休眠 if ($WaitDuration.TotalSeconds -gt 0) { Start-Sleep -Seconds $WaitDuration.TotalSeconds } # 到点触发原有即时发信逻辑 $Smtp.Send($Message)
- 需明确该方案的硬限制:运行脚本的机器在等待期间不能关机、不能注销、不能断网,一旦PowerShell进程被终止,定时发信流程就会直接中断
补充提示:当前使用的
System.Net.Mail.SmtpClient类已被微软标记为弃用,长期使用可后续替换为MailKit组件,现有定时逻辑无需改动,换用新组件后可无缝适配。
内容的提问来源于stack exchange,提问作者Narek
相关产品推荐
相关产品推荐

