คำนำ
ฉันเชื่อว่าทุกคนควรรู้ว่า API แบบเปิดทั่วไปเรียกเราว่าจะมีค่าส่งคืนหรือรหัสสถานะเพื่อบอกเราว่าการดำเนินการสำเร็จหรือไม่ อย่างไรก็ตาม Javamail ไม่ได้ให้ค่าส่งคืนดังกล่าว
ดังนั้นเมื่อโทรหา Javamail เพื่อส่งอีเมลเราสามารถใช้ข้อยกเว้น Catch เพื่อตรวจสอบว่าอีเมลถูกส่งสำเร็จหรือไม่ เราเชื่อว่าตราบใดที่ไม่มีข้อยกเว้นจะส่งอีเมลสำเร็จ จากนั้นมาวิเคราะห์ว่าทำไม Javamail ไม่ได้ให้ค่าส่งคืนและสถานะการส่งอีเมลที่ประสบความสำเร็จนั้นมีความน่าเชื่อถือผ่านข้อยกเว้นหรือไม่
Javamail ส่งหลักการทางไปรษณีย์
เมื่อส่งจดหมายโดยใช้ Javamail เราต้องจัดให้มีเซสชันเมล กระบวนการสร้างเซสชันเมลมีดังนี้:
คุณสมบัติอุปกรณ์ประกอบฉาก = คุณสมบัติใหม่ (); // IP และพอร์ตของเซิร์ฟเวอร์ที่ส่ง mail props.put ("mail.smtp.host", mail_smtp_host); props.put ("mail.smtp.port", mail_smtp_port); // ไม่ว่าจะจำเป็นต้องมีการรับรองความถูกต้อง ("mail.smtp.auth", "true"); props.put ("mail.smtp.socketfactory.class", "javax.net.ssl.sslsocketfactory"); เซสชั่นเซสชัน = เซสชัน. getDefaultInstance (อุปกรณ์ประกอบฉาก, Authenticator ใหม่ () {passwords passwordauthentication getPasswordauthentication () {// ลงชื่อเข้าใช้ชื่อผู้ใช้และรหัสผ่านของอีเมลส่งเซิร์ฟเวอร์ส่งคืนรหัสผ่านใหม่ (mail_sender_mail, mail_sender_pass);วิเคราะห์รหัส
ก่อนที่จะสร้างเซสชันเราจะสร้างคุณสมบัติก่อน คุณสมบัตินี้ตั้งค่าพารามิเตอร์ต่อไปนี้: mail.smtp.host , mail.smtp.port , mail.smtp.auth และ mail.smtp.socketFactory.class เมื่อสร้างเซสชันคุณต้องส่งผ่านชื่อผู้ใช้และรหัสผ่านเพื่อส่งอีเมล
รหัสอีเมลที่ส่งมีดังนี้:
// 5 ขั้นตอนในการส่งอีเมลโดยใช้ Javamail // 1 สร้างเซสชันเซสชันเซสชัน = เซสชัน getInstance (prop); // เปิดใช้งานโหมดการดีบักเซสชันเพื่อให้คุณสามารถดูสถานะการทำงานของอีเมลที่ส่งโดยโปรแกรมเซสชัน SetDebug (จริง); // 2. รับวัตถุการขนส่งผ่านการขนส่งเซสชัน ts = session.getTransport (); // 3. ใช้ชื่อผู้ใช้และรหัสผ่านของอีเมลเพื่อเชื่อมต่อกับเซิร์ฟเวอร์เมล เมื่อส่งอีเมลผู้ส่งจะต้องส่งชื่อผู้ใช้และรหัสผ่านของอีเมลไปยังเซิร์ฟเวอร์ SMTP ชื่อผู้ใช้และรหัสผ่านสามารถตรวจสอบได้ก่อนที่จะส่งอีเมลไปยังผู้รับตามปกติ ts.connect ("smtp.sohu.com", "gacl", "รหัสผ่านอีเมล"); // 4. สร้างข้อความข้อความ = createSimpleMail (เซสชัน); // 5. ส่งจดหมาย ts.sendmessage (ข้อความ, message.getallrecipients ()); // ปิดการเชื่อมต่อ ts.close ();สรุปกระบวนการส่งอีเมลมีขั้นตอนต่อไปนี้:
1. สร้างวัตถุเซสชันที่มีลิงก์เครือข่ายไปยังเซิร์ฟเวอร์เมล
2. สร้างวัตถุข้อความที่แสดงเนื้อหาของอีเมล
3. สร้างวัตถุการขนส่ง
4. ลิงก์ไปยังเซิร์ฟเวอร์
5. ส่งข้อความ
6. ปิดลิงค์
เนื่องจากการขนส่งเป็นเพียงคลาสที่เป็นนามธรรมวิธีการ ts.sendMessage จึงเป็นวิธี sendMessage ของ Smtptransport Class SMTPTransport
วิธี sendMessage ของ SMTPTransport อาศัยโปรโตคอล SMTP เพื่อส่งอีเมล
ดังนั้นเมื่อ Javamail ใช้บริการ SMTP เพื่อส่งอีเมลเมื่อคุณส่งอีเมลไปยังเซิร์ฟเวอร์ SMTP คุณจะได้รับสถานะที่ถูกส่งไปยังคิว SMTP แต่คุณไม่สามารถรับได้ว่าเซิร์ฟเวอร์เมลสามารถส่งได้สำเร็จหรือไม่ กล่าวคือคุณไม่สามารถรับประกันได้ว่าอีเมลจะถูกส่งสำเร็จ ขึ้นอยู่กับการส่งเนื้อหาของโปรโตคอล SMTP
อย่างไรก็ตามหากโปรโตคอล SMTP ล้มเหลวจะมีการรายงานข้อผิดพลาด บริการส่งข้อมูลที่เชื่อถือได้ของ SMTP ที่จัดทำโดย TCP ส่งข้อความเมลจากเซิร์ฟเวอร์เมลของผู้ส่งไปยังเซิร์ฟเวอร์เมลของผู้รับ
ดังนั้นเราสามารถคิดได้ว่าเมื่อเราโทรหา Javamail เพื่อส่งอีเมลหากโปรแกรมไม่ได้รายงานข้อผิดพลาดหมายความว่าอีเมลจะถูกส่งเรียบร้อยแล้ว
กลไกการทำงาน SMTP
SMTP มักจะมีโหมดการทำงานสองโหมด: การส่ง SMTP และรับ SMTP
วิธีการทำงานที่เฉพาะเจาะจงคือ: หลังจากได้รับคำขออีเมลของผู้ใช้จะกำหนดว่าอีเมลเป็นอีเมลท้องถิ่นหรือไม่ หากส่งโดยตรงไปยังอีเมลของผู้ใช้มิฉะนั้นให้สอบถามบันทึก MX ของเซิร์ฟเวอร์เมลระยะไกลจาก DNS และสร้างช่องสัญญาณสองทางพร้อมกับระยะไกลที่ได้รับ SMTP หลังจากนั้นคำสั่ง SMTP จะถูกส่งโดยการส่ง SMTP ที่ได้รับจาก SMTP ที่ได้รับและการตอบสนองจะถูกส่งไปในทิศทางตรงกันข้าม เมื่อมีการสร้างช่องสัญญาณส่งผู้ส่ง SMTP จะส่งคำสั่งอีเมลเพื่อระบุผู้ส่งอีเมล หากผู้รับ SMTP สามารถรับจดหมายคำตอบตกลงจะถูกส่งคืน จากนั้นผู้ส่ง SMTP ออกคำสั่ง RCPT เพื่อยืนยันว่าได้รับอีเมลหรือไม่ หากผู้รับ SMTP ได้รับมันจะส่งคืนคำตอบตกลง หากไม่สามารถรับได้จะส่งการตอบกลับการปฏิเสธ (แต่ไม่ได้ยกเลิกการดำเนินการทางอีเมลทั้งหมด) และทั้งสองฝ่ายจะทำซ้ำหลายครั้ง เมื่อผู้รับได้รับอีเมลทั้งหมดจะได้รับลำดับพิเศษ หากผู้รับสามารถประมวลผลอีเมลได้สำเร็จจะส่งคืนการตอบกลับ OK
กระบวนการทำงาน SMTP
Simple Mail Transfer Protocol (SMTP) เป็นโปรโตคอลการส่งอีเมลที่ใช้ข้อความที่ใช้บนอินเทอร์เน็ตเพื่อแลกเปลี่ยนจดหมายระหว่างเซิร์ฟเวอร์เมล SMTP เป็นบริการระดับแอปพลิเคชันที่สามารถปรับให้เข้ากับระบบเครือข่ายต่างๆ
คำสั่งและการตอบสนองของ SMTP นั้นขึ้นอยู่กับข้อความพร้อมหน่วยพฤติกรรมคำสั่งและสายใหม่คือ CR/LF โดยทั่วไปข้อมูลการตอบกลับมีเพียงบรรทัดเดียวเริ่มต้นด้วยรหัส 3 หลักและสามารถแนบคำอธิบายข้อความสั้น ๆ ได้ในภายหลัง
SMTP ต้องผ่านสามขั้นตอน: การสร้างการเชื่อมต่อส่งจดหมายและปล่อยการเชื่อมต่อ โดยเฉพาะ:
(1) สร้างการเชื่อมต่อ TCP
(2) ไคลเอนต์ส่งคำสั่ง HELO ไปยังเซิร์ฟเวอร์เพื่อระบุตัวตนของผู้ส่งเองและจากนั้นไคลเอนต์จะส่งคำสั่งอีเมล
(3) เซิร์ฟเวอร์ตอบสนองด้วยตกลงระบุว่าพร้อมที่จะรับ
(4) ลูกค้าส่งคำสั่ง RCPT
(5) ฝั่งเซิร์ฟเวอร์ระบุว่ายินดีรับอีเมลสำหรับผู้รับหรือไม่
(6) สิ้นสุดการเจรจาส่งอีเมลและใช้ข้อมูลคำสั่งเพื่อส่งเนื้อหาอินพุต
(7) จบการส่งและออกด้วยคำสั่งเลิก
เซิร์ฟเวอร์ SMTP กำหนดเส้นทางอีเมลตาม Exchange Mail (MX) ใน DNS เมื่อส่งอีเมลเซิร์ฟเวอร์อีเมลจะอยู่ตามคำต่อท้ายที่อยู่ของผู้รับ SMTP เสร็จสิ้นฟังก์ชั่นการแก้ไขการรวบรวมและอ่านอีเมลผ่านตัวแทนผู้ใช้ (UA); และส่งอีเมลไปยังปลายทางผ่านตัวแทนการถ่ายโอนจดหมาย (MTA)
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะช่วยในการศึกษาหรือทำงานของคุณ หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร