JavaRush /จาวาบล็อก /Random-TH /วิธีส่งอีเมลจากแอปพลิเคชัน Java (พร้อมตัวอย่าง)
PodoBulge
ระดับ
Минск

วิธีส่งอีเมลจากแอปพลิเคชัน Java (พร้อมตัวอย่าง)

เผยแพร่ในกลุ่ม
การส่งอีเมลจากแอปพลิเคชัน Java เป็นข้อกำหนดทั่วไป ไม่สำคัญว่าคุณกำลังทำงานกับแอปพลิเคชัน Java หลัก เว็บแอปพลิเคชัน หรือแอปพลิเคชัน Java ระดับองค์กร คุณอาจต้องส่งอีเมลเพื่อแจ้งเตือนเจ้าหน้าที่ฝ่ายสนับสนุนเกี่ยวกับข้อผิดพลาด หรือเพียงส่งอีเมลถึงผู้ใช้เมื่อลงทะเบียน รีเซ็ตรหัสผ่านหรือขอให้ยืนยันที่อยู่อีเมลหลังการลงทะเบียน มีหลายสถานการณ์เมื่อคุณต้องการความสามารถในการส่งอีเมลจากแอปพลิเคชัน Java วิธีส่งอีเมลจากแอปพลิเคชัน Java (พร้อมตัวอย่าง) - 1ในแอปพลิเคชันสำเร็จรูป คุณมีโมดูลหรือไลบรารีที่ทำงานร่วมกับคุณสมบัติทั้งหมดในการส่งอีเมลอยู่แล้ว เช่น ความสามารถในการส่งไฟล์แนบ รูปภาพ รวมถึงลายเซ็นและ Rich Text ในอีเมล แต่ถ้าคุณต้องการเขียนบางสิ่งตั้งแต่เริ่มต้นJava Mail APIเป็นตัวเลือกที่ยอดเยี่ยม ในบทความนี้ เราจะเรียนรู้วิธีส่งอีเมลจากแอปพลิเคชัน Java โดยใช้ mail API ( javax.mail ) ก่อนที่จะเขียนโค้ด คุณควรทราบพื้นฐานบางประการเกี่ยวกับวิธีการทำงาน ของอีเมล เช่น คุณต้องมีเซิร์ฟเวอร์SMTP (Simple Mail Transfer Protocol) หากคุณใช้งานแอปพลิเคชัน Java บน Linux คุณควรทราบว่าSMTP daemonใช้พอร์ต 25 คุณสามารถใช้เมลเซิร์ฟเวอร์ใดก็ได้เพื่อส่งข้อความโดยใช้ Java รวมถึงเซิร์ฟเวอร์เมลสาธารณะ เช่น GMail, Yahoo หรือผู้ให้บริการอื่น ๆ ทั้งหมด คุณต้องมี รายละเอียด เซิร์ฟเวอร์ SMTPเช่นชื่อโฮสต์ พอร์ต พารามิเตอร์การเชื่อมต่อ ฯลฯ คุณยังสามารถใช้SSL ( Secure Sockets Layer ), TLS ( Transport Layer Security ) เพื่อเชื่อมต่อและส่งอีเมลอย่างปลอดภัย แต่เราทำให้ตัวอย่างนี้เรียบง่ายและเน้นไปที่ตรรกะขั้นต่ำสำหรับการส่งจดหมายจากแอปพลิเคชัน Java ในบทความต่อๆ ไป เราจะได้เรียนรู้วิธีส่งอีเมลโดยใช้ไฟล์แนบ, วิธีส่งอีเมลในรูปแบบ HTML, วิธีแนบรูปภาพไปกับอีเมล, วิธีใช้การตรวจสอบสิทธิ์ SSL เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ GMail และส่งอีเมล ฯลฯ ตอนนี้ มาทำความเข้าใจ (อภิปราย) ตัวอย่าง Java Mail API ง่ายๆ นี้ กัน ดีกว่า

ตัวอย่างโค้ด Java สำหรับการส่งอีเมล

หากต้องการส่งจดหมายจากโปรแกรม Java คุณจะต้องมีJava Mail APIและJava Activation Framework (JAF ) เพื่อให้แม่นยำยิ่งขึ้น คุณจะต้องมีmail-1.4.5.jar , smtp-1.4.4.jarและactivation- 1.1.jar คุณต้องดาวน์โหลดไฟล์ JAR เหล่านี้และรวมไว้ในClasspath ของคุณ เพื่อรันโปรแกรมนี้ หรือคุณสามารถใช้ Maven สำหรับการจัดการการขึ้นต่อกันและรวมการขึ้นต่อกันทั้งหมดไว้ที่นั่น เมื่อคุณมีไฟล์ JAR ทั้งหมดนี้แล้ว เพียงทำตามขั้นตอนด้านล่างเพื่อสร้างและส่งอีเมลโดยใช้ Java
  1. สร้างอ็อบเจ็กต์SessionโดยการเรียกSession.getDefaultInstance(properties)โดยที่properties- มีคุณสมบัติที่สำคัญทั้งหมด เช่น ชื่อโฮสต์ของเซิร์ฟเวอร์ SMTP

  2. สร้างวัตถุMimeMessageโดยส่งผ่านวัตถุSessionที่ได้รับในขั้นตอนก่อนหน้า เรามีชุดคุณสมบัติที่แตกต่างกันในออบเจ็กต์นี้ เช่น ผู้รับอีเมล หัวเรื่อง เนื้อหาข้อความ ไฟล์แนบ ฯลฯ

  3. ใช้javax.mail.Transportเพื่อส่งอีเมลโดยการเรียกวิธีคงที่send(email)โดยที่อีเมลสามารถเป็นวัตถุMimeMessageได้

จำนวนคุณสมบัติที่คุณส่งเพื่อสร้างออบเจ็กต์Sessionจะแตกต่างกันไปขึ้นอยู่กับประเภทของเซิร์ฟเวอร์ SMTP ตัวอย่างเช่น หากคุณใช้เซิร์ฟเวอร์ SMTP ที่ไม่ต้องมีการรับรองความถูกต้องใดๆ คุณสามารถสร้างออบเจ็กต์Sessionที่มีคุณสมบัติเพียงรายการเดียวเท่านั้น เช่น smtp mail.host และคุณไม่จำเป็นต้องระบุพอร์ตเนื่องจากมีพอร์ต 25 เป็นค่าเริ่มต้น ในทางกลับกัน หากคุณกำลังเชื่อมต่อกับเซิร์ฟเวอร์ SMTP ที่ต้องใช้การตรวจสอบสิทธิ์ TLS หรือ SSL เช่น โฮสต์ SMTP ของ GMail คุณจะต้องระบุคุณสมบัติเพิ่มเติมอีกเล็กน้อย เช่น mail.smtp.port=547 สำหรับ TLS และเมล smtp.port= 457 สำหรับ SSL นี่เป็นโปรแกรม Java ที่สมบูรณ์ซึ่งเชื่อมต่อกับเซิร์ฟเวอร์ SMTP มาตรฐานโดยไม่มีการตรวจสอบสิทธิ์และส่งข้อความโดยใช้ Java Mail API
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
* Java Program to send text mail using default SMTP server and without authentication.
* You need mail.jar, smtp.jar and activation.jar to run this program.
*
* @author Javin Paul
*/

public class EmailSender{
     public static void main(String args[]){

           String to = "receive@abc.om";         // sender email
           String from = "sender@abc.com";       // receiver email
           String host = "127.0.0.1";            // mail server host

           Properties properties = System.getProperties();
           properties.setProperty("mail.smtp.host", host);

           Session session = Session.getDefaultInstance(properties); // default session

           try {
                MimeMessage message = new MimeMessage(session); // email message

                message.setFrom(new InternetAddress(from)); // setting header fields

                message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

                message.setSubject("Test Mail from Java Program"); // subject line

                // actual mail body
                message.setText("You can send mail from Java program by using mail API, but you need" +
                                "couple of more JAR files e.g. smtp.jar and activation.jar");

                // Send message
                Transport.send(message); System.out.println("Email Sent successfully....");
               } catch (MessagingException mex){ mex.printStackTrace(); }

     }

}
เอาท์พุต: คุณสามารถคอมไพล์และรันโปรแกรมนี้เพื่อส่งอีเมลง่ายๆ จากโปรแกรม Java:
$ javac EmailSender.java
$ java EmailSender
ส่งอีเมลสำเร็จ.... อย่างที่คุณเห็น การส่งอีเมลจากโปรแกรม Java เป็นเรื่องง่ายมาก เมื่อคุณสร้างออบเจ็กต์MimeMessageแล้ว คุณจะต้องเพิ่มผู้รับซึ่งสามารถระบุได้ในTO, CC, BCC. เมื่อเสร็จสิ้นกับผู้รับแล้ว เราจำเป็นต้องระบุหัวเรื่องของจดหมาย และสุดท้าย เนื้อหาของจดหมายด้วยการเรียกเมธอดmessage.setText(); หากคุณต้องการส่งจดหมายหลายฉบับ คุณสามารถใช้วิธีการต่อไปนี้เพื่อระบุผู้รับ:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
คุณสามารถเพิ่มบุคคลลงในฟิลด์TOโดยใช้Message.RecipientType.TO, ลงในฟิลด์CCโดยใช้Message.RecipientType.CCและถึง BCC-Message.RecipientType.BCC

ข้อผิดพลาดและข้อยกเว้น

เมื่อโปรแกรมเมอร์ Java จำนวนมากเริ่มเขียนโปรแกรมเพื่อส่งอีเมลเป็นครั้งแรก พวกเขาพบข้อผิดพลาดเนื่องจากส่วนใหญ่คิดว่า mail.jar และ activation.jar จะเพียงพอที่จะส่งอีเมลจากแอปพลิเคชัน Java ซึ่งไม่เป็นเช่นนั้น โดยเฉพาะอย่างยิ่งหากคุณส่งอีเมลผ่านเซิร์ฟเวอร์ SMTP ในเครื่องใน Linux หากคุณรันโปรแกรมนี้โดยใช้เพียง mail.jar และ activation.jar ใน CLASSPATH ของคุณ คุณมักจะได้รับข้อผิดพลาดนี้

ข้อยกเว้น 1:

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 25; timeout -1;
        nested exception is:
            java.net.ConnectException: Connection refused: connect
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1984)
            at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:656)
            at javax.mail.Service.connect(Service.java:345)
            at javax.mail.Service.connect(Service.java:226)
            at javax.mail.Service.connect(Service.java:175)
            at javax.mail.Transport.send0(Transport.java:253)
            at javax.mail.Transport.send(Transport.java:124)
            at Testing.main(Testing.java:62)
        Caused by: java.net.ConnectException: Connection refused: connect
            at java.net.DualStackPlainSocketImpl.connect0(Native Method)
            at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
            at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
            at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
            at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
            at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
            at java.net.Socket.connect(Socket.java:579) at java.net.Socket.connect(Socket.java:528)
            at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:301)
            at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:229)
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1950)
       ... 7 more
แม้ว่าวิธีแก้ปัญหาข้อผิดพลาดนี้จะง่ายมาก แต่ก็อาจทำให้คุณสับสนได้ java.net.ConnectException: Connection refused: connectโดยปกติจะล่มเมื่อเซิร์ฟเวอร์ไม่ทำงานหรือระบุพอร์ตที่คุณกำลังเชื่อมต่อไม่ถูกต้อง วิธีแก้ไข:นอกจาก mail-1.4.5.jar แล้ว คุณยังต้องมี smtp-1.4.4.jar และ activation-1.1.jar ด้วย

ข้อยกเว้น 2:

นี่เป็นข้อผิดพลาดอีกประการหนึ่งที่เรียกว่าNoClassDefFoundErrorซึ่งโดยปกติจะอ้างถึงไฟล์ JAR ที่หายไปใน Classpath
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/MessagingException
           at java.lang.Class.getDeclaredMethods0(Native Method)
           at java.lang.Class.privateGetDeclaredMethods(Class.java:2521)
           at java.lang.Class.getMethod0(Class.java:2764)
           at java.lang.Class.getMethod(Class.java:1653)
           at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
           at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: javax.mail.MessagingException
           at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
           at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
           at java.security.AccessController.doPrivileged(Native Method)
           at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
           at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
วิธีแก้ไข:ฉันจัดการเพื่อแก้ไขปัญหาของฉันได้ เนื่องจาก Classpath ไม่ถูกต้อง แม้ว่าฉันจะมี JAR ที่จำเป็นทั้งสามไฟล์ ซึ่งเป็นไฟล์คลาส Java สำหรับโปรแกรมในไดเร็กทอรีเดียวกัน และรันโปรแกรมจากที่นั่น แต่ Java ก็ไม่เข้าใจ ฉันพยายามป้อนคำสั่งต่อไปนี้และโปรแกรมทำงานได้ดี:
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
ส่งอีเมลเรียบร้อยแล้ว.... โปรดทราบว่าไดเร็กทอรีปัจจุบันจะถูกทำเครื่องหมายด้วยจุดที่ท้ายอาร์กิวเมนต์ Classpath เนื่องจากฉันใช้งานโปรแกรมบน Linux ฉันจึงใช้โคลอน (:) แทนอัฒภาค (;) (เช่นเดียวกับใน Windows) นั่นคือทั้งหมดที่เกี่ยวกับวิธีการส่งอีเมลจากแอปพลิเคชัน Java โดยใช้ Mail API คุณอาจพบว่าสิ่งนี้ง่ายมาก เนื่องจากคุณไม่จำเป็นต้องมีไฟล์ JAR มากกว่าสามไฟล์ จะง่ายกว่ามากหากคุณใช้ Gradle หรือ Maven เพื่อจัดการการพึ่งพา ในบทช่วยสอนต่อไปนี้ เราจะดูตัวอย่างที่ซับซ้อนยิ่งขึ้นของ Java Mail API สำหรับการส่งอีเมลพร้อมไฟล์แนบ พร้อมรูปภาพ และอีเมลที่มีรูปแบบสวยงามสำหรับการส่งรายงานและตาราง การแปลบทความ: วิธีส่งอีเมลจากโปรแกรม Java พร้อมตัวอย่าง
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION