บทความนี้แนะนำรหัสการใช้งาน Java ของโปรแกรมผู้ส่งอีเมลอย่างง่าย มันถูกแชร์กับคุณสำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
ในรหัสนี้มีหลาย จุดที่ให้ความสนใจที่จะเน้น :
1. ใช้ซ็อกเก็ตเพื่อรับการเชื่อมต่อกับเซิร์ฟเวอร์เมล SMTP ให้ความสนใจกับชื่อโฮสต์ของเซิร์ฟเวอร์ SMTP
2. เมื่อใช้คำสั่ง data หากมีการเขียนหัวเรื่องจะต้องมีบรรทัดที่ว่างเปล่าระหว่างเนื้อหาของอีเมลและหัวเรื่องนั่นคือ "Enter + Line Break" ซึ่งคือ /r /n ในรหัส;
3. จำเป็นต้องใช้พื้นฐาน 64 การเข้ารหัสชื่อผู้ใช้อีเมลและรหัสผ่านของผู้ส่งก่อนที่จะส่งไปยังเซิร์ฟเวอร์ SMTP
4. โปรแกรมยังคงมีคำเตือนเมื่อรวบรวม นี่เป็นเพราะคลาส Sun.misc.base64encoder มีอยู่ในแพ็คเกจ RT.JAR เนื่องจาก JDK จะได้รับการอัปเดตและอัพเกรดบางคลาสในแพ็คเกจอาจเปลี่ยนแปลงและไม่พร้อมใช้งานดังนั้นคอมไพเลอร์จะออกคำเตือน
นอกจากนี้หลังจากเขียนรหัสเหล่านี้ พบปัญหาบางอย่าง :
1. เซิร์ฟเวอร์เมลของ smtp.qq.com และ smtp.sina.com ไม่ทราบว่าทำไมพวกเขาถึงไม่สามารถใช้งานได้ กล่าวคือเมื่อที่อยู่อีเมลของผู้ส่งคือ QQ หรือ SINA โปรแกรมนี้จะไม่มีประโยชน์อีกต่อไปและไม่สามารถเข้าใจรหัสการตอบกลับสถานะได้ ในการทดสอบของฉันสามารถใช้ SMTP.163.com ได้เท่านั้น เห็นได้ชัดว่าเซิร์ฟเวอร์ SMTP เหล่านี้พบได้ในเว็บไซต์อย่างเป็นทางการดังนั้นทำไมพวกเขาถึงไม่สามารถใช้งานได้? มันแปลกมาก ใครก็ตามที่รู้หวังว่าจะบอกฉันขอบคุณ!
2. ในเมธอด sendemail () ในคลาส SimpleMailsender ด้านล่างรหัสซ้ำบางอย่างทำให้สับสน แต่ไม่มีทางฉันยังไม่เข้าใจ ...
3. การค้นพบที่สำคัญ: ฉันประหลาดใจที่อีเมล QQ ได้รับอีเมลด้วยความเร็วที่อาจเร็วกว่าอีเมล 163 ฉบับและอีเมล SINA นอกจากนี้เมื่อใช้คำสั่ง NSLOOKUP เพื่อสอบถามชื่อโฮสต์ของ smtp.qq.com พบว่ามีเซิร์ฟเวอร์ SMTP จำนวนมากอย่างน้อย 5 มากกว่า 163 3. Tencent มีประสิทธิภาพจริงๆ
4. แม้ว่าฉันจะสามารถส่งอีเมลไปยังที่อยู่อีเมลได้อย่างร้ายกาจหลังจากเขียนโปรแกรมนี้ฉันพบว่าเมื่อฉันส่งอีเมลหลายสิบฉบับไปยังที่อยู่อีเมลที่คงที่อื่น ๆ อย่างต่อเนื่องกับที่อยู่อีเมล SINA ที่อยู่อีเมล SINA จะถูกปฏิเสธหากฉันต้องการส่งอีเมล ระวัง.
รหัสมีดังนี้:
// คลาสอีเมล e_mail {String from; สตริงไป; เรื่องสตริง; เนื้อหาสตริง; ชื่อผู้ใช้สตริง; สตริง PWD; e_mail สาธารณะ (สตริงจาก, สตริงไป, หัวข้อสตริง, เนื้อหาสตริง, ชื่อผู้ใช้สตริง, สตริง pwd) {this.from = จาก; this.to = ถึง; this.subject = เรื่อง; this.content = เนื้อหา; this.username = this.tobase64 (ชื่อผู้ใช้); this.pwd = this.tobase64 (PWD); } / *** ชื่อผู้ใช้และรหัสผ่าน transcode ในคลาส e_mail* / สตริงส่วนตัว tobase64 (สตริง str) {return (sun.misc.base64encoder (). encode (str.getBytes ())); }} // คลาส Simple Mail Sender เพื่อใช้งานฟังก์ชั่นการส่งคลาสสาธารณะ SimpleMailsender {สตริงส่วนตัว smtpserver; พอร์ต int ส่วนตัว = 25; ซ็อกเก็ตซ็อกเก็ตส่วนตัว bufferedreader br; Printwriter PW; / *** กำหนดเซิร์ฟเวอร์เมล SMTP ตามที่อยู่อีเมลของผู้ส่ง*/ โมฆะส่วนตัว initserver (สตริงจาก) {ถ้า (from.contains ("@163")) {this.smtpserver = "smtp.163.com"; } else if (from.contains ("@126")) {this.smtpserver = "smtp.126.com"; } อื่นถ้า (from.contains ("@sina")) {this.smtpserver = "smtp.sina.com"; } else if (from.contains ("@qq")) {this.smtpserver = "smtp.qq.com"; }} โมฆะสาธารณะ sendemail (e_mail อีเมล) {ลอง {this.initserver (email.from); this.socket = ซ็อกเก็ตใหม่ (smtpserver, พอร์ต); this.br = this.getReader (ซ็อกเก็ต); this.pw = this.getWriter (ซ็อกเก็ต); // เริ่มประกอบลำดับคำสั่งสำหรับการส่งอีเมล send_receive (null); // รับข้อความว่าการเชื่อมต่อกับเซิร์ฟเวอร์ SMTP ประสบความสำเร็จ send_receive ("ehlo hao"); send_receive ("Auth Login"); send_receive (email.username); send_receive (email.pwd); send_receive ("จดหมายจาก: <" + email.from + ">"); send_receive ("rcpt ถึง: <" + email.to + ">"); send_receive ("ข้อมูล"); // อีเมลเนื้อหา pw.println ("จาก:" + email.from); pw.println ("ถึง:" + email.to); // อย่าลืมล้างบรรทัดระหว่างหัวเรื่องและข้อความนั่นคือเพิ่ม "/r/n" pw.println ("หัวเรื่อง:" + email.subject + "/r/n"); // พิมพ์เนื้อหาอีเมลบนคอนโซล System.out.println ("จาก:" + email.from); System.out.println ("ถึง:" + email.to); System.out.println ("หัวเรื่อง:" + email.subject + "/r/n"); System.out.println (email.content); // email body pw.println (email.content); // อย่าลืมจบข้อความด้วย "." send_receive ("."); send_receive ("เลิก"); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ลอง {ถ้า (ซ็อกเก็ต! = null) socket.close (); } catch (ioexception e) {e.printstacktrace (); }}}/** * ทุกครั้งที่มีการส่งคำสั่ง "/r/n" จะต้องเพิ่มหลังจากคำสั่ง, * รหัสสถานะที่สอดคล้องกันของเซิร์ฟเวอร์เมล SMTP จะถูกพิมพ์ออกมาในเวลาเดียวกัน * @param คำสั่ง */โมฆะส่วนตัว send_receive pw.print (คำสั่ง + "/r/n"); pw.flush (); System.out.println ("ผู้ใช้ >>" + คำสั่ง); } char [] response = char ใหม่ [1024]; br.read (การตอบสนอง); System.out.println (การตอบสนอง); } / *** รับกระแสเอาต์พุตของซ็อกเก็ต* / Private PrintWriter GetWriter (ซ็อกเก็ตซ็อกเก็ต) พ่น IOException {Socketout OutputStream = Socket.GetOutputStream (); ส่งคืน PrintWriter ใหม่ (ซ็อกเก็ตเอาท์จริง); } / *** รับกระแสอินพุตของซ็อกเก็ต* / ส่วนตัว bufferedreader getReader (ซ็อกเก็ตซ็อกเก็ต) พ่น IOException {socketin อินพุต = socket.getInputStream (); ส่งคืน bufferedReader ใหม่ (InputStreamReader ใหม่ (socketin)); } // ทดสอบโมฆะสาธารณะคงที่หลัก (String [] args) {New Mailsendergui (); }} // Mail Sender Program Interface Class Mailsendergui ขยาย JFrame ดำเนินการ actionListener {ส่วนตัว JLabel usernamelabel; ผู้ใช้ Jtextfield ส่วนตัว; Jlabel ส่วนตัว Pwdlabel; ส่วนตัว JPasswordfield Pwdfield; Jlabel ส่วนตัวจาก Label; ส่วนตัว jtextfield จากฟิลด์; Jlabel Tolabel ส่วนตัว; Jtextfield ส่วนตัว Tofield; Private Jlabel SubjectLabel; Jlabel Private ContentLabel; Private Jtextarea ContentArea; JBUTTON ส่วนตัว SendBTN; JButton ส่วนตัว Cancelbtn; อีเมล e_mail ส่วนตัว; Mailsender ส่วนตัวส่วนตัว; mailsendergui () {this.init (); this.mailsender = new SimpleMailSender (); } private void init () {this.fromlabel = new JLabel ("ที่อยู่อีเมลผู้ส่ง:"); this.fromfield = new Jtextfield (25); this.usernamelabel = new Jlabel ("ชื่อผู้ใช้:"); this.usernamefield = new Jtextfield (25); this.pwdlabel = new JLabel ("รหัสผ่าน:"); this.pwdfield = new jpasswordfield (25); this.tolabel = new jlabel ("ที่อยู่อีเมลผู้รับ:"); this.tofield = new Jtextfield (25); this.subjectLabel = new JLabel ("หัวเรื่องอีเมล:"); this.subjectfield = new Jtextfield (20); this.contentLabel = new JLabel ("อีเมล:"); this.contentarea = new Jtextarea (15, 20); this.settitle ("Ant-> Simple Mail ผู้ส่ง"); this.setbounds (200, 30, 500, 500); this.setLayout (New BorderLayout ()); this.setDefaultCloseOperation (jframe.exit_on_close); this.setVisible (จริง); this.sendbtn = new JButton ("ส่ง"); this.cancelbtn = new JButton ("รีเซ็ต"); this.sendbtn.addactionListener (นี่); this.cancelbtn.addactionListener (นี่); JPanel uppanel = new JPanel (ใหม่ gridlayout (6, 2, 5, 5)); UPPANEL.ADD (จาก LABEL); uppanel.add (จากฟีลด์); UPPANEL.ADD (USERNAMELABEL); uppanel.add (pwdlabel); UPPANEL.ADD (PWDFIELD); uppanel.add (Tolabel); uppanel.add (tofield); uppanel.add (tofield); uppanel.add (หัวเรื่อง); uppanel.add (หัวเรื่อง); uppanel.add (ContentLabel); this.add (uppanel, borderlayout.north); this.add (ContentArea, BorderLayout.Center); JPanel downpanel = new JPanel (Flowlayout ใหม่ (flowlayout.center)); downpanel.add (sendbtn, borderlayout.south); downpanel.add (cancelbtn, borderlayout.south); this.add (downpanel, borderlayout.south); } @Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {ถ้า (e.getSource () == this.sendbtn) {this.email = new e_mail (this.fromfield.getText (), tofield.getText () this.subject. สตริง (this.pwdfield.getPassword ())); this.mailsender.sendemail (this.email); } อื่นถ้า (e.getSource () == this.cancelbtn) {this.fromfield.settext (null); this.tofield.settext (null); this.subjectfield.settext (null); this.contentarea.settext (null); -ข้างต้นเป็นรหัสทั้งหมดสำหรับการเขียนโปรแกรมส่งอีเมลอย่างง่าย ๆ ใน Java โดยหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคน