Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

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

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

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

รับความช่วยเหลือ Send-MailMessage

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

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

นี่คือตัวเลือกหลัก:

  • จาก คือที่อยู่ผู้ส่ง (หากเซิร์ฟเวอร์ SMTP ไม่ตรวจสอบที่อยู่ของผู้ส่งและอนุญาตให้ส่งอีเมลโดยไม่ระบุชื่อ คุณไม่จำเป็นต้องระบุที่อยู่ smtp จริง คุณสามารถส่งข้อความอีเมลในนามของที่อยู่อีเมลใดก็ได้)
  • ถึง – ที่อยู่อีเมลของผู้รับ;
  • เซิร์ฟเวอร์ SMTP –ที่อยู่ของเซิร์ฟเวอร์ SMTP ที่คุณต้องการส่งอีเมล
หากคุณตั้งค่าที่อยู่เซิร์ฟเวอร์อีเมลใน $PSEmailServer ตัวแปรสภาพแวดล้อม คุณไม่จำเป็นต้องระบุที่อยู่เซิร์ฟเวอร์ SMTP ใน Send-MailMessage cmdlet

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

Send-MailMessage -From '[email protected]' -To '[email protected]','[email protected]' -Subject "Test Email Alert" -Body "This is email body text" –SmtpServer 'smtp.woshub.com'

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

Send-MailMessage `
-SmtpServer smtp.woshub.com `
-To '[email protected]','[email protected]' `
-From 'ps- [email protected]' `
-Subject "Test" `
-Body "การส่งอีเมลโดยใช้ PowerShell" `
-Encoding 'UTF8'

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

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

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

-SmtpServer 'smtp.woshub.com' -พอร์ต 465 –UseSsl

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

ชื่อ ที่อยู่เซิร์ฟเวอร์ SMTP พอร์ต ประเภทการเข้ารหัส
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 smtp.mail.me.com 587 TLS
เอโอแอล  smtp.aol.com 465 SSL

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

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 ("[email protected]", $mypasswd)
ส่ง-MailMessage ... –Credential $mycreds

ดูบทความ การใช้ข้อมูลประจำตัวที่บันทึกไว้อย่างปลอดภัยในสคริปต์ PowerShell

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

$MailMessage = @{
To = "[email protected]"
Bcc = "[email protected]", "[email protected]"
From = "smtpsender1 @gmail.com"
Subject = "DC Server Report"
Body = "

ยินดีต้อนรับ!

 

สร้างแล้ว: $(Get-Date - รูปแบบ g)


Smtpserver = "smtp.gmail.com"
Port = 587
UseSsl = $true
BodyAsHtml = $true
Encoding =“UTF8”
สิ่งที่แนบมา = “C:\Logs\file1.txt”, “C:\Logs\install.log”
}
Send-MailMessage @MailMessage -Credential $cred

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

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

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

ประเภทการแจ้งเตือนที่ใช้ได้คือ:

  • ความสำเร็จ (แจ้งว่าส่งของสำเร็จ)
  • OnFailure (แจ้งว่าส่งของไม่สำเร็จ)
  • ล่าช้า (แจ้งว่าส่งของล่าช้า)