Nội dung email convertto-html powershell

Trong phần đầu tiên của loạt bài này, chúng ta đã thực hiện việc thiết lập một tác vụ theo lịch trình rất cơ bản để giám sát một quy trình và dịch vụ của ứng dụng. Tập lệnh còn lại một chút mong muốn vì nó chỉ ghi nhật ký dữ liệu mà nó thu thập vào một tệp văn bản. Mặc dù điều này tốt cho chế độ xem lịch sử và khả năng phát hiện nguyên nhân gốc rễ, nhưng nó không cung cấp cách để chúng tôi được thông báo tích cực về các lỗi. Chúng tôi sẽ khắc phục điều này ngay hôm nay bằng cách thêm một cảnh báo qua email vào tập lệnh của chúng tôi sẽ gửi email cho chúng tôi khi phát hiện lỗi

Để thực hiện việc này, chúng tôi sẽ sử dụng lệnh ghép ngắn Send-MailMessage và dịch vụ Microsoft Office 365. Điều này sẽ hoạt động với bất kỳ chuyển tiếp email nào bạn có quyền truy cập

Lưu trữ mật khẩu tài khoản email

Trước khi chúng tôi chuyển thẳng vào cài đặt email, chúng tôi có một việc quan trọng cần làm trước. Vì chúng tôi sẽ cần sử dụng mật khẩu để truy cập tài khoản Microsoft 365, hãy chuyển đổi mật khẩu của chúng tôi và lưu trữ mật khẩu bằng chuỗi được mã hóa bên trong tệp văn bản. Mở một cửa sổ PowerShell riêng và điều hướng đến nơi chúng tôi đang chạy tập lệnh, trong trường hợp này là "C. \Scripts\Giám sát". Sau đó, chúng tôi sẽ sử dụng lệnh Get-Credential để được nhắc nhập tên người dùng và mật khẩu tài khoản e-mail mà chúng tôi muốn sử dụng khi gửi email

cd "C:\Scripts\Monitoring"
$credential = Get-Credential
$credential.Password | ConvertFrom-SecureString | Set-Content encryptedPass.txt

Như một lớp phòng ngừa bổ sung, tôi thường tạo một hộp thư dịch vụ chỉ được sử dụng để gửi email trong tài khoản của mình và sẽ không lưu trữ bất kỳ email bí mật nào được gửi đến. Mặc dù điều này là không bắt buộc nhưng tôi khuyên bạn nên thực hiện nếu bạn có giấy phép/hộp thư có sẵn. Một cái gì đó như "alerts@yourdomain. com" hoạt động tuyệt vời

Thêm cảnh báo qua email

Bây giờ chúng tôi có thể bắt đầu định cấu hình cài đặt email của mình bằng cách sử dụng tệp văn bản được mã hóa mà chúng tôi đã tạo. Chúng tôi có thể thêm danh sách các biến Cài đặt email vào đầu tập lệnh của bạn, bên dưới các biến Đường dẫn thư mục $script và Tiêu đề $script của chúng tôi. Tôi sẽ hiển thị cài đặt email mà tôi đang sử dụng, nhưng hãy nhớ rằng cài đặt email của bạn có thể khác tùy thuộc vào dịch vụ email bạn đang sử dụng

Chúng tôi cũng sẽ muốn thêm một biến $errorCount và đặt nó thành 0. Điều này sẽ giúp chúng ta theo dõi được có phát hiện lỗi hay không cũng như phát hiện bao nhiêu lỗi

$scriptFolderPath = "C:\Scripts\Monitoring"
$scriptTitle = "SteamMonitor"
$errorCount = 0

#EMAIL SETTINGS
$smtp = "smtp.office365.com"
$smtpPort = 587
$username = "EMAIL ACCOUNT YOU SAVED THE PASSWORD FOR"
$encrypted = Get-Content encryptedPass.txt | ConvertTo-SecureString
$credentials = New-Object System.Management.Automation.PSCredential[
    $username, 
    $encrypted
]
$from = "EMAIL ADDRESS FOR THE ACCOUNT YOU SAVED THE PASSWORD FOR"
$to = "THE RECIPIENT EMAIL ADDRESS"

Tiếp theo, chúng tôi sẽ cuộn xuống tập lệnh của mình đến nơi chúng tôi đang kiểm tra xem dịch vụ và ứng dụng của chúng tôi có đang chạy không. Trong các phần mã chứa thông báo lỗi và hàm writeLog cho thông báo lỗi, chúng tôi muốn thêm các dòng mới để thêm 1 vào biến đếm lỗi của chúng tôi. $errorCount = $errorCount + 1

Cái này lấy bất kỳ giá trị nào mà biến errorCount hiện đang chứa và thêm 1 vào biến đó.

Xem bên dưới để biết ví dụ về mã đầy đủ của chúng ta bây giờ trông như thế nào.

$scriptFolderPath = "C:\Scripts\Monitoring"
$scriptTitle = "SteamMonitor"
$errorCount = 0

#EMAIL SETTINGS
$smtp = "smtp.office365.com"
$smtpPort = 587
$username = "EMAIL ACCOUNT YOU SAVED THE PASSWORD FOR"
$encrypted = Get-Content encryptedPass.txt | ConvertTo-SecureString
$credentials = New-Object System.Management.Automation.PSCredential[
    $username, 
    $encrypted
]
$from = "EMAIL ADDRESS FOR THE ACCOUNT YOU SAVED THE PASSWORD FOR"
$to = "THE RECIPIENT EMAIL ADDRESS"

function writeLog
{
    [CmdletBinding[]]
	Param
    [
    	[Parameter[Mandatory=$true, ValueFromPipelineByPropertyName=$true]]
        [ValidateNotNullOrEmpty[]]
        [string]$logMessage,
        
        [Parameter[Mandatory=$false]]
        [ValidateSet["ERROR", "INFO"]]
        [string]$state="INFO"
    ]
    
    $logTime = Get-Date -Format "MM-dd-yyyy HH:mm"
    $currentDate = Get-Date -Format "MM-dd-yyyy"
    
    switch [$state] {
    	'ERROR' {
        	$logState = "ERROR:"
		}
        'INFO' {
        	$logState = "INFO:"
		}
    }
    
    "$logTime $logState $logMessage" |
	Out-File -FilePath "$scriptFolderPath\$scriptTitle_$currentDate.log" -Append
}

writeLog -state "INFO" -logMessage "==== $scriptTitle has started ===="

$steamService = "Steam Client Service"
$steamServiceCheck = Get-Service $steamService

writeLog -state "INFO" -logMessage "Checking $steamService"

if[$steamServiceCheck.Status -eq "Running"]{
	$steamServiceMessage = "$steamService is running as expected."
	writeLog -state "INFO" -logMessage $steamServiceMessage
}else{
	$steamServiceMessage = "$steamService is not running!"
    writeLog -state "ERROR" -logMessage $steamServiceMessage
    $errorCount = $errorCount + 1;
}

$steamApplication = "steam"
$steamApplicationCheck = Get-Process $steamApplication -ErrorAction SilentlyContinue | 
Select Name, Description, Responding

writeLog -state "INFO" -logMessage "Checking $steamApplication"

if[!$steamApplicationCheck]{

    $steamApplicationMessage = "$steamApplication is not running!"
	writeLog -state "ERROR" -logMessage $steamApplicationMessage
    $errorCount = $errorCount + 1;

}else{

    if[$steamApplicationCheck.Responding -eq "True"]{
    	$steamApplicationMessage = "$steamApplication is running."
	    writeLog -state "INFO" -logMessage $steamApplicationMessage
    }else{
        $steamApplicationMessage = "$steamApplication is not responding!"
	    writeLog -state "ERROR" -logMessage $steamApplicationMessage
    }

} 

Cuối cùng, bây giờ chúng tôi có một cách để xác định xem tập lệnh của chúng tôi có tìm thấy lỗi hay không, chúng tôi có thể tiến hành gửi email thực sự khi có lỗi. Ở cuối tập lệnh của chúng tôi, chúng tôi sẽ thêm một kiểm tra để xem liệu số lỗi của chúng tôi có lớn hơn 0 hay không và nếu có, hãy gửi email

if[$errorCount -gt 0]{

    $emailSubject = "$scriptTitle - Alert"
    
    $emailBody = "
    	

$errorCount Issues Found

$steamApplicationMessage

$steamServiceMessage

" $sendMailParameters = @{ From = $from To = $to Subject = $emailSubject Body = $emailBody SMTPServer = $smtp Port = $smtpPort Credential = $credentials BodyAsHTML = $True UseSSL = $True } Send-MailMessage @sendMailParameters }

Khi đã sẵn sàng, bạn sẽ có thể dừng quy trình hoặc dịch vụ thử nghiệm của mình và chạy tập lệnh. Nếu chúng tôi thiết lập chính xác, bạn sẽ nhận được email giống như bên dưới

Bây giờ, chúng tôi có cảnh báo cơ bản sẽ kích hoạt email thường xuyên khi bạn có nhiệm vụ đã lên lịch từ thiết lập Phần I.

Nếu bạn gặp khó khăn ở đâu đó trên đường đi, đừng quên tham gia máy chủ Discord và yêu cầu trợ giúp.

Cải thiện Email

Mặc dù ví dụ email ở trên cung cấp đủ thông tin để có được chính xác những gì bạn cần, nhưng một số công ty có các tiêu chuẩn mẫu cần phải tuân theo, v.v. Tôi sẽ đưa ra một ví dụ về cách chúng tôi có thể chuyển đổi mẫu email HTML hiện có thành thứ mà chúng tôi có thể sử dụng với PowerShell để gửi email tốt hơn.

Tôi đã lấy một mẫu email HTML rất cơ bản [vì cố gắng viết HTML cho email thật tệ. ] và thêm các thẻ kiểu "tay lái" bên trong HTML để xác định các khu vực chúng tôi sẽ thay thế bằng PowerShell.


    
        {{EMAIL SUBJECT}}
        
        
        
        
            * {
                margin: 0;
                padding: 0;
                box-sizing: border-box;
            }

            body,
            table,
            td,
            a {
                -webkit-text-size-adjust: 100%;
                -ms-text-size-adjust: 100%;
            }

            table,
            td {
                mso-table-lspace: 0pt;
                mso-table-rspace: 0pt;
            }

            img {
                -ms-interpolation-mode: bicubic;
            }

            img {
                border: 0;
                height: auto;
                line-height: 100%;
                outline: none;
                text-decoration: none;
            }

            table {
                border-collapse: collapse !important;
            }

            body {
                height: 100% !important;
                width: 100% !important;
                background-color: #b6b6b6;
            }

            .body-content{
                padding-left: 10px;
                padding-right: 10px;
                background-color: #FFFFFF;
            }

            @media screen and [min-width:600px] {
                h1 {
                    font-size: 32px !important;
                    line-height: 32px !important;
                }

                .intro {
                    font-size: 24px !important;
                    line-height: 24px !important;
                }
            }
        
    
    
        

{{EMAIL HEADER}}

{{EMAIL INTRO}}

{{EMAIL CONTENT}}

Một lần nữa, đây chỉ là một ví dụ thực sự đơn giản và bạn có thể làm điều tương tự với bất kỳ mẫu email HTML nào bạn đã có, miễn là bạn biết nơi bạn muốn . Lưu tệp HTML ở đâu đó mà bạn có thể truy cập tệp đó bằng PowerShell. Cùng thư mục với chính tập lệnh, chia sẻ mạng, v.v. Tôi đã lưu tập lệnh của mình vào cùng thư mục với tên "emailTemplate. html"

Đây là nơi mọi thứ sẽ trở nên thú vị với kịch bản của chúng tôi. Tập lệnh của chúng ta sẽ đọc nội dung của mẫu HTML và chuyển đổi nó thành một chuỗi bằng cách sử dụng lệnh ghép ngắn Get-Content. Sau đó, nó sẽ thay thế từng trình giữ chỗ trên thanh điều khiển mà chúng ta đã tạo trước đó bằng bất kỳ thứ gì chúng ta muốn bằng cách sử dụng lệnh str. Phương thức thay thế []

Chủ Đề