Отправка писем себе с Windows Server 2019

Задача: Есть сервак, на нём вращается MSSQL и 3 диска. Необходимо присылать письмо на сервер с остатком свободного места на дисках.

Решение: Создадим задание в планировщике задач и напишем скрипт в PowerShell, который будет прислать письмо.

Шаги:

  1. Создайте скрипт PowerShell:
    • Создайте новый файл с расширением “.ps1” (например “sendCheckDisk.ps1”).
    • Я для удобства, положу его на рабочий стол C:\Users\Administrator\Desktop
    • Вставьте следующий скрипт, чтобы проверить доступное место на всех дисках и отправить результат на вашу почту:
# Получение информации о диске
$diskInfo = Get-WmiObject -Class Win32_LogicalDisk |
    Where-Object { $_.DeviceID -ne 'D:' } |  # Исключаем диск D:
    Select-Object DeviceID, @{
        Name = "FreeSpaceGB";
        Expression = { "{0:N2} Gb" -f ($_.FreeSpace / 1GB) } # Форматирование в гигабайты
    }

# Создание учетных данных
$plainPassword = "ВАШ_ПАРОЛЬ_ОТ_ЯЩИКА"  # Подтвердите, что этот пароль верный
$securePassword = ConvertTo-SecureString -String $plainPassword -AsPlainText -Force
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "ЯЩИК_ДОСТУПА@yandex.ru", $securePassword

# Определение параметров письма
$emailParams = @{
    SmtpServer = "smtp.yandex.ru"
    Port = 587
    UseSsl = $true
    Credential = $credential
    From = "devops@esh-derevenskoe.ru"
    To = "devops@esh-derevenskoe.ru"
    Subject = "Available Space on mssql-1C-1 Disks"
    Body = ($diskInfo | Format-Table | Out-String)
}

# Вывод параметров для проверки
Write-Output "SMTP Server: $($emailParams.SmtpServer)"
Write-Output "Port: $($emailParams.Port)"
Write-Output "Use SSL: $($emailParams.UseSsl)"
Write-Output "From: $($emailParams.From)"
Write-Output "To: $($emailParams.To)"
Write-Output "Subject: $($emailParams.Subject)"
Write-Output "Body: $($emailParams.Body)"

# Отправка письма
try {
    Send-MailMessage @emailParams -ErrorAction Stop
} catch {
    Write-Error "Произошла ошибка при отправке сообщения: $_"
}

2. Добавьте задание в планировщике задач:

  1. Нажмите Win + R, введите “taskschd.msc”.
  2. В окне Планировщика задач выберите “Создать базовое задание” в правой панели.
  3. Выберите “Ежедневно” и укажите удобное для вас время.
  4. Выберите “Запуск программы” и нажмите “Далее”.
  5. Настройте скрипт PowerShell:
    • Введите путь к исполняемому файлу PowerShell (обычно “C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe“).
    • Добавьте аргумент -File "C:\Users\Administrator\Desktop\sendCheckDisk.ps1"
Что-то вроде такого

3. Протестируем из PowerShell наш скрипт

Запускаем так:
PowerShell -File "C:\Users\Administrator\Desktop\sendCheckDisk.ps1"

Если будут ошибки, тут вы их увидете.

4. Наслаждаемся результатом

P.S. Можно было запустить Nagios или Chronograf, но у любой задачи, есть цена. Для этой задачи, стороннее решение было бы избыточно.

p.s. Добавим еще состав директории

 # Получение информации о диске
$diskInfo = Get-WmiObject -Class Win32_LogicalDisk |
    Where-Object { $_.DeviceID -ne 'D:' } |  # Исключаем диск D:
    Select-Object DeviceID, @{
        Name = "FreeSpaceGB";
        Expression = { "{0:N2} Gb" -f ($_.FreeSpace / 1GB) } # Форматирование в гигабайты с добавлением 'Gb'
    }

# Получение содержимого директории M:\backup
# Получение содержимого директории M:\backup с размерами в гигабайтах
$backupContents = Get-ChildItem -Path "M:\backup" | 
    Select-Object Name, 
        @{Name="Size (GB)"; Expression={[math]::Round(($_.Length / 1GB), 2)}}

# Создание учетных данных
$plainPassword = "ВАШ_ПАРОЛЬ_ОТ_ЯЩИКА"  # Подтвердите, что этот пароль верный
$securePassword = ConvertTo-SecureString -String $plainPassword -AsPlainText -Force
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "ЯЩИК_ДОСТУПА@yandex.ru", $securePassword

# Определение параметров письма
$emailParams = @{
    SmtpServer = "smtp.yandex.ru"
    Port = 587
    UseSsl = $true
    Credential = $credential
    From = "dev@esh-derevenskoe.ru"
    To = "dev@esh-derevenskoe.ru"
    Subject = "Available Space on mssql-1C-1 Disks and Backup Contents"
    Body = "Available Disk Space:`n" + ($diskInfo | Format-Table | Out-String) + "`nBackup Contents:`n" + ($backupContents | Format-Table | Out-String)
}

# Вывод параметров для проверки
Write-Output "SMTP Server: $($emailParams.SmtpServer)"
Write-Output "Port: $($emailParams.Port)"
Write-Output "Use SSL: $($emailParams.UseSsl)"
Write-Output "From: $($emailParams.From)"
Write-Output "To: $($emailParams.To)"
Write-Output "Subject: $($emailParams.Subject)"
Write-Output "Body: $($emailParams.Body)"

# Отправка письма
try {
    Send-MailMessage @emailParams -ErrorAction Stop
} catch {
    Write-Error "Произошла ошибка при отправке сообщения: $_"
}