根据上一封邮件的发送时间发送邮件

时间:2019-02-05 19:48:36

标签: powershell scheduled-tasks

我有一个脚本,用于检查网站是否在线,并在网站关闭时发送邮件。 该脚本配置有计划任务,该任务每30分钟运行一次。

问题如下:

如果该站点在周末或晚上(或我不监视邮箱的一天)关闭,则邮件将继续发送。

我想知道,如果上次发送邮件的时间是3小时之前,我可以使用哪种方法仅发送邮件?

基于这种方式,我每3小时只能发送一次邮件。

我研究了注册表项的使用,但想知道这是否是正确的方法。

2 个答案:

答案 0 :(得分:4)

我会使用一个简单的配置文件而不是注册表来存储在ProgramData中(如果需要按用户配置,则应使用AppData)

这使得加载/保存参数以及添加新参数的过程非常容易。 另外,如果您需要保存日志和/或其他数据,可以将它们放在同一文件夹中。

$ConfigFullPath = "$env:APPDATA\My Monitoring solution\config.json"

# This create the config file if none is present. 
if (-not (Test-Path  $ConfigFullPath))  {
    New-Item -ItemType File -Path $ConfigFullPath -Value ([PSCustomObject]@{'LastEmailSent' = [datetime]::MinValue}| ConvertTo-Json) -Force
}


$ConfigFileParams = ConvertFrom-Json -InputObject (get-content "$env:APPDATA\My Monitoring solution\config.json" -raw)

$SendEmail = ([Datetime]::UtcNow - ([DateTime]$ConfigFileParams.LastEmailSent)).TotalHours -ge 3


if ($SendEmail) {

    try {
        # Send-MailMessage  -ErrorAction Stop
        # Once email is sent, we update the config
        $ConfigFileParams.LastEmailSent = [DateTime]::UtcNow
        $ConfigFileParams | ConvertTo-Json | Out-File $ConfigFullPath
    }
    Catch {
        #Manage what to do in case of failure
    }

}

话虽这么说,您绝对可以使用注册表来执行相同的操作。 为了方便和易于使用,我强烈建议您使用一种基于json文件的简单方法。

答案 1 :(得分:0)

我认为最好的选择是将开始时间写在磁盘上保存的文件中,并且每次运行脚本以测试是否

(currentHour-hourFirstSent)%3==0 && currentMinute<30

您放置了文件yyyy-mm-dd的名称,如果该文件存在,则从文件中读取开始时间,如果没有,则创建它并保存其中的开始时间。