Gửi Email trong Java thông qua Gmail + SMTP

Có lẽ việc gửi Email trong các ứng dụng hiện nay đã trở nên rất phổ biến nhưng chỉ trong các ứng dụng Java. Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu cách gửi Mail trong ứng dụng Java sử dụng thư viện JavaMail API và SMTP server của Gmail.

Dependency

JavaMail API không phải là một thành phần cơ bản trong JDK, vì vậy chúng ta cần download chúng từ website JavaMail và import nó vào project để sử dụng.

Hoặc nếu bạn đang sử dụng project maven thì có thể thêm dependency sau:

<dependency>
	<groupId>com.sun.mail</groupId>
	<artifactId>javax.mail</artifactId>
	<version>1.5.5</version>
</dependency>

Gửi Mail sử dụng JavaMail API

Để gửi một Email trong Java chúng ta cần thực hiện 3 bước sau:

  • Khởi tạo javax.mail.Session object.
  • Khởi tạo javax.mail.internet.MimeMessage object, trong đó các thuộc tính cần thiết như: email người nhận, tiêu đề, tin nhắn và các tập tin đính kèm.
  • Sử dụng avax.mail.Transport để gửi Email.

Trong một ứng dụng gửi mail sử dụng Gmail của google chúng ta cần phải chuẩn bị các thông tin sau:

  • Địa chỉ Email –  đây là địa chỉ gmail mà bạn sở hữu dùng trong ứng dụng.
  • Mật khẩu – mật khẩu tài khoản gmail của bạn.
  • Địa chỉ gmail của người nhận.
  • Tiêu đề, tin nhắn, tập tin đính kèm.

Một lưu ý là khi sử dụng Gmail các bạn phải bật tính năng “Quyền tuy cập của ứng dụng kém an toàn” trong phần cài đặt bảo mật của Gmail: https://myaccount.google.com/security.

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

public class Main {

    public static void main(String[] args) throws MessagingException, UnsupportedEncodingException {

        final String fromEmail = "[email protected]";
        // Mat khai email cua ban
        final String password = "Test123#";
        // dia chi email nguoi nhan
        final String toEmail = "[email protected]";

        final String subject = "Java Example Test";
        final String body = "Hello Admin";

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
        props.put("mail.smtp.port", "587"); //TLS Port
        props.put("mail.smtp.auth", "true"); //enable authentication
        props.put("mail.smtp.starttls.enable", "true"); //enable STARTTLS

        Authenticator auth = new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(fromEmail, password);
            }
        };
        Session session = Session.getInstance(props, auth);


        MimeMessage msg = new MimeMessage(session);
        //set message headers
        msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
        msg.addHeader("format", "flowed");
        msg.addHeader("Content-Transfer-Encoding", "8bit");

        msg.setFrom(new InternetAddress(fromEmail, "NoReply-JD"));

        msg.setReplyTo(InternetAddress.parse(fromEmail, false));

        msg.setSubject(subject, "UTF-8");

        msg.setText(body, "UTF-8");

        msg.setSentDate(new Date());

        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
        Transport.send(msg);
        System.out.println("Gui mail thanh cong");
    }
}

Đến đây chạy chương trình, mình đã nhận được một email gửi từ ứng dụng demo trên

Gửi mail với tập tin đính kèm

Để đính kèm các tập tin như file txt, file hình ảnh v.v chúng ta cần sử dụng đến MimeBodyPart để chứa các dữ liệu dạng văn bản, tập tin bên trong. Multipart dùng để đóng gói tất cả các MimeBodyPart đã chuẩn bị từ trước đó.

Trong ví dụ này sẽ gửi một email bao gồm một tin nhắn, một file test.txt và một tệp hình ảnh.

 

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

public class Main {

    public static void main(String[] args) throws MessagingException {


        final String fromEmail = "[email protected]";
        // Mat khai email cua ban
        final String password = "Test123#";
        // dia chi email nguoi nhan
        final String toEmail = "[email protected]";

        final String subject = "Java Example Test";
        final String body = "Hello Admin";

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
        props.put("mail.smtp.port", "587"); //TLS Port
        props.put("mail.smtp.auth", "true"); //enable authentication
        props.put("mail.smtp.starttls.enable", "true"); //enable STARTTLS

        Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(fromEmail, password);
            }
        });

        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(fromEmail));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
        message.setSubject(subject);

        // Phan 1 gom doan tin nhan
        BodyPart messageBodyPart1 = new MimeBodyPart();
        messageBodyPart1.setText(body);

        // phan 2 chua tap tin txt
        MimeBodyPart messageBodyPart2 = new MimeBodyPart();
        // Duong dan den file cua ban
        String filePath = "test.txt";
        DataSource source1 = new FileDataSource(filePath);
        messageBodyPart2.setDataHandler(new DataHandler(source1));
        messageBodyPart2.setFileName(filePath);

        // phan 3 chua tap tin image
        MimeBodyPart messageBodyPart3 = new MimeBodyPart();
        // Duong dan den file cua ban
        String imagePath = "Capture.JPG";
        DataSource source2 = new FileDataSource(imagePath);
        messageBodyPart3.setDataHandler(new DataHandler(source2));
        messageBodyPart3.setFileName(imagePath);

        Multipart multipart = new MimeMultipart();
        multipart.addBodyPart(messageBodyPart1);
        multipart.addBodyPart(messageBodyPart2);
        multipart.addBodyPart(messageBodyPart3);
        message.setContent(multipart);

        Transport.send(message);

        System.out.println("Gui mail thanh cong");

    }
}

Kết quả mình nhận một email có nội dung như sau

Gửi mail dạng HTML

Gửi mail dạng HTML khá đơn giản bạn chỉ cần chuẩn bị HTML script và gửi như gửi văn bản thông thường. Nhưng hãy lưu ý điều chỉnh content-type thành text/html.

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

public class Main {

    public static void main(String[] args) throws MessagingException {


        final String fromEmail = "[email protected]";
        // Mat khai email cua ban
        final String password = "Test123#";
        // dia chi email nguoi nhan
        final String toEmail = "[email protected]";

        final String subject = "Java Example Test";

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
        props.put("mail.smtp.port", "587"); //TLS Port
        props.put("mail.smtp.auth", "true"); //enable authentication
        props.put("mail.smtp.starttls.enable", "true"); //enable STARTTLS

        Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(fromEmail, password);
            }
        });

        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(fromEmail));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
        message.setSubject(subject);

        message.setSubject("HTML Message");
        String htmlContent = "<h1>Html Tag</h1>";
        message.setContent(htmlContent, "text/html");

        Transport.send(message);

        System.out.println("Gui mail thanh cong");

    }
}

Kết quả

 

Kết bài

Như vậy chúng ta đã tìm hiểu được cách gửi một email trong ứng dụng Java đơn giản thông qua thư viện Java Mail. Trong thực tế các bạn có thể áp dụng gửi email để xác thực đăng ký người dùng, quên mật khẩu, hay đổi mật khẩu. Ngoài ra có thể gửi email để thông báo định kỳ, các cập nhật hoặc các giao dịch xảy ra trên tài khoản của khách hàng.

Nguồn 

JavaMail Example – Send Mail in Java using SMTP

0 0 votes
Article Rating
Subscribe
Notify of
guest
14 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
14
0
Would love your thoughts, please comment.x
()
x