JavaRush /Blog Java /Random-VI /Cách gửi email từ ứng dụng Java (có ví dụ)
PodoBulge
Mức độ
Минск

Cách gửi email từ ứng dụng Java (có ví dụ)

Xuất bản trong nhóm
Gửi email từ ứng dụng Java là một yêu cầu phổ biến. Cho dù bạn đang làm việc trên ứng dụng Java cốt lõi, ứng dụng web hay ứng dụng Java dành cho doanh nghiệp, bạn có thể cần gửi email để thông báo cho nhân viên hỗ trợ về lỗi hoặc chỉ cần gửi email cho người dùng khi đăng ký, đặt lại mật khẩu của họ hoặc yêu cầu họ xác nhận địa chỉ email sau khi đăng ký. Có nhiều tình huống khi bạn cần khả năng gửi email từ ứng dụng Java. Cách gửi email từ ứng dụng Java (có ví dụ) - 1Trong các ứng dụng tạo sẵn, bạn đã có một mô-đun hoặc thư viện hoạt động với tất cả các tính năng gửi email, chẳng hạn như khả năng gửi tệp đính kèm, hình ảnh, bao gồm chữ ký và văn bản đa dạng thức trong email, NHƯNG nếu bạn cần viết thứ gì đó từ đầu, thì API Java Mail là một lựa chọn tuyệt vời. Trong bài viết này, chúng ta sẽ tìm hiểu cách gửi email từ ứng dụng Java bằng API thư ( javax.mail ). Trước khi viết mã, bạn nên biết một số điều cơ bản về cách hoạt động của email, ví dụ: bạn cần một máy chủ SMTP (Giao thức truyền thư đơn giản) . Nếu bạn đang chạy ứng dụng Java trên Linux thì bạn nên biết rằng daemon SMTP sử dụng cổng 25. Bạn có thể sử dụng bất kỳ máy chủ thư nào để gửi thư bằng Java, bao gồm các máy chủ thư công cộng như GMail, Yahoo hoặc bất kỳ nhà cung cấp dịch vụ nào khác, tất cả bạn cần là thông tin chi tiết về máy chủ SMTP của họ , chẳng hạn như tên máy chủ, cổng, thông số kết nối, v.v. Bạn cũng có thể sử dụng SSL ( lớp ổ cắm bảo mật ), TLS ( Bảo mật lớp vận chuyển ) để kết nối và gửi email một cách an toàn, nhưng chúng tôi đã làm cho ví dụ này trở nên đơn giản và tập trung vào logic tối thiểu để gửi thư từ một ứng dụng Java. Trong các bài viết sau, chúng ta sẽ tìm hiểu cách gửi email bằng tệp đính kèm, cách gửi email có định dạng HTML, cách đính kèm hình ảnh vào email, cách sử dụng xác thực SSL để kết nối với máy chủ Gmail và gửi email, v.v. Bây giờ, hãy hiểu (thảo luận) ví dụ API Java Mail đơn giản này .

Mã Java mẫu để gửi email

Để gửi thư từ chương trình Java, bạn sẽ cần API Java MailKhung kích hoạt Java (JAF) ; nói chính xác hơn, bạn sẽ cần mail-1.4.5.jar , smtp-1.4.4.jaractivate-1.1.jar . Bạn cần tải xuống các tệp JAR này và đưa chúng vào Classpath để chạy chương trình này. Ngoài ra, bạn có thể sử dụng Maven để quản lý phần phụ thuộc và bao gồm tất cả các phần phụ thuộc vào đó. Khi bạn có tất cả các tệp JAR này, chỉ cần làm theo các bước bên dưới để tạo và gửi email bằng Java.
  1. Tạo một đối tượng Sessionbằng cách gọi Session.getDefaultInstance(properties), trong đó properties- chứa tất cả các thuộc tính quan trọng, ví dụ: tên máy chủ của máy chủ SMTP.

  2. Tạo một đối tượng MimeMessagebằng cách truyền cho nó đối tượng Sessionthu được ở bước trước. Chúng tôi có một tập hợp các thuộc tính khác nhau trong đối tượng này như người nhận email, chủ đề, nội dung thư, tệp đính kèm, v.v.

  3. Sử dụng nó javax.mail.Transportđể gửi email bằng cách gọi một phương thức tĩnh send(email), trong đó email có thể là một đối tượng MimeMessage.

Số lượng thuộc tính bạn chuyển để tạo một đối tượng Sessionkhác nhau tùy thuộc vào loại máy chủ SMTP, ví dụ: nếu bạn đang sử dụng máy chủ SMTP không yêu cầu bất kỳ xác thực nào, bạn có thể tạo một đối tượng Sessionchỉ có một thuộc tính, ví dụ: smtp. mail.host và bạn không cần chỉ định cổng vì nó có cổng 25 theo mặc định. Mặt khác, nếu bạn đang kết nối với máy chủ SMTP yêu cầu xác thực TLS hoặc SSL, chẳng hạn như Máy chủ SMTP của Gmail, thì bạn cần cung cấp thêm một chút thuộc tính, ví dụ: mail.smtp.port=547 cho TLS và thư. smtp.port= 457 cho SSL. Đây là một chương trình Java hoàn chỉnh kết nối với máy chủ SMTP tiêu chuẩn mà không cần xác thực và gửi tin nhắn văn bản bằng API Java Mail.
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(); }

     }

}
Kết quả: Bạn có thể biên dịch và chạy chương trình này để gửi một email đơn giản từ chương trình Java:
$ javac EmailSender.java
$ java EmailSender
Đã gửi email thành công.... Như bạn có thể thấy, việc gửi email từ một chương trình Java rất dễ dàng. Khi bạn đã tạo đối tượng MimeMessage, bạn cần thêm người nhận, có thể được chỉ định trong TO, CC, BCC. Sau khi hoàn tất việc xác định người nhận, chúng ta cần chỉ định chủ đề của bức thư và cuối cùng là nội dung của bức thư bằng cách gọi phương thức message.setText(); Nếu bạn muốn gửi nhiều thư thì có thể sử dụng các phương pháp sau để chỉ định người nhận:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
Bạn có thể thêm người vào trường TObằng cách sử dụng Message.RecipientType.TO, vào trường CCbằng cách sử dụng Message.RecipientType.CCvà vào BCC- Message.RecipientType.BCC.

Lỗi và ngoại lệ

Khi nhiều lập trình viên Java lần đầu tiên bắt đầu viết chương trình để gửi email, họ gặp phải lỗi vì hầu hết họ nghĩ rằng mail.jar và activate.jar sẽ đủ để gửi email từ một ứng dụng Java, nhưng thực tế không phải vậy, đặc biệt nếu bạn gửi email qua máy chủ SMTP cục bộ trong Linux. Nếu bạn chạy chương trình này chỉ với mail.jar và activate.jar trong CLASSPATH, rất có thể bạn sẽ gặp lỗi này.

Ngoại lệ 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
Mặc dù cách giải quyết lỗi này rất đơn giản nhưng nó có thể khiến bạn bối rối. java.net.ConnectException: Connection refused: connectNó thường gặp sự cố khi máy chủ không hoạt động hoặc cổng bạn đang kết nối được chỉ định không chính xác. Giải pháp: ngoài mail-1.4.5.jar, bạn còn cần smtp-1.4.4.jar và activate-1.1.jar.

Ngoại lệ 2:

Đây là một lỗi khác có tên là NoClassDefFoundError, lỗi này thường đề cập đến tệp JAR bị thiếu trong 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)
Giải pháp: Tôi đã giải quyết được vấn đề của mình, đó là do Classpath không chính xác. Mặc dù tôi đã có cả ba JAR cần thiết, một tệp lớp Java cho chương trình trong cùng một thư mục và chạy chương trình từ đó, Java vẫn không thể tìm ra. Tôi đã thử nhập các lệnh sau và chương trình hoạt động tốt:
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
Đã gửi email thành công.... Xin lưu ý rằng thư mục hiện tại được đánh dấu bằng dấu chấm ở cuối đối số Classpath. Vì tôi đang chạy chương trình trên Linux nên tôi đã sử dụng dấu hai chấm (:) thay vì dấu chấm phẩy (;) (như trong Windows). Đó là tất cả về cách gửi email từ ứng dụng Java bằng API thư. Bạn có thể thấy điều này rất đơn giản vì bạn không cần nhiều hơn ba tệp JAR. Sẽ dễ dàng hơn nhiều nếu bạn sử dụng Gradle hoặc Maven để quản lý các phần phụ thuộc. Trong các hướng dẫn sau, chúng ta sẽ thấy các ví dụ phức tạp hơn về API Java Mail để gửi email có tệp đính kèm, có hình ảnh và các email được định dạng đẹp mắt để gửi báo cáo và bảng. Bản dịch bài viết: Cách gửi Email từ chương trình Java bằng ví dụ
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION