Send-MailMessage: วิธี PowerShell ในการส่งอีเมล
สำหรับ PowerShell cmdlet ประจำวันนี้ เราจะครอบคลุม PowerShell cmdlet Send-MailMessage PowerShell cmdlet นี้มีวัตถุประสงค์เดียวและมีวัตถุประสงค์เดียวเท่านั้น เพื่อส่งอีเมลด้วยวิธีต่างๆมากมาย
เนื่องจากมีหลายวิธีที่ Send-MailMessage cmdlet สามารถส่งข้อความอีเมลได้ เรามาเจาะลึกและเริ่มครอบคลุมตัวอย่างทั่วไปทั้งหมดที่คุณอาจพบ ในบทความนี้ เราจะกล่าวถึงตัวอย่างมากมายตั้งแต่ตัวอย่างที่ง่ายที่สุดไปจนถึงสถานการณ์บางอย่างที่ฉันไม่ต้องการใครเลย!
โพสต์นี้จะเป็นแหล่งข้อมูลที่ดีในการบุ๊กมาร์กในกรณีที่คุณเคยเจอกรณีที่คุณต้องการส่งอีเมลด้วย PowerShell และลืมไวยากรณ์
เซิร์ฟเวอร์ SMTP
อีเมลทั้งหมดจะต้องผ่านเซิร์ฟเวอร์ SMTP ที่ไหนสักแห่งผ่านทางเซิร์ฟเวอร์และพอร์ต หากต้องการระบุเซิร์ฟเวอร์ SMTP ที่จะใช้ ให้ใช้พารามิเตอร์ชื่อ SMTPServer ซึ่งช่วยให้คุณสามารถระบุเซิร์ฟเวอร์ SMTP เพื่อสร้างการเชื่อมต่อและส่งต่อเมลได้ อย่างไรก็ตาม มันไม่จำเป็น
หากคุณไม่ระบุค่าสำหรับพารามิเตอร์ SMTPServer ระบบจะใช้ค่าที่จัดเก็บไว้ในตัวแปรการตั้งค่า $PSEmailServer คุณสามารถกำหนดค่าให้กับตัวแปรนี้ได้เหมือนกับที่คุณกำหนดค่าให้กับตัวแปรอื่นๆ
PS51> $PSEmailServer = 'smtp.server.local'
อย่างไรก็ตาม ตัวแปรนี้ไม่ได้ใช้งานข้ามเซสชัน PowerShell ซึ่งหมายความว่าคุณต้องกำหนดทุกครั้งที่เปิดเซสชัน PowerShell ใหม่ ด้วยเหตุนี้ ฉันขอแนะนำให้ใช้โดยกำหนดไว้เหนือข้อมูลอ้างอิง Send-MailMessage หรือไม่ก็กำหนดทั้งหมด แต่ฉันจะให้ค่าพารามิเตอร์ SMTPServer เป็นการส่วนตัวแทน ด้วยวิธีนี้คุณไม่จำเป็นต้องจัดการตัวแปรภายนอกที่อาจเปลี่ยนแปลงกับคุณ
PS51> Send-MailMessage -SmtpServer 'smtp.server.local'ท่าเรือ
ตามค่าเริ่มต้น ค่าที่ cmdlet จะพยายามส่งอีเมลผ่านเซิร์ฟเวอร์ SMTP คือพอร์ต 25 ซึ่งเป็น SMTP ธรรมดาที่ไม่ได้เข้ารหัส อย่างไรก็ตาม ในปัจจุบัน การส่งอีเมลที่เข้ารหัสโดยใช้ SSL/TLS เป็นเรื่องปกติมากขึ้น (เราจะกล่าวถึงสถานการณ์เหล่านี้ในภายหลัง)
หากคุณต้องการเปลี่ยนพอร์ตจาก 25 คุณสามารถใช้พารามิเตอร์ Port
PS51> Send-MailMessage -SmtpServer 'smtp.server.local' -Port 587ผู้รับและผู้ริเริ่ม
หากต้องการส่งอีเมลไปยังผู้รับที่แตกต่างกันผ่านวิธีการเช่นฟิลด์ ถึง, สำเนาถึง และ สำเนาลับ cmdlet มีพารามิเตอร์ต่างๆ เพื่อรองรับสิ่งนี้
พารามิเตอร์ถึง สำเนาถึง และสำเนาลับถึงใน Cmdlet ส่งข้อความ
cmdlet มีพารามิเตอร์สามตัวที่แต่ละตัวรองรับผู้รับหลายรายโดยคั่นด้วยเครื่องหมายจุลภาคที่เรียกว่า ถึง, Cc และ Bcc
คุณสามารถระบุที่อยู่เดียวได้ดังนี้
PS51> Send-MailMessage -To [email -Cc b[email -Bcc [email -Subject 'this is a subject'หรือคุณสามารถระบุผู้รับหลายรายสำหรับแต่ละค่าพารามิเตอร์ได้
PS51> Send-MailMessage -To [email , [email -Cc [email , [email -Bcc [email ,[email -Subject 'this is a subject'พารามิเตอร์จาก
เมื่อส่งอีเมล คุณยังสามารถระบุพารามิเตอร์ From ซึ่งจะตั้งค่าส่วนหัวการตอบกลับในอีเมล พารามิเตอร์นี้อนุญาตเพียงที่อยู่เดียวเท่านั้น หากผู้รับเลือกที่จะตอบกลับอีเมล นี่จะเป็นที่อยู่อีเมลที่จะตอบกลับไป
PS51> Send-MailMessage -From [email -To [email -Subject 'this is a subject'ตามค่าเริ่มต้น การใช้ที่อยู่อีเมลจะแสดงที่อยู่อีเมลในช่อง FROM ของผู้รับ อย่างไรก็ตาม หากคุณต้องการระบุชื่อหรือป้ายกำกับบางอย่าง เช่น กล่องจดหมายของบัญชีบริการ คุณยังอาจระบุชื่อและอีเมล เช่น:
Adam Bertram <[email >โปรดสังเกตว่ามีการใช้พารามิเตอร์
Subjectจำเป็นต้องใช้พารามิเตอร์นี้เสมอ คุณจะเห็นพารามิเตอร์นี้ใช้ในตัวอย่างทั้งหมด
ร่างกาย
พารามิเตอร์ Body ช่วยให้คุณสามารถระบุสิ่งที่จะอยู่ในเนื้อหาอีเมลได้ ที่ง่ายที่สุด คุณสามารถระบุข้อความใดๆ ที่คุณต้องการได้ และ cmdlet จะส่งผ่านข้อความธรรมดา
PS51> Send-MailMessage -From [email -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'การส่งอีเมลเนื้อหา HTML
คุณยังสามารถส่งเนื้อหาอีเมลผ่าน HTML แทนข้อความธรรมดาได้ ในการทำเช่นนั้น ให้ใช้พารามิเตอร์ Body เดียวกันกับที่คุณใช้กับข้อความธรรมดา แต่ใช้ HTML สำหรับสตริง และใช้พารามิเตอร์สวิตช์ BodyAsHtml
$body = @'
<table style="width:100%">
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
</tr>
<tr>
<td>Jill</td>
<td>Smith</td>
<td>50</td>
</tr>
<tr>
<td>Eve</td>
<td>Jackson</td>
<td>94</td>
</tr>
</table>
'@
PS51> Send-MailMessage -From [email -To jo[email -Subject 'this is a subject' -Body $body -BodyAsHtmlหมายเหตุในตัวอย่างข้างต้น ฉันใส่สตริงเนื้อหาใน
@'และ'@สิ่งนี้เรียกว่าสตริงที่นี่ ซึ่งจะทำให้คุณสามารถกำหนดสตริงแบบยาวที่มักพบเห็นในเนื้อความของอีเมลที่มีการขึ้นบรรทัดใหม่ สตริงในที่นี้จะคงรูปแบบของสตริงไว้และเป็นวิธีที่ดีในการกำหนดเนื้อหาอีเมล โดยเฉพาะอย่างยิ่งหากอยู่ในรูปแบบ HTML
การเข้ารหัส
หากคุณมีอักขระพิเศษในหัวเรื่องหรือเนื้อหาของอีเมล คุณสามารถใช้พารามิเตอร์ Encoding ได้ พารามิเตอร์นี้ช่วยให้คุณเข้ารหัสหัวเรื่องและเนื้อหาอีเมลผ่านประเภทการเข้ารหัสที่ระบุก่อนส่ง
คุณมีทางเลือกสองสามทางที่นี่:
- ASCII (ค่าเริ่มต้น)
- UTF8
- UTF7
- UTF32
- ยูนิโค้ด
- BigEndian Unicode
- ค่าเริ่มต้น
- OEM
PS51> Send-MailMessage -From [email -To [email -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8ไฟล์แนบ
cmdlet ยังสามารถแนบไฟล์ได้ตั้งแต่หนึ่งไฟล์ขึ้นไป ในการดำเนินการดังกล่าว คุณสามารถใช้พารามิเตอร์ ไฟล์แนบ และระบุเส้นทางไปยังไฟล์ที่คุณต้องการแนบ
PS51> Send-MailMessage -From [email -To [email -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'คุณยังสามารถระบุไฟล์แนบหลายรายการผ่านคอลเลกชันได้โดยคั่นด้วยเครื่องหมายจุลภาค
PS51> Send-MailMessage -From [email -To [email -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'พารามิเตอร์ สิ่งที่แนบมา ยังช่วยให้คุณสามารถไพพ์ไฟล์ผ่าน cmdlets เช่น Get-Item และ Get-ChildItem ไปยัง Send-MailMessage รหัส> cmdlet เช่นกัน
PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From [email -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'อีเมลที่ปลอดภัยและได้รับการรับรองความถูกต้อง
ตามค่าเริ่มต้น cmdlet จะส่งอีเมลผ่านการสื่อสาร SMTP ที่ไม่ได้เข้ารหัสผ่านพอร์ต 25 อย่างไรก็ตาม cmdlet ยังรองรับการส่งอีเมลที่เข้ารหัสผ่าน SSL/TLS ด้วยชื่อผู้ใช้และรหัสผ่านอีกด้วย
หากคุณพยายามส่งต่ออีเมลผ่านเซิร์ฟเวอร์ SMTP ที่ต้องมีการตรวจสอบสิทธิ์ คำสั่งจะล้มเหลวโดยมีข้อความแสดงข้อผิดพลาดดังด้านล่าง
The SMTP server requires a secure connection or the client was not
authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.
เพื่อแก้ไขปัญหานี้ คุณต้องระบุพอร์ต (โดยทั่วไปคือ 587 สำหรับ TLS) และพารามิเตอร์ UseSsl สิ่งนี้จะบอก cmdlet ให้พยายามเชื่อมต่อกับพอร์ต 587 บนเซิร์ฟเวอร์ SMTP และเข้ารหัสข้อความทั้งหมด โดยทั่วไป คุณจะต้องระบุชื่อผู้ใช้/รหัสผ่านเพื่อตรวจสอบสิทธิ์เซิร์ฟเวอร์ SMTP โดยใช้พารามิเตอร์ ข้อมูลรับรอง
PS51> $credential = Get-Credential
PS51> Send-MailMessage -From [email -To [email -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credentialด้านบนนี้ ฉันกำลังดึงวัตถุข้อมูลรับรอง (PSCredential) โดยใช้ cmdlet
Get-Credentialบางครั้งสิ่งนี้อาจทำให้เกิดปัญหาได้เนื่องจากเป็นการโต้ตอบซึ่งหมายความว่าสคริปต์จะหยุดการขอชื่อผู้ใช้และรหัสผ่าน เพื่อป้องกันสิ่งนี้ คุณสามารถสร้างวัตถุ PSCredential ได้ทันที
ตัวอย่างอีเมลทั่วไปคือการใช้ Gmail จากความรู้ที่คุณได้รับข้างต้น คุณสามารถส่งอีเมลผ่าน Gmail ได้อย่างง่ายดายโดยใช้เซิร์ฟเวอร์ SMTP smtp.gmail.com ดังที่แสดงด้านล่าง
$gmailCred = Get-Credential
$sendMailParams = @{
From = '[email ' ## Must be gmail.com
To = '[email '
Subject = 'some subject'
Body = 'some body'
SMTPServer = 'smtp.gmail.com'
SMTPPort = 587
UseSsl = $true
Credential = $gmailCred
}
Send-MailMessage @sendMailParamsการกำหนดลำดับความสำคัญของอีเมล
แม้ว่าคุณลักษณะหนึ่งของอีเมลที่ฉันปรารถนาเป็นการส่วนตัวจะตายไป แต่คุณสามารถกำหนดระดับความสำคัญให้กับอีเมลที่คุณส่งผ่านพารามิเตอร์ Priority ได้ ลำดับความสำคัญนี้จะถูกตีความในรูปแบบต่างๆ โดยไคลเอนต์อีเมล
Send-mailmessage ช่วยให้คุณสามารถกำหนดอีเมลที่มีลำดับความสำคัญที่แตกต่างกันสามแบบ
- ปกติ (ค่าเริ่มต้น)
- สูง
- ต่ำ
PS51> Send-MailMessage -From [email -To [email -Subject 'this is a subject' -Body 'this is the body' -Priority Highแต่โปรดอย่าคิดว่าอีเมลทั้งหมดของคุณมีความสำคัญสูงเพื่อความรักของพระเจ้า!
การแจ้งเตือนการจัดส่ง
สุดท้าย คุณสามารถระบุการแจ้งเตือนการจัดส่งสำหรับอีเมลได้ การแจ้งเตือนการส่งเป็นสิ่งที่โดยทั่วไปเรียกว่าใบตอบรับการอ่านในโปรแกรมรับส่งอีเมลบางประเภท การแจ้งเตือนการจัดส่งช่วยให้คุณได้รับแจ้งหาก/เมื่อผู้รับได้รับอีเมล อย่างไรก็ตามผู้รับยังคงต้องอนุญาต
คุณมีสี่ตัวเลือกในการขอการแจ้งเตือนการจัดส่ง
- ไม่มี (ค่าเริ่มต้น)
- OnSuccess (เมื่อส่งอีเมลสำเร็จ)
- OnFailure (แจ้งเตือนหากการส่งมอบไม่สำเร็จ)
- ความล่าช้า (เมื่ออีเมลล่าช้าผ่านเซิร์ฟเวอร์ SMTP)
คุณสามารถระบุตัวเลือกการแจ้งเตือนการจัดส่งได้โดยใช้พารามิเตอร์ DeliveryNotificationOptions
PS51> Send-MailMessage -From [email -To [email -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'คุณยังสามารถขอการแจ้งเตือนการจัดส่งหลายรายการพร้อมกันได้โดยคั่นด้วยเครื่องหมายจุลภาค
PS51> Send-MailMessage -From [email -To [email -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'สรุป
ในโพสต์นี้ คุณได้เรียนรู้ทั้งหมดเกี่ยวกับ Send-mailmessage cmdlet และสิ่งที่สามารถทำได้ เราครอบคลุม cmdlet นี้อย่างกว้างขวางโดยใช้ทุกพารามิเตอร์ที่มีพร้อมกับตัวอย่าง ฉันหวังว่าโพสต์นี้สามารถใช้เป็นข้อมูลอ้างอิงสำหรับคุณเมื่อใช้ Send-mailmessage cmdlet
อ่านเพิ่มเติม
อย่าลืมตรวจสอบโพสต์อื่น ๆ ที่เกี่ยวข้อง!
- การใช้
Get-ChildItemPowerShell cmdlet - การใช้
Set-ContentPowerShell cmdlet - การใช้
Out-FilePowerShell cmdlet
