Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

Send-MailMessage: การส่งอีเมลจาก PowerShell

เพื่อส่งข้อความอีเมลผ่านเซิร์ฟเวอร์ SMTP คุณสามารถใช้ PowerShell cmdlet Send-MailMessage คุณสามารถใช้ cmdlet สร้างสรรค์นี้เพื่อส่งอีเมลใน PowerShell เวอร์ชัน 2.0 ขึ้นไป (ก่อนหน้านี้คุณสามารถใช้คลาส .Net System.Net.Mail เพื่อส่งอีเมล) ในบทความนี้เราจะแสดงวิธีใช้ Send-MailMessage เพื่อส่งอีเมลจากสคริปต์ PowerShell

เพื่อรับไวยากรณ์ของ cmdlet ให้รันคำสั่งนี้:

get-help Send-MailMessage
Send-MailMessage [-To]  [-Subject]  [[-Body] ] [[-SmtpServer] ] [-Attachments ] [-Bcc ] [-BodyAsHtml] [-Cc ] [-Credential ] [-DeliveryNotificationOption {None | OnSuccess | OnFailure | Delay | Never}] [-Encoding ] -From  [-Port ] [-Priority {Normal | Low | High}] [-UseSsl] [] The Send-MailMessage cmdlet sends an email message from within Windows PowerShell.

Send-MailMessage: การส่งอีเมลจาก PowerShell

ตัวเลือกหลักมีดังนี้:

  • From คือที่อยู่ผู้ส่ง (หากเซิร์ฟเวอร์ SMTP ไม่ตรวจสอบที่อยู่ผู้ส่งและอนุญาตให้ส่งอีเมลแบบไม่ระบุตัวตน คุณไม่จำเป็นต้องระบุที่อยู่ SMTP จริง คุณสามารถส่งข้อความอีเมลแทนที่อยู่อีเมลใดๆ ได้);
  • To – ที่อยู่อีเมลผู้รับ;
  • SMTPServer – ที่อยู่ของเซิร์ฟเวอร์ SMTP ที่คุณต้องการส่งอีเมลผ่าน

หากคุณตั้งค่าที่อยู่เซิร์ฟเวอร์อีเมลในตัวแปรสภาพแวดล้อม $PSEmailServer คุณไม่จำเป็นต้องระบุที่อยู่เซิร์ฟเวอร์ SMTP ใน cmdlet Send-MailMessage

คำสั่ง PowerShell เรียบง่ายต่อไปนี้จะส่งอีเมลพร้อมหัวข้อและเนื้อหาที่ระบุไปยังผู้รับหลายคน

Send-MailMessage -From 'ps-script@woshub.com' -To 'serveradmin@woshub.com','helpdesk@woshub.com' -Subject "Test Email Alert" -Body "This is email body text" –SmtpServer 'smtp.woshub.com'

เพื่อให้แก้ไขแอตทริบิวต์ของ cmdlet ได้ง่ายขึ้น คำสั่งส่งอีเมลสามารถแสดงได้ดังนี้:

Send-MailMessage `
-SmtpServer smtp.woshub.com `
-To 'serveradmin@woshub.com','helpdesk@woshub.com' `
-From 'ps-script@woshub.com' `
-Subject "Test" `
-Body "Sending email using PowerShell" `
-Encoding 'UTF8'

โปรดทราบว่าในคำสั่งสุดท้ายเราตั้งค่า encoding UTF8 สำหรับอีเมลเพิ่มเติม มิฉะนั้น หากหัวข้อหรือเนื้อหาอีเมลมีตัวอักษร non-ANSI จะแสดงไม่ถูกต้อง

โดยค่าเริ่มต้น ใช้ encoding ANSI และ ASCII ใน Windows PowerShell หากคุณอัปเดตเวอร์ชัน PS เป็น PowerShell Core โปรดทราบว่าเวอร์ชันนี้ใช้ UTF-8 encoding โดยค่าเริ่มต้นแล้ว

โดยค่าเริ่มต้น Send-MailMessage cmdlet พยายามส่งอีเมลผ่านพอร์ต SMTP มาตรฐาน TCP 25 หากเซิร์ฟเวอร์ SMTP ของคุณอนุญาตให้ส่งอีเมลเฉพาะผ่านโปรโตคอลเข้ารหัส คุณสามารถระบุหมายเลขพอร์ต (บ่อยครั้งคือ 465 หรือ 587) และตัวเลือก UseSsl:

-SmtpServer 'smtp.woshub.com' -Port 465 –UseSsl

ตารางด้านล่างแสดงพารามิเตอร์เซิร์ฟเวอร์ SMTP ของผู้ให้บริการอีเมลยอดนิยมที่คุณสามารถใช้ส่งข้อความจาก PowerShell (โปรดทราบว่าคุณจะต้องอนุญาตให้ส่งอีเมลผ่าน SMTP ในอินเทอร์เฟซบัญชี):

Name SMTP Server Address Port Encryption Type
Gmail smtp.gmail.com 587, 25, 465 TLS, TLS, SSL
Office 365 smtp.office365.com 587 TLS
Outlook.com smtp-mail.outlook.com 587 TLS
Yahoo smtp.mail.yahoo.com 587 TLS
iCloud mail smtp.mail.me.com 587 TLS
AOL smtp.aol.com 465 SSL

หากเซิร์ฟเวอร์ SMTP ห้ามส่งอีเมลแบบไม่ระบุตัวตน (relay is denied) คุณจะเห็นข้อผิดพลาดนี้:

5.7.1 Client was not authenticated.

จากนั้นคุณสามารถตรวจสอบสิทธิ์บนเซิร์ฟเวอร์ SMTP โดยใช้ตัวเลือก –Credential

คุณสามารถขอข้อมูลประจำตัวผู้ใช้แบบโต้ตอบเพื่อตรวจสอบสิทธิ์:

Send-MailMessage …… -Credential (Get-Credential)

Send-MailMessage: การส่งอีเมลจาก PowerShell

นอกจากนี้ คุณสามารถระบุบัญชีที่จะใช้สำหรับการตรวจสอบสิทธิ์ในตัวแปร:

$cred = Get-Credential
Send-MailMessage ... -Credential $cred

หากคุณต้องการบันทึกรหัสผ่านเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ SMTP โดยตรงในสคริปต์ PowerShell ให้ใช้ไวยากรณ์นี้:

$mypasswd = ConvertTo-SecureString "smP@ssdw0rrd2" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("user1@woshub.com", $mypasswd)
Send-MailMessage ... –Credential $mycreds

ดูบทความ Using saved credentials securely in PowerShell scripts

หากคุณต้องการเพิ่มไฟล์แนบในอีเมล ให้ใช้ตัวเลือก –Attachments ในตัวอย่างด้านล่าง เราจะส่งอีเมลในรูปแบบ HTML และแนบไฟล์ file1.txt และ install.log จากดิสก์ท้องถิ่น เราจะใช้เซิร์ฟเวอร์ SMTP ของ Gmail (ก่อนอื่นคุณต้องสร้าง app password ใน Gmail และใช้มันสำหรับ smtp authentication แทนรหัสผ่าน Gmail ของคุณ):

$MailMessage = @{
To = "admin@woshub.com"
Bcc = "manager@woshub.com", "manager2@woshub.com"
From = "smtpsender1@gmail.com"
Subject = "DC Server Report"
Body = "

Welcome!

Generated: $(Get-Date -Format g)

" Smtpserver = "smtp.gmail.com" Port = 587 UseSsl = $true BodyAsHtml = $true Encoding = "UTF8" Attachment = "C:\Logs\file1.txt", "C:\Logs\install.log" } Send-MailMessage @MailMessage -Credential $cred

นี่คือลักษณะของอีเมลในรูปแบบ HTML พร้อมไฟล์แนบในอินเทอร์เฟซ Gmail

Send-MailMessage: การส่งอีเมลจาก PowerShell

คุณสามารถกำหนดค่าการแจ้งเตือนการส่งมอบ (read receipts) สำหรับอีเมลโดยใช้ -DeliveryNotificationOption การแจ้งเตือนการส่งมอบช่วยให้คุณได้รับการแจ้งเตือนหากผู้รับได้รับอีเมล

ประเภทการแจ้งเตือนที่มีอยู่คือ:

  • OnSuccess (แจ้งเตือนหากการส่งมอบสำเร็จ)
  • OnFailure (แจ้งเตือนหากการส่งมอบไม่สำเร็จ)
  • Delay (แจ้งเตือนหากการส่งมอบล่าช้า)