Отправка писем себе с 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. Добавьте задание в планировщике задач:
- Нажмите Win + R, введите “taskschd.msc”.
- В окне Планировщика задач выберите “Создать базовое задание” в правой панели.
- Выберите “Ежедневно” и укажите удобное для вас время.
- Выберите “Запуск программы” и нажмите “Далее”.
- Настройте скрипт PowerShell:
- Введите путь к исполняемому файлу PowerShell (обычно “
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
“). - Добавьте аргумент
-File "C:\Users\Administrator\Desktop\sendCheckDisk.ps1"
- Введите путь к исполняемому файлу PowerShell (обычно “
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 "Произошла ошибка при отправке сообщения: $_"
}