archi
11.04.2024 #Windows

Отправка писем себе с 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 "Произошла ошибка при отправке сообщения: $_"
    }