ส่งอีเมลไปที่ office 365 โดยใช้สคริปต์ PowerShell | ตอนที่ 1#2
ในบทความสองชุดต่อไปนี้ เราจะตรวจสอบหัวข้อ - วิธีใช้ “สคริปต์ PowerShell ส่งอีเมล” ซึ่งจะใช้เซิร์ฟเวอร์อีเมล Office 365 เป็นเซิร์ฟเวอร์อีเมลของเขา การใช้งานทั่วไปที่สุดของการใช้ “สคริปต์ PowerShell ส่งอีเมล” คือ:
- ทดสอบกระบวนการส่งอีเมลไปยังโครงสร้างพื้นฐานเมล Office 365
- การใช้ “สคริปต์ PowerShell ส่งอีเมล” เพื่อวัตถุประสงค์อัตโนมัติ เช่น การส่งรายงานรายวัน
โดยทั่วไป มีสองตัวเลือกหลักที่เราจัดการกับโครงสร้างพื้นฐานเมลของ Office 365
1. เซสชัน SMTP ที่ไม่ระบุชื่อ
2. เซสชัน SMTP หรือ TLS ที่ได้รับการรับรองความถูกต้อง
- ในบทความปัจจุบัน เราจะตรวจสอบวิธีการที่สามารถยกเลิกได้เป็น - เซสชันเมล SMTP แบบไม่ระบุชื่อ
- ในบทความถัดไป เราจะตรวจสอบวิธีการที่สามารถยกเลิกได้ว่าเป็น - เซสชันเมล TLS ที่ได้รับการรับรองความถูกต้อง และนอกจากนี้ วิธีใช้ส่วนประกอบตัวกำหนดเวลางานของ Windows สำหรับการใช้สคริปต์ PowerShell ส่งอีเมล”
สองวิธีหลักในการกำหนดที่อยู่เซิร์ฟเวอร์อีเมล Office 365
ก่อนที่จะเริ่มต้นด้วยคำแนะนำที่แน่นอนเกี่ยวกับวิธีสร้าง "สคริปต์ PowerShell ส่งอีเมล" ที่จำเป็น เราจะมาทบทวนวิธีที่ไคลเอ็นต์สามารถจัดการกับบริการอีเมล Office 365 ได้โดยย่อ
เมื่อเราต้องการจัดการกับเซิร์ฟเวอร์จดหมาย Office 365 (Exchange Online) เราสามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้:
วิธีที่ 1 - การกำหนดเซิร์ฟเวอร์อีเมล Office 365 โดยใช้เซสชัน SMTP ที่ไม่ระบุชื่อมาตรฐาน
วิธีการที่เราสคริปต์ PowerShell จัดการกับเซิร์ฟเวอร์อีเมล Office 365 โดยใช้เซสชัน SMTP (เซสชันที่ไม่ได้เข้ารหัส)
เซสชัน SMTP ถูกสร้างขึ้นโดยใช้การเชื่อมต่อแบบไม่ระบุชื่อ
ความหมายของ ” การเชื่อมต่อแบบไม่ระบุชื่อ ” คือฝั่งที่อยู่เซิร์ฟเวอร์อีเมล Office 365 (สคริปต์ PowerShell) ไม่ได้ให้ ผู้ใช้ใดๆ ข้อมูลรับรอง
ข้อได้เปรียบ
ประโยชน์หลักของวิธีนี้คือเราจะหลีกเลี่ยงขั้นตอนการให้ข้อมูลประจำตัวผู้ใช้ ความจำเป็นในการจัดเตรียมข้อมูลรับรองนั้น "ปกปิด" ไว้กับงานอื่นๆ เช่น ความจำเป็นในการรักษาความปลอดภัยข้อมูลรับรอง และอื่นๆ
ข้อเสีย
ข้อเสียเปรียบหลักของการใช้การเชื่อมต่อแบบไม่ระบุชื่อคือเมลเซิร์ฟเวอร์ไม่สามารถเชื่อถือผู้ส่งได้เนื่องจากผู้ส่งปรากฏเป็นแบบไม่ระบุชื่อ
โดยส่วนใหญ่ อีเมลที่จะถูกส่งโดยสคริปต์ PowerShell จะระบุว่าเป็นอีเมลปลอม เนื่องจาก - ที่อยู่อีเมลของผู้รับ Office 365 ที่เราใช้เป็น “ที่อยู่ผู้ส่ง” ไม่ได้รับการรับรองความถูกต้อง
ข้อเสียเพิ่มเติมคือ เมื่อใช้ "เซสชันที่ไม่ระบุชื่อ" เราไม่สามารถส่งอีเมลไปยัง "ผู้รับภายนอก" ซึ่งหมายความว่าผู้รับที่ที่อยู่อีเมลของตนไม่ได้โฮสต์โดยเซิร์ฟเวอร์ Exchange Online ซึ่งโฮสต์โดเมนของเรา
วิธีแก้ปัญหาสำหรับปัญหานี้สามารถทำได้โดยการสร้างตัวเชื่อมต่อจดหมายขาเข้าของ Exchange Online หรือกำหนดที่อยู่อีเมลสิบรายการของผู้ส่งในรายการที่อนุญาตของผู้ส่งที่ได้รับอนุญาต
หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้างตัวเชื่อมต่อเมลดังกล่าว โปรดอ่านบทความ - ส่งอีเมลไปยัง Exchange Online โดยใช้เซสชัน SMTP มาตรฐาน | ตอนที่ 2#4
วิธีที่ 2 - จัดการกับเซิร์ฟเวอร์อีเมล Office 365 โดยใช้เซสชัน TLS + ข้อมูลประจำตัว
วิธีการซึ่งสคริปต์ PowerShell จัดการกับเมลเซิร์ฟเวอร์ Office 365 โดยใช้เซสชัน TLS (เซสชันที่เข้ารหัส) + ให้ข้อมูลประจำตัวผู้ใช้ (เซสชันที่ได้รับการรับรองความถูกต้อง)
ข้อได้เปรียบ
การรักษาความปลอดภัยช่องทางการสื่อสาร - เมื่อใช้โปรโตคอล TLS ช่องทางการสื่อสารระหว่างโฮสต์ที่ส่งอีเมลและเซิร์ฟเวอร์อีเมล Office 365 จะถูกเข้ารหัส
เซสชันที่มีการรับรองความถูกต้อง - ข้อได้เปรียบหลักของวิธีนี้คือเมื่อเราให้ข้อมูลประจำตัวผู้รับ Office 365 Exchange Online จะเกี่ยวข้องกับ “ผู้ส่ง” ในฐานะ ผู้ส่งที่เชื่อถือได้
ด้วยเหตุนี้ เรา ไม่จำเป็นต้องเพิ่มการกำหนดค่าเพิ่มเติม บนฝั่งเซิร์ฟเวอร์ Exchange Online และนอกจากนี้ เรายังสามารถส่งอีเมลไปยังผู้รับภายนอกที่ไม่ได้โฮสต์บนเซิร์ฟเวอร์ Exchange Online .
ข้อเสีย
ในกรณีที่เราต้องการใช้ "สคริปต์ PowerShell ส่งอีเมล" เป็นงานที่กำหนดเวลาไว้ เราจะต้องค้นหาวิธีแก้ไขที่สคริปต์ PowerShell สามารถเข้าถึงข้อมูลรับรองที่จำเป็นที่จัดเก็บไว้ในไฟล์ได้
การรักษาข้อมูลรับรองผู้ใช้ เช่น รหัสผ่าน ในรูปแบบที่ไม่ปลอดภัยถือเป็นการปฏิบัติที่ไม่ดี!
แม้ว่าเราจะสามารถเพิ่มรหัสผ่านลงในไฟล์ข้อความที่ไม่มีการป้องกัน (ไฟล์ PowerShell) ได้ แต่ไม่แนะนำให้ใช้ตัวเลือกนี้
วิธีแก้ปัญหาสำหรับ “ความต้องการด้านความปลอดภัย” นี้จะถูกนำไปใช้โดยวิธีการ ซึ่งเราสร้างไฟล์รหัสผ่านที่เข้ารหัส และสั่งให้ “สคริปต์ PowerShell ส่งเมล” ให้เข้าถึงไฟล์ที่เข้ารหัสและดึงรหัสผ่านที่จำเป็นจากไฟล์นี้
ขั้นตอนที่เราต้องเข้ารหัสข้อมูลรับรอง ถือว่าซับซ้อนกว่าเมื่อเทียบกับสถานการณ์ที่เราใช้เซสชัน SMTP โดยไม่มีข้อมูลประจำตัว
วิธีที่ 1 - ระบุเซิร์ฟเวอร์อีเมล Office 365 โดยใช้เซสชัน SMTP มาตรฐาน
ในส่วนนี้ เราจะตรวจสอบวิธีสร้าง “สคริปต์ PowerShell ส่งอีเมล” ซึ่งจะระบุ Office 365 เป็นเซิร์ฟเวอร์ -mail
ในสถานการณ์นี้ เราจะสร้างเซสชัน SMTP มาตรฐาน และเราจะ จะไม่ให้ ข้อมูลรับรองผู้ใช้ใดๆ (การเชื่อมต่อที่ไม่ระบุชื่อ)
งานที่เราต้องทำให้เสร็จมีดังนี้:
- รับชื่อโฮสต์ของเซิร์ฟเวอร์อีเมลซึ่งเราจะจัดการ
เราจะต้อง "ดึงข้อมูล" ข้อมูลเกี่ยวกับความหมายของชื่อโฮสต์ Exchange Online ระเบียน MX ที่แสดงถึงชื่อโดเมนสาธารณะของคุณใน Office 365 จากพอร์ทัล Office 365 | การตั้งค่า DNS
- สร้างสคริปต์ PowerShell ซึ่งจะรวมพารามิเตอร์ที่จำเป็น เช่น ที่อยู่อีเมลของผู้ส่ง ที่อยู่อีเมลของผู้รับ ชื่อเซิร์ฟเวอร์อีเมล หมายเลขพอร์ตของเซิร์ฟเวอร์อีเมล ข้อมูลรับรองผู้ใช้ เป็นต้น
- เรียกใช้ "สคริปต์ PowerShell ส่งอีเมล" และตรวจสอบว่าอีเมลส่งไปยังผู้รับปลายทางได้สำเร็จ
แนวทางทั่วไปและข้อกำหนดสำหรับการใช้ “สคริปต์ PowerShell ส่งอีเมล
ก่อนที่เราจะเรียกใช้ “สคริปต์ส่งจดหมาย PowerShell” เราจะต้องตรวจสอบให้แน่ใจว่าได้ปฏิบัติตามข้อกำหนดต่อไปนี้:
1. คอนโซล PowerShell และ Set-ExecutionPolicy
ตามค่าเริ่มต้น คอนโซล PowerShell ไม่อนุญาตให้เรียกใช้สคริปต์ PowerShell
ในกรณีที่เราไม่ได้ใช้คอนโซล PowerShell ที่มีอยู่ในอดีตสำหรับการเรียกใช้สคริปต์ PowerShell เราจะต้องกำหนดค่าคอนโซล PowerShell เป็น "อนุญาต ” การเรียกใช้สคริปต์ PowerShell
ในกรณีที่คุณต้องการคำแนะนำในการอ่านวิธีเปิดใช้งานการดำเนินการสคริปต์ PowerShell คุณสามารถใช้คำแนะนำในส่วนต่อไปนี้
2. ไฟร์วอลล์เครือข่ายและการสื่อสารขาออก
ช่องทางการสื่อสารไปยังเซิร์ฟเวอร์ Exchange Online ตามพอร์ต 25
เราจะต้องตรวจสอบว่าไฟร์วอลล์เครือข่ายของเรามีกฎที่ช่วยให้เดสก์ท็อปของเราใช้เซสชัน SMTP (พอร์ต 25) กับเซิร์ฟเวอร์อีเมล Office 365
3. ที่อยู่ IP แบบไดนามิกและแบบคงที่
ในกรณีที่คุณเรียกใช้ “สคริปต์ PowerShell ส่งอีเมล” จากเดสก์ท็อปที่ใช้ “ที่อยู่ IP สาธารณะแบบไดนามิก” เช่น เครือข่ายในบ้าน เซิร์ฟเวอร์จดหมาย Office 365 (Exchange Online) จะไม่ยอมรับคำขอการสื่อสาร
คุณจะต้องใช้โฮสต์ที่อยู่บนเครือข่ายที่ใช้ที่อยู่ IP แบบคงที่เพื่อเป็นตัวแทนของโฮสต์ภายใน
คำอธิบายสถานการณ์
เพื่อให้สามารถสาธิตวิธีที่เราใช้ “สคริปต์ PowerShell ส่งอีเมล” สำหรับการส่งอีเมล
ผ่านเซิร์ฟเวอร์อีเมล Office 365 (Exchange Online) เราจะใช้สถานการณ์ต่อไปนี้:
ข้อมูลองค์กร
- ชื่อโดเมนสาธารณะขององค์กรของเราคือ - o365info.com
- โครงสร้างพื้นฐานเมลของเราโฮสต์อยู่ที่ Office 365 (Exchange Online)
ข้อมูลรับรองผู้ใช้
ผู้รับ Office 365 ที่เราจะใช้ข้อมูลประจำตัวของเขาคือ -admin@o365info.com
ผู้ส่งต้นทางและผู้รับปลายทาง
ในสถานการณ์ของเรา เราจะใช้ผู้รับต่อไปนี้:
- ที่อยู่อีเมลของผู้ส่งคือ - admin@o365info.com
- ที่อยู่อีเมลของผู้รับคือ - admin@o365info.com
โครงสร้างพื้นฐานเมล Office 365
ในสภาพแวดล้อม Office 365 หากเราต้องการใช้เซสชันที่ไม่ได้รับการรับรองความถูกต้องกับเซิร์ฟเวอร์เมล Office 365 เราจะต้องค้นหาชื่อโฮสต์ของ Exchange Online ที่แสดงถึงโดเมนการลงทะเบียนสาธารณะของเราใน Office 365
- ในสถานการณ์เฉพาะของเรา ชื่อโฮสต์ของเซิร์ฟเวอร์จดหมาย Office 365 คือ - o365info2.mail.protection.outlook.com
หมายเหตุ - เราจะตรวจสอบวิธีรับข้อมูลเกี่ยวกับชื่อโฮสต์ Exchange Online ในส่วนถัดไป
- พอร์ตสื่อสารที่เราใช้คือ 25 (TLS)
งาน 1#3 - รับข้อมูลเกี่ยวกับชื่อโฮสต์ของระเบียน MX ที่แสดงถึงชื่อโดเมนสาธารณะของคุณใน Office 365
เพื่อให้สามารถรับชื่อโฮสต์ของเซิร์ฟเวอร์จดหมาย Office 365 ที่แสดงถึงชื่อโดเมนสาธารณะของเรา เราจะใช้พอร์ทัลการจัดการ Office 365
- เข้าสู่ระบบพอร์ทัลการจัดการ Office 365
- บนแถบเมนูด้านซ้าย ให้เลือกไอคอน การตั้งค่า
- เลือกเมนู โดเมน
ในสถานการณ์ของเรา เราจะเลือกดูการตั้งค่าชื่อโดเมน - o365info.com โดยดับเบิลคลิกที่ชื่อโดเมนที่เลือก
ในภาพหน้าจอต่อไปนี้ เราจะเห็นการตั้งค่า DNS ของโดเมน o365info.com
เราจะคัดลอกข้อมูลเกี่ยวกับชื่อโฮสต์ที่ปรากฏในระเบียน MX
ในสถานการณ์สมมติของเรา ชื่อโฮสต์ของ Exchange Online ที่แสดงถึงโดเมนของเราคือ - o365info2.mail.protection.outlook.com
งาน 2#3 - สร้าง “สคริปต์ PowerShell ส่งอีเมล”
เพื่อให้สามารถส่งอีเมลโดยใช้ PowerShell เราจะใช้คำสั่ง PowerShell:
Send-MailMessage“สคริปต์ PowerShell ส่งอีเมล” ถูกสร้างขึ้นโดยใช้ไวยากรณ์ PowerShell ต่อไปนี้:
Send-MailMessage -From <sender> -To <recipient> -Subject "<Subject>" -Body "<Subject>" -SmtpServer <SMTP server> -Port <port number>ในสถานการณ์ของเรา เราจะใช้ไวยากรณ์คำสั่ง PowerShell โดยใช้พารามิเตอร์ต่อไปนี้:
Send-MailMessage -From admin@o365info.com -To admin@o365info.com -Subject "Test Email" -Body "Test SMTP Relay Service" -SmtpServer o365info2.mail.protection.outlook.com -Port 25ในการสร้างสคริปต์ PowerShell เราสามารถใช้โปรแกรมแก้ไขข้อความใดก็ได้
ในตัวอย่างของเรา เราใช้แผ่นจดบันทึก
เราจะคัดลอกข้อมูลต่อไปนี้ไปยังไฟล์ข้อความ:
ไวยากรณ์คำสั่ง PowerShell ประกอบด้วยส่วนต่างๆ ต่อไปนี้:
- จาก (หมายเลข 1) - เราจะใช้ที่อยู่อีเมล - admin@o365info.com เพื่อเป็นตัวแทนของที่อยู่อีเมลของผู้ส่ง
- ถึง (หมายเลข 2) - เราจะใช้ที่อยู่อีเมล - admin@o365info.com เพื่อเป็นตัวแทนที่อยู่อีเมลของผู้รับปลายทาง
- หัวเรื่อง (หมายเลข 3) - นี่คือข้อความของหัวเรื่องอีเมล
- เนื้อหา (หมายเลข 4) - นี่คือข้อความที่จะปรากฏในข้อความอีเมล “เนื้อหา”
- SmtpServer (หมายเลข 5) - นี่คือชื่อโฮสต์หรือที่อยู่ IP ของเมลเซิร์ฟเวอร์ที่เราต้องการระบุ ในสถานการณ์ของเรา เราต้องการจัดการกับเซิร์ฟเวอร์ Exchange Online ว่าเป็น “เซิร์ฟเวอร์อีเมล” เซิร์ฟเวอร์” เราจะระบุชื่อโฮสต์ที่เราได้รับจากขั้นตอนก่อนหน้า - o365info2.mail.protection.outlook.com
- พอร์ต (หมายเลข 6) - นี่คือหมายเลขพอร์ตของเมลเซิร์ฟเวอร์ที่จะ "รับฟัง" คำขอการสื่อสารของเรา ในสภาพแวดล้อม Office 365 Exchange Online จะรับฟังโดยใช้พอร์ต 25
การบันทึกไฟล์สคริปต์ PowerShell
ขั้นตอนต่อไปคือ - บันทึกไฟล์ข้อความเป็นสคริปต์ PowerShell
เราใช้แผ่นจดบันทึกเพื่อสร้างสคริปต์ PowerShell
ในสถานการณ์ของเรา เราจะตั้งชื่อสคริปต์ PowerShell - Sendmail-smtp.ps1
- ในส่วน - บันทึกเป็นประเภท” เลือกตัวเลือก - ไฟล์ทั้งหมด (*.*)
- ตัวเลือกที่แนะนำเพิ่มเติมคือ หากต้องการบันทึกสคริปต์ PowerShell
โดยใช้ UTF-8
นี่ไม่ใช่ข้อกำหนดบังคับ แต่จากประสบการณ์ของฉัน เมื่อบันทึกสคริปต์ PowerShell โดยใช้รูปแบบมาตรฐาน เช่น ในฐานะ ANSI เราอาจประสบปัญหาเมื่อเราพยายามเรียกใช้สคริปต์ PowerShell จากคอนโซล PowerShell
ในสถานการณ์ของเรา เราจะบันทึก "สคริปต์ PowerShell ส่งอีเมล" ในโฟลเดอร์ สคริปต์ ที่เราสร้างไว้ในไดรฟ์ C:
งาน 3#3 - เรียกใช้ “สคริปต์ส่งจดหมาย PowerShell”
การเรียกใช้สคริปต์ PowerShell | การกำหนดค่าครั้งแรก
ตามค่าเริ่มต้น คอนโซล PowerShell จะป้องกันไม่ให้เราเรียกใช้สคริปต์ PowerShell
เพื่อให้สามารถเรียกใช้สคริปต์ PowerShell เราจะต้องตั้งค่านโยบายการกำหนด PowerShell เริ่มต้น
หากต้องการอัปเดตนโยบายการหา PowerShell ที่มีอยู่ เราจำเป็นต้องเรียกใช้คอนโซล PowerShell ในฐานะผู้ดูแลระบบ
- ค้นหาไอคอน PowerShell คลิกขวาที่ไอคอนคอนโซล PowerShell และเลือกเมนู - เรียกใช้ในฐานะผู้ดูแลระบบ
หน้าต่างป๊อปอัปจะปรากฏขึ้นเพื่อขอให้เราอนุมัติงาน "เรียกใช้ในฐานะผู้ดูแลระบบ"
- คลิก ใช่ เพื่ออนุมัติ
เรียกใช้คำสั่ง PowerShell ต่อไปนี้:
Set-ExecutionPolicy Unrestricted -forceงาน 2#2 - เรียกใช้ “สคริปต์ PowerShell ส่งอีเมล”
เราจะเรียกใช้ "ส่งจดหมาย PowerShell" จากคอนโซล PowerShell โดยใช้คำสั่งต่อไปนี้:
- เข้าถึงสคริปต์ PowerShell โดยนำทางไปยังเส้นทางที่มีสคริปต์ PowerShell อยู่
ในสถานการณ์ของเรา สคริปต์ PowerShell จะบันทึกในโฟลเดอร์ C:\script
พิมพ์คำสั่งต่อไปนี้:
cd C:\script- เรียกใช้สคริปต์ PowerShell
ในการรันสคริปต์ PowerShell เราสามารถเขียนชื่อเต็มของสคริปต์
- Sendmail-smtp.ps1 หรือใช้คุณลักษณะ เติมข้อความอัตโนมัติ ของ PowerShell
ตัวอย่างเช่น ในการเรียกสคริปต์ PowerShell เราจำเป็นต้องเขียนอักขระต่อไปนี้ - .\ พิมพ์อักษรตัวแรกของสคริปต์ PowerShell (“s“) และกดปุ่ม ปุ่ม Tab
หลังจาก "กดปุ่ม" ปุ่ม TAB แล้ว คอนโซล PowerShell เราจะกรอกชื่อสคริปต์ PowerShell ที่เหลือด้วยตัวเอง
เพื่อตรวจสอบว่าส่งข้อความอีเมลสำเร็จหรือไม่ เราจะลงชื่อเข้าใช้กล่องจดหมายของผู้ดูแลระบบโดยใช้โปรแกรมรับส่งเมล OWA
ในภาพหน้าจอต่อไปนี้ เราจะเห็นว่าอีเมลส่งไปยังผู้รับปลายทางได้สำเร็จ แต่สิ่งสำคัญคือต้องเน้นย้ำว่าอีเมลนั้นส่งไปยัง
โฟลเดอร์อีเมลขยะ
นี่เป็นผลลัพธ์ที่คาดหวังเนื่องจากตามที่กล่าวไว้ สคริปต์ PowerShell ใช้ข้อมูลประจำตัวของผู้รับ Office 365 (admin@o365info.com) เนื่องจากสคริปต์ PowerShell ไม่ได้ให้ข้อมูลประจำตัวผู้ใช้ใดๆ Exchange Online จึงถือว่าข้อความอีเมลเป็น "อีเมลที่น่าสงสัย" และด้วยเหตุนี้ เหตุผลที่ประทับอีเมลเป็นอีเมลขยะ!
หากคุณต้องการหลีกเลี่ยงสถานการณ์นี้ ขอแนะนำให้สร้าง Exchange Online Connector ซึ่งจะระบุ “ผู้ส่งต้นทาง” ด้วยที่อยู่ IP สาธารณะของเขา
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการกำหนดค่านี้ได้ในบทความ - ส่งอีเมลไปยัง Exchange Online โดยใช้เซสชัน SMTP มาตรฐาน | ตอนที่ 2#4
บทความถัดไปในชุดบทความปัจจุบัน
ส่งอีเมลไปที่ office 365 โดยใช้สคริปต์ PowerShell และรหัสผ่านที่เข้ารหัสที่บันทึกไว้ | ตอนที่ 2#2











