เพื่อส่งข้อความอีเมลผ่านเซิร์ฟเวอร์ 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.

ตัวเลือกหลักมีดังนี้:
- 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)

นอกจากนี้ คุณสามารถระบุบัญชีที่จะใช้สำหรับการตรวจสอบสิทธิ์ในตัวแปร:
$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

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