Java Mail เป็นเครื่องมือที่ใช้บัญชีอีเมลที่มีอยู่เพื่อส่งอีเมล ตัวอย่างเช่นฉันลงทะเบียนบัญชีอีเมลด้วย NetEase ผ่านการควบคุมของ Java Mail ฉันไม่สามารถเข้าสู่กล่องจดหมาย NetEase ด้วยตนเองเพื่อให้โปรแกรมสามารถใช้กล่องจดหมาย NetEase โดยอัตโนมัติเพื่อส่งอีเมล กลไกนี้ใช้กันอย่างแพร่หลายในการเปิดใช้งานการลงทะเบียนและการส่งสแปม
กระบวนการทั่วไปของการส่งจดหมาย Java มีดังนี้:
1. สร้างคลาสเฉพาะที่สืบทอดมาจาก javax.mail.authenticator และแทนที่วิธี getPasswordauthentication () ภายใน คลาสนี้ใช้เป็นการตรวจสอบเข้าสู่ระบบเพื่อให้แน่ใจว่าคุณมีสิทธิ์ส่งอีเมลไปยังกล่องจดหมายนี้
2. สร้างไฟล์คุณสมบัติซึ่งเก็บพารามิเตอร์เช่นที่อยู่เซิร์ฟเวอร์ SMTP
3. สร้าง javax.mail.session ผ่านไฟล์คุณสมบัติที่สร้างขึ้นและคลาสคอนกรีต javax.mail.authenticator การสร้างเซสชันนั้นเทียบเท่ากับการเข้าสู่ที่อยู่อีเมล ส่วนที่เหลือเป็นอีเมลใหม่โดยธรรมชาติ
4. ในการสร้างเนื้อหาอีเมลโดยทั่วไปจะเป็น javax.mail.internet.mimemessage วัตถุและระบุผู้ส่งผู้รับหัวเรื่องเนื้อหา ฯลฯ
5. ใช้คลาส Javax.mail.transport Tool Class เพื่อส่งอีเมล
ด้านล่างนี้เป็นรหัสที่ฉันห่อหุ้มและความคิดเห็นก็ค่อนข้างละเอียด
1. ก่อนอื่นมันเป็นคลาสเฉพาะที่สืบทอดมาจาก javax.mail.authenticator วิธี getPasswordauthentication () คือการสร้างวัตถุ passwordauthentication และส่งคืนซึ่งเป็นความสับสนเล็กน้อยที่จะเข้าใจถึงความตั้งใจในการออกแบบของจดหมาย Java อาจเป็นไปได้ว่า javax.mail.authenticator ให้มาตรการตรวจสอบเพิ่มเติมแก่เราเพื่อความปลอดภัย
แพ็คเกจ com.mzule.simplemail; นำเข้า Javax.mail.authenticator; นำเข้า Javax.mail.passwordauthentication; /** * การตรวจสอบเข้าสู่ระบบกล่องจดหมายเซิร์ฟเวอร์ * * @author mzule * */คลาสสาธารณะ mailauthenticator ขยาย Authenticator {/** * ชื่อผู้ใช้ (Login Mailbox) */ชื่อผู้ใช้สตริงส่วนตัว; / *** รหัสผ่าน*/ รหัสผ่านสตริงส่วนตัว; / *** เริ่มต้นกล่องจดหมายและรหัสผ่าน** @param ชื่อผู้ใช้กล่องจดหมาย* @param รหัสผ่านรหัสผ่าน*/ public mailauthenticator (ชื่อผู้ใช้สตริงรหัสผ่านสตริง) {this.username = ชื่อผู้ใช้; this.password = รหัสผ่าน; } สตริง getPassword () {ส่งคืนรหัสผ่าน; } @Override PreventAtaITHENTICATION GETPASSWORDAUTHENTICATION () {ส่งคืนรหัสผ่านใหม่ (ชื่อผู้ใช้รหัสผ่าน); } สตริง getUserName () {ส่งคืนชื่อผู้ใช้; } โมฆะสาธารณะ setPassword (รหัสผ่านสตริง) {this.password = รหัสผ่าน; } โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้; -2. คลาสส่งอีเมล ขั้นตอนที่เหลือจะถูกนำไปใช้ในชั้นเรียนนี้ SimpleMail ในรหัสเป็น pojo ที่ห่อหุ้มหัวเรื่องและเนื้อหาของอีเมล ฉันรู้สึกว่ามันไม่เหมาะสมที่จะรวมทั้งหัวข้อและเนื้อหาในพารามิเตอร์วิธีการดังนั้นฉันจึงใช้วิธีนี้มากเกินไป นอกจากนี้เนื่องจากที่อยู่เซิร์ฟเวอร์ SMTP ของกล่องจดหมายส่วนใหญ่สามารถคำนวณได้โดยที่อยู่อีเมล เพื่อความง่ายจะมีตัวสร้างที่ไม่ต้องการที่อยู่เซิร์ฟเวอร์ SMTP
แพ็คเกจ com.mzule.simplemail; นำเข้า java.util.list; นำเข้า java.util.properties; นำเข้า Javax.mail.messagingException; นำเข้า Javax.mail.session; นำเข้า Javax.mail.transport; นำเข้า Javax.mail.internet.addressexception; นำเข้า Javax.mail.internet.internetaddress; /*** ผู้ส่งจดหมายง่าย ๆ สามารถส่งเป็นเดี่ยวหรือมวล * * @author mzule * */คลาสสาธารณะ SimpleMailSender {/** * ไฟล์อุปกรณ์ประกอบฉากสำหรับการส่งอีเมล */ส่วนตัว Private Final Properties Props = System.getProperties (); / *** การตรวจสอบการเข้าสู่ระบบเซิร์ฟเวอร์ Mail*/ Private Transient MailAuthenticator Authenticator; / ** * เซสชันอีเมล */ เซสชันเซสชันส่วนตัวชั่วคราว; / ** * เริ่มต้นผู้ส่งจดหมาย * * @param smtphostname * ที่อยู่เซิร์ฟเวอร์อีเมล SMTP * @param ชื่อผู้ใช้ * ชื่อผู้ใช้ (ที่อยู่) สำหรับการส่งอีเมล * @param รหัสผ่าน * รหัสผ่านสำหรับการส่งอีเมล */ สาธารณะ simplemailsender (สตริงสุดท้าย smtphostname } /*** เริ่มต้นผู้ส่งอีเมล** @param ชื่อผู้ใช้* ชื่อผู้ใช้ (ที่อยู่) ของอีเมลที่ส่งอีเมลและใช้สิ่งนี้เพื่อแก้ไขที่อยู่เซิร์ฟเวอร์ SMTP* รหัสผ่าน @param* รหัสผ่าน* สำหรับการส่งอีเมล* /สาธารณะ SimpleMailsender + username.split ("@") [1]; init (ชื่อผู้ใช้, รหัสผ่าน, smtphostname); } / ** * การเริ่มต้น * * @param ชื่อผู้ใช้ * ชื่อผู้ใช้ (ที่อยู่) สำหรับการส่งอีเมล * @param รหัสผ่าน * รหัสผ่าน * @param smtphostname * ที่อยู่โฮสต์ SMTP * / โมฆะส่วนตัวเริ่มต้น (ชื่อผู้ใช้สตริงสตริง props.put ("mail.smtp.host", smtphostname); // ตรวจสอบ Authenticator = ใหม่ MailAuthenticator (ชื่อผู้ใช้รหัสผ่าน); // สร้างเซสชันเซสชัน = session.getInstance (อุปกรณ์ประกอบฉาก, Authenticator); } / ** * ส่งอีเมล * * @param ผู้รับ * ที่อยู่อีเมลผู้รับ * @param หัวเรื่อง * หัวเรื่องอีเมล * เนื้อหา @param * เนื้อหาอีเมล * @throws addressException * @throws messagingException * / โมฆะสาธารณะส่ง (ผู้รับสตริง // set sender message.setFrom (InternetAddress ใหม่ (Authenticator.getUserName ())); // set message receient.setRecipient (acceientType.TO, InternetAddress ใหม่ (ผู้รับ)); // ตั้งค่าข้อความหัวข้อ SetsUbject (หัวเรื่อง); // ตั้งค่าข้อความเนื้อหาข้อความ setContent (content.toString (), "text/html; charset = utf-8"); // ส่ง transport.send (ข้อความ); } / ** * อีเมลจำนวนมาก * * @param ผู้รับ * ผู้รับ * @param หัวเรื่อง * หัวเรื่อง * @param เนื้อหา * เนื้อหา * @throws addressexception * @throws messagingexception * / โมฆะสาธารณะส่ง (รายการ <string> ผู้รับ // ตั้งค่า message ผู้ส่ง SetFrom (InternetAddress ใหม่ (Authenticator.getUserName ())); // ตั้งค่าผู้รับสุดท้าย int num = ecceients.size (); InternetAddress [] ที่อยู่ = new InternetAddress [num]; สำหรับ (int i = 0; i <num; i ++) {ที่อยู่ [i] = ใหม่ internetaddress (ผู้รับ. get (i)); } message.setRecipients (ผู้รับ TYTYPE.TO, ที่อยู่); // ตั้งค่าข้อความหัวข้อ SetsUbject (หัวเรื่อง); // ตั้งค่าข้อความเนื้อหาอีเมล setContent (content.toString (), "text/html; charset = utf-8"); // ส่ง transport.send (ข้อความ); } / ** * ส่งอีเมล * * @param ผู้รับ * ที่อยู่อีเมลผู้รับ * @param Mail * วัตถุอีเมล * @throws addressException * @throws messagingException * / โมฆะสาธารณะส่ง (ผู้รับสตริง, จดหมายง่าย ๆ ) โยนที่อยู่ } / ** * อีเมลจำนวนมาก * * @param ผู้รับ * ผู้รับ * @param Mail * วัตถุเมล * @throws addressexception * @throws messagingexception * / โมฆะสาธารณะส่ง (รายการ <string> ผู้รับ, จดหมายง่าย ๆ ) โยน addressexception, messagingexception -3. การโทรผู้ส่งกล่องจดหมายด้านบนสามารถสร้างคลาสโรงงานได้ คลาสโรงงานสามารถห่อหุ้มกระบวนการสร้างได้ดังนั้นจึงสะดวกมากในการรับชื่อผู้ใช้กล่องจดหมายโดยอ่านไฟล์การกำหนดค่า รหัสต่อไปนี้เขียนขึ้นเมื่อฉันเขียนโหมดผู้สังเกตการณ์และมันก็แสดงให้เห็นถึงคลาสโรงงานสั้น ๆ
แพ็คเกจ com.mzule.dp.observer.factory; นำเข้า com.mzule.dp.observer.constant.mailsendertype; นำเข้า com.mzule.simplemail.simplemailsender; /*** โรงงาน Outbox** @author mzule**/คลาสสาธารณะ MailsenderFactory {/*** กล่องจดหมายบริการ*/ส่วนตัวคงที่ SimpleMailSender Servicesms = null; / *** รับกล่องจดหมาย** @param ประเภทกล่องจดหมายประเภท* @@return mailbox ที่ตรงกับประเภท*/ สาธารณะคงที่ simplemailsender getsender (mailsendertype ประเภท) {ถ้า (พิมพ์ == mailsendertype.service) {ถ้า (servicesms == null) } ส่งคืนบริการ; } return null; -4. ส่งอีเมล หรือรหัสในการสาธิตโหมดผู้สังเกตการณ์ฮะ
แพ็คเกจ com.mzule.dp.observer.observer; นำเข้า java.util.arraylist; นำเข้า java.util.list; นำเข้า java.util.observable; นำเข้า java.util.observable; นำเข้า Java.util.observable; นำเข้า Java.util.observer com.mzule.dp.observer.constant.mailsendertype; นำเข้า com.mzule.dp.observer.factory.mailsenderfactory; นำเข้า com.mzule.dp.observer.po.pro.product; ระดับสาธารณะ ProductPriceObserver ใช้ผู้สังเกตการณ์ {@Override การอัปเดตโมฆะสาธารณะ (OBJ ที่สังเกตได้, Object ARG) {ผลิตภัณฑ์ผลิตภัณฑ์ = NULL; if (OBJ Instanceof Product) {product = (ผลิตภัณฑ์) obj; } if (arg instanceof float) {float price = (float) arg; Float ลดลง = product.getPrice () - ราคา; ถ้า (ลดลง> 0) {// ส่งอีเมล SimpleMailSender SMS = MailSenderFactory .GetSender (Mailsendertype.service); รายการ <String> ผู้รับ = new ArrayList <String> (); ผู้รับ ADD ("[email protected]"); ผู้รับ. ADD ("[email protected]"); ลอง {สำหรับ (ผู้รับสตริง: ผู้รับ) {sms.send (ผู้รับ, "การเปลี่ยนแปลงราคา", "รายการที่คุณให้ความสนใจกับ" + product.getName () + "ราคาลดลงจาก" + product.get.price () + "หยวนถึง" + ราคา + "หยวน }} catch (addressException e) {e.printStackTrace (); } catch (messagingException e) {e.printStackTrace (); - 5. ตรวจสอบว่าอีเมลถูกส่งเรียบร้อยแล้วหรือไม่
ข้างต้นเป็นกระบวนการทั้งหมดในการส่งอีเมล Java และฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคน