ฉันสร้างสคริปต์เพื่อ ping เซิร์ฟเวอร์ที่รันจาก Task Scheduler หากเซิร์ฟเวอร์ไม่ ping ก็ควรส่งอีเมลถึงฉัน นอกจากนี้ยังส่งอีเมลวันละครั้งว่ายังมีชีวิตอยู่
ปัญหาคืออีเมลส่วนใหญ่ถูกส่งและมาถึงตามที่คาดไว้ แต่บางครั้งอีเมลก็ไม่ถูกส่ง ไม่มีข้อผิดพลาดเกิดขึ้น จากการวิเคราะห์การรับส่งอีเมล ดูเหมือนว่าอีเมลจะไม่ส่งถึงเซิร์ฟเวอร์ Office365 Exchange ของเรา
ฉันได้อ่านวิธีแก้ปัญหาต่างๆ รวมถึงการแทรก sleep cmdlets และการใช้บล็อก try/catch จนถึงตอนนี้ฉันพบเฉพาะโพสต์ที่มีปัญหาที่ Send-MailMessage ล้มเหลวอย่างสม่ำเสมอ แต่ไม่มีโพสต์ใดที่มีปัญหาที่ล้มเหลวอย่างไม่สม่ำเสมอ
ฉันกำลังบันทึกผลลัพธ์ แต่เท่าที่ลอง/จับแล้ว Send-MailMessage จะสำเร็จเสมอไฟล์บันทึกของฉันแสดงการส่งที่สำเร็จเสมอ ไม่เคยล้มเหลว
ทักษะ PowerShell ของฉันยังอยู่ในช่วงเริ่มต้น รหัสทั้งหมดสำหรับการถอดรหัสรหัสผู้ใช้และรหัสผ่านนั้นคัดลอกมาจากผู้ที่มีความรู้มากกว่าคนอื่นๆ
รหัสที่อ่านข้อมูลประจำตัว ถอดรหัสข้อมูลประจำตัว สร้างและส่งอีเมล:
(emailOperator เป็นบัญชีผู้ใช้ Office365 แบบไฮบริดที่มีสิทธิ์การใช้งาน E1)
100% ถ้าฉันเรียกใช้สคริปต์จาก PowerShell ISE ด้วยตนเอง อีเมลจะถูกส่ง
100% ของเวลาทั้งหมด ถ้าฉันเรียกงานด้วยตนเองจาก Task Scheduler อีเมลจะถูกส่ง (ฉันทำแบบนี้หลายสิบครั้ง ไม่ใช่หลายร้อยครั้ง)
$EmailRecipient = '[email protected]'
$emailFrom = '[email protected]'
$ReportingHost = 'โฮสต์การรายงาน:' + $env:ชื่อคอมพิวเตอร์
$CredentialLocation = "c:\MyServer\SendEmailUsingOffice365CredentialFolder\"
#อ่านรหัส AES
$AES_AdminDomain_KeyFilePath = $CredentialLocation + "AESKEY.txt" <# คีย์การเข้ารหัสโดเมนของผู้ดูแลระบบ AES #>
$AESKey = รับเนื้อหา $AES_AdminDomain_KeyFilePath
# อ่านและถอดรหัสรหัสผ่านโดยใช้ AESKey
$ExportedPasswordFilePath = $CredentialLocation + "Password.txt" <# รหัสผ่าน #>
$pwdTxt = รับเนื้อหา $ExportedPasswordFilePath
$securePwd = $pwdTxt | ConvertTo-SecureString - คีย์ $AESKey
# อ่านและถอดรหัสชื่อผู้ใช้โดยใช้ AESKey
$ExportedUserNameFilePath = $CredentialLocation + "User.txt" <# ชื่อผู้ใช้ #>
$UserSecureString = ConvertTo-SecureString -key $AESKey -String (รับเนื้อหา $ExportedUserNameFilePath)
$Pointer = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($UserSecureString)
$Sender = [Runtime.InteropServices.Marshal]::PtrToStringAuto($ตัวชี้)
#สร้างข้อมูลประจำตัว
$EmailCredentials = New-Object System.Management.Automation.PSCredential -ArgumentList $Sender, $securePwd
#สร้างอีเมล
$EmailSubject = $env:ComputerName + " ยังมีชีวิตอยู่และกำลังตรวจสอบปลายทางที่ " + (get-date -Format HH:mm)
$EmailBody = "- จบ - "
เริ่ม-สลีป -s 1
พยายาม
{
Send-MailMessage -SmtpServer smtp.office365.com -Port 587 -UseSSL -From $EmailFrom -To $EmailRecipient -Subject $EmailSubject -Body $EmailBody -Credential $EmailCredentials
}
จับ
{
" ข้อผิดพลาด ฉันยังไม่ได้ส่งอีเมล x" + $_.Exception.Message + "x " + $(Get-Date -format 'MM/dd/yyyy,HH:mm:ss') | Out-File -Filepath $Log_File -NoClobber -ต่อท้าย
}
" อีเมล ฉันยังคงส่งอีเมลอยู่ y" + $_.Exception.Message + "y " + $(Get-Date -format 'MM/dd/yyyy,HH:mm:ss') | Out-File -Filepath $Log_File -NoClobber -ต่อท้าย
มีวิธีการส่งอีเมลและให้ PowerShell ติดตามความคืบหน้าหรือไม่
ขอบคุณ