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
8 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Hiệp
Hiệp
1 month ago

Exception in thread “main” javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8 https://support.google.com/mail/?p=BadCredentials i18sm246219pgb.83 – gsmtp

at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:947)
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:858)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:762)
at javax.mail.Service.connect(Service.java:364)
at javax.mail.Service.connect(Service.java:222)
at javax.mail.Service.connect(Service.java:171)
at javax.mail.Transport.send0(Transport.java:230)
at javax.mail.Transport.send(Transport.java:100)
at gmo.runsystem.internal.utils.Utils.main(Utils.java:132)

Mình chạy theo ví dụ của bạn thì bị lỗi này. Hình như google k support nữa hay sao đó

V.Thom
V.Thom
24 days ago

protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(fromEmail, password);
Hàm này nó không nhận, và password nó bắt convert về char(Khai báo ở trên là String)
Không biết nên fix như nào nhỉ, mong ad giúp đỡ!

Last edited 24 days ago by V.Thom
V.Thom
V.Thom
24 days ago
Reply to  Deft

Mình đã import đủ thư viện nhưng ở đoạn này nó không hiểu hàm này, và dòng password nó lỗi: string cannot covert char[]… Không biết nên fix bug như nào nhỉ?
#Netbean8.2

code.PNG
Last edited 24 days ago by V.Thom
V.Thom
V.Thom
24 days ago
Reply to  Deft

Cảm ơn admin nhiều nhé… Good luck for you and have a nice day!

8
0
Would love your thoughts, please comment.x
()
x