ภาพรวม
1. มาตรฐานที่เกี่ยวข้องกับอีเมล
โปรแกรมบริการ Javamail ที่จัดทำโดยผู้ผลิตสามารถเลือกใช้โปรโตคอลอีเมลบางอย่างโปรโตคอลจดหมายทั่วไป ได้แก่ :
SMTP (Simple Mail Transfer Protocol) เป็นโปรโตคอลการถ่ายโอนจดหมายอย่างง่าย มันเป็นชุดของกฎสำหรับการส่งอีเมลจากที่อยู่ต้นทางไปยังที่อยู่ปลายทาง มันควบคุมวิธีการขนส่งของตัวอักษร
POP3 (Post Office Protocol เวอร์ชัน 3): เป็นโปรโตคอลมาตรฐานที่ใช้ในการรับอีเมล
IMAP (Internet Mail Access Protocol): นั่นคือโปรโตคอลการเข้าถึงจดหมายทางอินเทอร์เน็ต มันเป็นโปรโตคอลทางเลือกสำหรับ POP3
โปรโตคอลทั้งสามนี้มีโปรโตคอลที่สอดคล้องกับการส่งสัญญาณ SSL ที่เข้ารหัส ได้แก่ SMTPS, POP3S และ IMAPS
MIME (ส่วนขยายอีเมลอินเทอร์เน็ตอเนกประสงค์): นั่นคือมาตรฐานนามสกุลอีเมลอินเทอร์เน็ตอเนกประสงค์ ไม่ใช่โปรโตคอลการถ่ายโอนจดหมาย อย่างไรก็ตามรูปแบบถูกกำหนดไว้สำหรับข้อความไฟล์แนบและเนื้อหาอื่น ๆ ที่ส่ง
2. บทนำสู่ Javamail
Javamail เป็น API ที่เผยแพร่โดย Sun เพื่อจัดการอีเมล มันไม่รวมอยู่ใน Java SE แต่เป็นส่วนหนึ่งของ Java EE
Mail.jar: ไฟล์ jar นี้มี Javamail API และ SMTP ที่ให้บริการ Sun, IMAP และ POP3
activation.jar: ไฟล์ jar นี้มีการใช้งานของ JAF API และ Sun
คลาสหลักที่ใช้ในแพ็คเกจ Javamail สำหรับการประมวลผลอีเมลคือ: คุณสมบัติ, เซสชัน, ข้อความ, ที่อยู่, Authenticator, การขนส่ง, ร้านค้า ฯลฯ
3. กระบวนการถ่ายโอนจดหมาย
ดังที่แสดงในภาพด้านบนขั้นตอนสำหรับการประมวลผลอีเมลมีดังนี้:
4. โครงสร้างข้อความ
คลาส MimeMessage: แสดงถึงอีเมลทั้งหมด
คลาส MimeBodyPart: ข้อความ MIME แสดงถึงข้อความ
คลาส MimeMultipart: แสดงถึงข้อมูล MIME ที่รวมกันซึ่งประกอบด้วยข้อมูล MIME หลายข้อมูล
5. คลาสหลักของ Javamail
Javamail จัดให้มีนามธรรมระดับสูงของการส่งและรับอีเมลสร้างอินเทอร์เฟซและคลาสที่สำคัญบางอย่างซึ่งเป็นพื้นฐานของโปรแกรม มาดูวัตถุที่พบบ่อยที่สุดเหล่านี้กันเถอะ
6. Java.util.properties คลาส (วัตถุคุณสมบัติ)
คลาส java.util.properties แสดงถึงชุดของคุณสมบัติ
แต่ละปุ่มและค่าของมันเป็นประเภทสตริง
เนื่องจาก Javamail จำเป็นต้องสื่อสารกับ Mail Server สิ่งนี้ต้องใช้โปรแกรมเพื่อให้ข้อมูลจำนวนมากเช่นที่อยู่เซิร์ฟเวอร์, พอร์ต, ชื่อผู้ใช้, รหัสผ่าน ฯลฯ Javamail จึงห่อหุ้มข้อมูลแอตทริบิวต์เหล่านี้ผ่านวัตถุคุณสมบัติ
ตัวอย่าง: ตัวอย่างเช่นรหัสต่อไปนี้ห่อหุ้มข้อมูลแอตทริบิวต์หลายอย่าง:
คุณสมบัติ prop = คุณสมบัติใหม่ (); prop.setProperty ("mail.debug", "true"); prop.setProperty ("mail.host", "[อีเมลได้รับการปกป้อง]"); prop.setProperty ("Mail.transport.protocol", "Smtp");สำหรับโปรโตคอลเมลที่แตกต่างกัน Javamail กำหนดว่าผู้ให้บริการจะต้องสนับสนุนชุดของแอตทริบิวต์
ตารางต่อไปนี้เป็นแอตทริบิวต์ทั่วไป (ค่าแอตทริบิวต์ถูกตั้งค่าเป็นประเภทสตริงและแถบประเภทแอตทริบิวต์เท่านั้นระบุว่าแอตทริบิวต์จะแยกวิเคราะห์ได้อย่างไร):
7. Javax.mail.session คลาส (วัตถุเซสชัน)
เซสชันแสดงถึงเซสชันเมล
ฟังก์ชั่นหลักของเซสชันประกอบด้วยสองด้าน:
รับข้อมูลแอตทริบิวต์การกำหนดค่าที่หลากหลาย: ข้อมูลแอตทริบิวต์ที่กำหนดผ่านวัตถุคุณสมบัติ;
เริ่มต้นสภาพแวดล้อม Javamail: เริ่มต้นสภาพแวดล้อม Javamail ตามไฟล์กำหนดค่า Javamail เพื่อสร้างอินสแตนซ์ของคลาสสำคัญอื่น ๆ ผ่านวัตถุเซสชัน
Javamail ให้ข้อมูลการกำหนดค่าพื้นฐานผ่านไฟล์ต่อไปนี้ในไดเรกทอรี Meta-Inf ของแพ็คเกจ JAR เพื่อให้เซสชันสามารถโหลดคลาสการใช้งานของผู้ให้บริการตามไฟล์การกำหนดค่านี้:
javamail.default.providers;
javamail.default.address.map
ตัวอย่าง:
คุณสมบัติอุปกรณ์ประกอบฉาก = คุณสมบัติใหม่ (); props.setProperty ("mail.transport.protocol", "smtp"); เซสชันเซสชัน = เซสชัน. getInstance (อุปกรณ์ประกอบฉาก);8. javax.mail.transport class (การถ่ายโอนจดหมาย)
มีเพียงสองวิธีในการจัดการการดำเนินการทางอีเมล: การส่งหรือรับ
Javamail อธิบายการดำเนินการที่แตกต่างกันทั้งสองนี้เป็นการส่ง (javax.mail.transport) และที่เก็บข้อมูล (javax.mail.store) ส่งการส่งอีเมลที่เกี่ยวข้องและจัดเก็บการรับจดหมายที่เกี่ยวข้อง
GetTransport: GetTransport () ในคลาสเซสชันมีวิธีการเกินพิกัดหลายวิธีที่สามารถใช้ในการสร้างวัตถุการขนส่ง
เชื่อมต่อ: หากคำสั่งการรับรองความถูกต้อง - mail.smtp.auth ถูกตั้งค่าแล้วเมื่อเชื่อมต่อกับเซิร์ฟเวอร์โดยใช้วิธีการเชื่อมต่อของคลาสการขนส่งจะต้องเพิ่มชื่อผู้ใช้และรหัสผ่าน
SendMessage: วิธี SendMessage ของคลาสการขนส่งใช้เพื่อส่งข้อความจดหมาย
ปิด: วิธีการปิดของคลาสการขนส่งใช้เพื่อปิดการเชื่อมต่อกับเซิร์ฟเวอร์เมล
9. Javax.mail.store คลาส (ที่เก็บจดหมาย)
GetStore: GetStore () ในคลาสเซสชันมีวิธีการโอเวอร์โหลดหลายวิธีที่สามารถใช้ในการสร้างวัตถุร้านค้า
เชื่อมต่อ: หากคำสั่งการตรวจสอบความถูกต้อง - mail.smtp.auth ถูกตั้งค่าแล้วเมื่อเชื่อมต่อกับเซิร์ฟเวอร์โดยใช้วิธีการเชื่อมต่อของคลาสร้านค้าจะต้องเพิ่มชื่อผู้ใช้และรหัสผ่าน
GetFolder: วิธี getFolder ของคลาสร้านค้าสามารถรับวัตถุโฟลเดอร์ในกล่องจดหมาย
ปิด: วิธีการปิดของคลาสร้านค้าใช้เพื่อปิดการเชื่อมต่อกับเซิร์ฟเวอร์เมล
10. javax.mail.message (วัตถุข้อความ)
javax.mail.message เป็นคลาสนามธรรมที่สามารถสร้างอินสแตนซ์โดย subclasses เท่านั้นและในกรณีส่วนใหญ่มันคือ javax.mail.internet.mimeMessage
Mimemessage แสดงถึงข้อความอีเมลประเภท MIME
ในการสร้างข้อความคุณต้องส่งผ่านวัตถุเซสชันไปยังตัวสร้าง mimemessage:
ข้อความ mimemessage = mememessage ใหม่ (เซสชัน);
หมายเหตุ: มีตัวสร้างอื่น ๆ เช่นการใช้สตรีมอินพุตในรูปแบบ RFC822 เพื่อสร้างข้อความ
SetFrom: ตั้งค่าผู้ส่งอีเมล
SetRecipient: ตั้งค่าผู้ส่งบุคคล CC และบุคคลลับของอีเมล
สามประเภทที่อยู่ที่กำหนดไว้ล่วงหน้าคือ:
Message.recipientType.to: ผู้รับ
Message.recipientType.cc: CC Person
Message.recipientType.bcc: แอบแจก
SetSubject: ตั้งค่าหัวข้ออีเมล
SetContent: ตั้งค่าเนื้อหาจดหมาย
SetText: หากเนื้อหาอีเมลเป็นข้อความธรรมดาคุณสามารถใช้อินเทอร์เฟซนี้เพื่อตั้งค่าเนื้อหาข้อความ
10. javax.mail.address (ที่อยู่)
เมื่อคุณสร้างเซสชันและข้อความและกรอกข้อความแล้วคุณสามารถใช้ที่อยู่เพื่อกำหนดที่อยู่อีเมล เช่นเดียวกับข้อความที่อยู่ยังเป็นคลาสนามธรรม คุณใช้คลาส javax.mail.internet.internetaddress
หากที่อยู่ที่สร้างขึ้นมีที่อยู่อีเมลเพียงแค่ส่งที่อยู่อีเมลไปยังตัวสร้าง
ตัวอย่าง:
ที่อยู่ = new InternetAddress ("[อีเมลป้องกัน]");
Authenticator: ได้รับการรับรอง
เช่นเดียวกับคลาส Java.net Javamail API ยังสามารถใช้ Authenticator เพื่อเข้าถึงทรัพยากรที่ได้รับการป้องกันผ่านชื่อผู้ใช้และรหัสผ่าน สำหรับ Javamail API ทรัพยากรเหล่านี้เป็นเซิร์ฟเวอร์เมล Javamail Authenticator อยู่ในแพ็คเกจ Javax.mail และแตกต่างจาก Authenticator คลาสที่มีชื่อเดียวกันใน Java.net ทั้งสองไม่ได้แชร์ Authenticator เดียวกันเพราะ Javamail API ใช้สำหรับ Java 1.1 และไม่มีหมวดหมู่ Java.net
หากต้องการใช้ Authenticator ก่อนอื่นให้สร้างคลาสย่อยของคลาสนามธรรมและส่งคืนอินสแตนซ์ PasswordAuthentication จากวิธี getPasswordauthentication () หลังจากการสร้างเสร็จสมบูรณ์คุณต้องลงทะเบียน Authenticator ด้วยเซสชัน จากนั้นเมื่อจำเป็นต้องมีการรับรองความถูกต้องแล้ว Authenticator จะได้รับแจ้ง คุณสามารถป๊อปอัพ Windows หรืออ่านชื่อผู้ใช้และรหัสผ่านจากไฟล์การกำหนดค่า (แม้ว่าจะไม่ปลอดภัยที่จะไม่เข้ารหัส) และส่งกลับไปยังโปรแกรมการโทรเป็นวัตถุรหัสผ่าน
ตัวอย่าง:
คุณสมบัติคุณสมบัติ = คุณสมบัติใหม่ (); Authenticator Auth = ใหม่ myauthenticator (); เซสชันเซสชัน = เซสชัน. getDefaultInstance (อุปกรณ์ประกอบฉาก, auth);
ตัวอย่าง
ส่งข้อความข้อความ
โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {คุณสมบัติ prop = คุณสมบัติใหม่ (); prop.setProperty ("mail.debug", "true"); prop.setProperty ("mail.host", mail_server_host); prop.setProperty ("mail.transport.protocol", "smtp"); prop.setProperty ("mail.smtp.auth", "true"); // 1. สร้างเซสชันเซสชัน = session.getInstance (prop); การขนส่ง ts = null; // 2. รับวัตถุการขนส่งผ่านเซสชัน ts = session.getTransport (); // 3. เชื่อมต่อกับเซิร์ฟเวอร์เมล ts.connect (mail_server_host, ผู้ใช้, รหัสผ่าน); // 4. สร้างข้อความ mimeMessage ข้อความ = mememessage ใหม่ (เซสชัน); // ข้อความส่วนหัวข้อความอีเมล SetFrom (InternetAddress ใหม่ (mail_from)); // ผู้ส่งของ message.setRecipient (message.recipientType.to, ใหม่ InternetAddress (mail_to)); // ผู้รับข้อความอีเมล SetRecipient (message.recipientType.cc, InternetAddress ใหม่ (mail_cc)); // CC Message.setRecipient (message.recipientType.bcc, InternetAddress ใหม่ (mail_bcc)); // ข้อความผู้ส่งข้อความ SetsUbject ("ทดสอบข้อความข้อความ"); // ชื่อของอีเมล // ข้อความข้อความ SETTEXT ("ไม่มีใครเทียบได้ในโลก"); // 5. ส่งจดหมาย ts.sendMessage (ข้อความ, message.getAllRecipients ()); ts.close ();}ส่งอีเมลแบบฟอร์ม HTML
โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {คุณสมบัติ prop = คุณสมบัติใหม่ (); prop.setProperty ("mail.debug", "true"); prop.setProperty ("mail.host", mail_server_host); prop.setProperty ("mail.transport.protocol", "smtp"); prop.setProperty ("mail.smtp.auth", "true"); // 1. สร้างเซสชันเซสชัน = session.getInstance (prop); การขนส่ง ts = null; // 2. รับวัตถุการขนส่งผ่านเซสชัน ts = session.getTransport (); // 3. เชื่อมต่อกับเซิร์ฟเวอร์เมล ts.connect (mail_server_host, ผู้ใช้, รหัสผ่าน); // 4. สร้างข้อความ mimeMessage ข้อความ = mememessage ใหม่ (เซสชัน); // ข้อความส่วนหัวข้อความอีเมล SetFrom (InternetAddress ใหม่ (mail_from)); // ผู้ส่งของ message.setRecipient (message.recipientType.to, ใหม่ InternetAddress (mail_to)); // ผู้รับข้อความอีเมล SetRecipient (message.recipientType.cc, InternetAddress ใหม่ (mail_cc)); // CC Message.setRecipient (message.recipientType.bcc, InternetAddress ใหม่ (mail_bcc)); // ผู้รับข้อความอีเมล SetsUbject ("ทดสอบ HTML Mail"); // ชื่อของสตริงอีเมล htmlContent = "<h1> สวัสดี </h1>" + "<p> แสดงภาพ <img src = 'cid: abc.jpg'> 1.jpg </p>"; ข้อความ mimebodypart = new MimeBodyPart (); text.setContent (htmlcontent, "text/html; charset = utf-8"); MimeBodyPart Image = new MimeBodyPart (); DataHandler DH = ใหม่ Datahandler (FileDataSource ใหม่ ("D: // [04] TEMP // IMG // 1.JPG")); image.setDatahandler (DH); image.setContentId ("abc.jpg"); // อธิบายความสัมพันธ์ของข้อมูล mimeMultipart mm = new mimemultipart (); mm.addbodypart (ข้อความ); mm.addbodypart (รูปภาพ); mm.setsubtype ("เกี่ยวข้อง"); message.setContent (มม.); message.savechanges (); // 5. ส่งจดหมาย ts.sendMessage (ข้อความ, message.getAllRecipients ()); ts.close ();}ส่งอีเมลพร้อมไฟล์แนบ
โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {คุณสมบัติ prop = คุณสมบัติใหม่ (); prop.setProperty ("mail.debug", "true"); prop.setProperty ("mail.host", mail_server_host); prop.setProperty ("mail.transport.protocol", "smtp"); prop.setProperty ("mail.smtp.auth", "true"); // 1. สร้างเซสชันเซสชัน = session.getInstance (prop); การขนส่ง ts = null; // 2. รับวัตถุการขนส่งผ่านเซสชัน ts = session.getTransport (); // 3. เชื่อมต่อกับเซิร์ฟเวอร์เมล ts.connect (mail_server_host, ผู้ใช้, รหัสผ่าน); // 4. สร้างข้อความ mimeMessage ข้อความ = mememessage ใหม่ (เซสชัน); // ข้อความส่วนหัวข้อความอีเมล SetFrom (InternetAddress ใหม่ (mail_from)); // ผู้ส่งของ message.setRecipient (message.recipientType.to, ใหม่ InternetAddress (mail_to)); // ผู้รับข้อความอีเมล SetRecipient (message.recipientType.cc, InternetAddress ใหม่ (mail_cc)); // CC Message.setRecipient (message.recipientType.bcc, InternetAddress ใหม่ (mail_bcc)); // ผู้รับข้อความอีเมล SetsUbject ("ทดสอบด้วยจดหมายแนบ"); // ชื่อของอีเมล mimebodypart ข้อความ = ใหม่ mimebodypart (); text.setContent ("มีสองไฟล์แนบในอีเมล", "text/html; charset = utf-8"); // อธิบายความสัมพันธ์ของข้อมูล mimeMultipart mm = new mimemultipart (); mm.setsubtype ("เกี่ยวข้อง"); mm.addbodypart (ข้อความ); String [] files = {"d: // [04] temp // img // 1.jpg", "d: // [04] temp // img // 2.jpg"}; // เพิ่มไฟล์แนบอีเมลสำหรับ (ชื่อไฟล์สตริง: ไฟล์) {mimebodypart attachPart = new MimeBodyPart (); attachpart.attachfile (ชื่อไฟล์); mm.addbodypart (แนบส่วน); } message.setContent (มม.); message.savechanges (); // 5. ส่งจดหมาย ts.sendMessage (ข้อความ, message.getAllRecipients ()); ts.close ();}รับอีเมลในกล่องจดหมายของคุณ
คลาสสาธารณะ storeMail {ผู้ใช้สตริงคงสุดท้าย = "หุ่นยนต์"; // ชื่อผู้ใช้รหัสผ่านสตริงคงสุดท้าย = "รหัสผ่าน 520"; // รหัสผ่านสาธารณะสตริงคงสุดท้ายสุดท้าย mail_server_host = "Mail. ***. com"; // Mailbox Server สาธารณะสตริงคงสุดท้าย final type_html = "text/html; charset = utf-8"; // เนื้อหาประเภทข้อความสาธารณะสตริงคงสุดท้ายสุดท้าย mail_from = "[อีเมลป้องกัน]"; // ผู้ส่งสตริงคงสุดท้ายสุดท้าย mail_to = "[อีเมลป้องกัน]"; // ไปยังสตริงคงที่สาธารณะสุดท้ายของผู้รับ mail_cc = "[อีเมลป้องกัน]"; // CC Person Public Public Final String mail_bcc = "[อีเมลป้องกัน]"; // แอบส่งโมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {// สร้างวัตถุคุณสมบัติที่มีคุณสมบัติการเชื่อมต่อเฉพาะคุณสมบัติ prop = คุณสมบัติใหม่ (); prop.setProperty ("mail.debug", "true"); prop.setProperty ("mail.store.protocol", "pop3"); prop.setProperty ("mail.pop3.host", mail_server_host); // 1. สร้างเซสชันเซสชันเซสชันเซสชัน = session.getInstance (prop); // 2. รับวัตถุร้านค้าผ่าน Session Store = Session.getStore (); // 3. เชื่อมต่อกับ Mail Server Store.Connect (mail_server_host, ผู้ใช้, รหัสผ่าน); // 4. รับโฟลเดอร์เมลในโฟลเดอร์กล่องจดหมาย = store.getFolder ("กล่องจดหมาย"); folder.open (folder.read_only); // รับข้อความทั้งหมดในข้อความข้อความโฟลเดอร์ข้อความ [] ข้อความ = folder.getMessages (); สำหรับ (int i = 0; i <messages.length; i ++) {string subject = messages [i] .getSubject (); สตริงจาก = (ข้อความ [i] .getFrom () [0]). toString (); System.out.println ("th" + (i + 1) + "เรื่องของข้อความ:" + หัวเรื่อง); System.out.println ("th" + (i + 1) + "ที่อยู่ผู้ส่งของอีเมล:" + จาก); } // 5. ปิดโฟลเดอร์ปิด (เท็จ); store.close (); -ส่งต่ออีเมล
ตัวอย่าง: รับอีเมลแรกภายใต้โฟลเดอร์เมลที่ระบุและส่งต่อ
โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {คุณสมบัติ prop = คุณสมบัติใหม่ (); prop.put ("mail.store.protocol", "pop3"); prop.put ("mail.pop3.host", mail_server_host); prop.put ("mail.pop3.starttls.enable", "true"); prop.put ("mail.smtp.auth", "true"); prop.put ("mail.smtp.host", mail_server_host); // 1. สร้างเซสชันเซสชัน = session.getDefaultInstance (prop); // 2. อ่านร้านค้าโฟลเดอร์เมล = session.getStore ("POP3"); store.connect (mail_server_host, ผู้ใช้, รหัสผ่าน); โฟลเดอร์โฟลเดอร์ = store.getFolder ("กล่องจดหมาย"); folder.open (folder.read_only); // รับข้อความอีเมลแรกในข้อความโฟลเดอร์เมล [] messages = folder.getMessages (); if (messages.length <= 0) {return; } ข้อความข้อความ = ข้อความ [0]; // พิมพ์สตริงข้อความคีย์จาก = internetaddress.toString (message.getFrom ()); if (จาก! = null) {system.out.println ("จาก:" + จาก); } string replyTo = internetaddress.toString (message.getReplyTo ()); if (ตอบกลับ! = null) {system.out.println ("ตอบกลับ:" + ตอบกลับ); } string to = internetaddress.toString (message.getRecipients (message.recipientType.to)); if (to! = null) {system.out.println ("ถึง:" + to); } string subject = message.getSubject (); if (หัวเรื่อง! = null) {system.out.println ("หัวเรื่อง:" + หัวเรื่อง); } วันที่ส่ง = message.getSentDate (); if (ส่ง! = null) {system.out.println ("ส่ง:" + ส่ง); } // ตั้งค่าข้อความส่วนหัวข้อความอีเมลไปข้างหน้าไปข้างหน้า = new mimeMessage (เซสชัน); forward.setFrom (InternetAddress ใหม่ (mail_from)); forward.setRecipient (message.recipientType.to, InternetAddress ใหม่ (mail_to)); forward.setSubject ("fwd:" + message.getSubject ()); // ตั้งค่าเนื้อหาอีเมลไปข้างหน้า mimebodypart bodypart = ใหม่ mimebodypart (); bodypart.setContent (ข้อความ "ข้อความ/rfc822"); multipart multipart = new mimemultipart (); multipart.addbodypart (bodypart); Forward.setContent (Multipart); Forward.savechanges (); Transport TS = Session.getTransport ("SMTP"); ts.connect (ผู้ใช้รหัสผ่าน); ts.sendmessage (ไปข้างหน้า, ไปข้างหน้า. getallrecipients ()); Folder.close (เท็จ); store.close (); ts.close (); System.out.println ("ส่งต่อข้อความสำเร็จ ... ");}ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้วิธีการส่งและรับอีเมลโดย Javamail