Có rất nhiều cách để giúp bạn gửi 1 email cho bạn bè, hay ai đó.

Bạn có thể sử dụng các lớp trong package javax.mail.* để gửi email. Với cách này bạn có thể xem những bài viết sau để thực hiện gửi email trong Java.

http://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/

Trong thực tế, bạn có thể viết 1 chương trình gửi và nhận email để phục vụ việc liên lạc của mình khi chán việc phải vào Web Browser để làm việc đó.

Tuy nhiên, đối với lập trình viên, những người viết code và làm ứng dụng thì việc gửi mail sẽ được sử dụng không phải là việc viết chương trình gửi mail cho ai đó mà là viết chương trình gửi mail cho chính bản thân mình khi phải kiểm soát lỗi và theo dõi logs của cả hệ thống khi có điều gì đó bất thường xảy ra.

Bạn không thể ngồi hàng giờ, hàng ngày, hàng tháng để đợi ứng dụng chạy và phát sinh ra Exceptions rồi xử lý nó hay bạn không thể bị động khi ứng dụng bán cho khách hàng bị lỗi và gây ra treo hệ thống. Chúng ta cần 1 giải pháp để cập nhật, theo dõi, xử lý sự cố 1 cách nhanh nhất. Đó là sử dụng gửi Email khi có lỗi xảy ra. Tôi có Smartphone, laptop, tôi có thể biết được ứng dụng nào đang bị lỗi, hệ thống có vấn đề gì không và tôi có thể khắc phục nó dễ dàng và nhanh nhất mà không bị thụ động về thời gian. Đây là cách tôi vẫn thường hay sử dụng khi làm việc, rất tiện lợi.

Để gửi mail, bạn có thể tải về và sử dụng thư viện này để viết các đoạn mã phục vụ cho việc gửi email.

Tùy theo cách làm và cách thiết kế của mỗi người mà ta sẽ triển khai tính năng gửi email này.

Tôi cần 1 SMTP Server để có thể gửi email. Nếu bạn chưa biết phải dùng SMTP Server nào, tôi đơn cử trang web sau, nó có mọi thông tin mà bạn cần: http://www.arclab.com/products/amlc/list-of-smtp-and-pop3-servers-mailserver-list.html

Để đơn giản hóa và tránh phức tạp, tôi thiết kế 1 class tiện ích chứa phương thức gửi email và class này được hardcode với các thông tin mặc định. Bạn có thể thiết kế lại tùy theo mục đích sử dụng của mình.

Class SendMailRunner.java
import com.jscape.inet.mime.MimeException;
import com.jscape.inet.smtp.SmtpException;

/**
 *
 * @author Code4LifeVn
 */
public class SendMailRunner {
    public static void main(String[] args) throws SmtpException, MimeException {
        SmtpSsl s = new SmtpSsl("smtp.gmail.com", 465);
        s.connect();
        s.login("code4lifevn@gmail.com", "xxxxxx");
        s.send("code4lifevn@gmail.com", "dia_chi_email_nhan@gmail.com", "TEST", "hello");
        s.disconnect();
        System.out.println("Sent!");
    }
}

OK, mọi việc hoàn thành, chạy thành công và đã gửi được mail. Bây giờ tôi cần thực hiện việc gửi mail này mỗi khi ứng dụng của tôi phát sinh ra Exceptions. Tôi giả 1 loạt các Exceptions và sửa lại 1 chút lớp SendMailRunner như sau:

Class SendMailRunner.java
import com.jscape.inet.mime.MimeException;
import com.jscape.inet.smtp.SmtpException;
import com.jscape.inet.smtpssl.SmtpSsl;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *
 * @author Code4LifeVn
 */
public class SendMailRunner {

    public static void main(String[] args) throws SmtpException, MimeException {
        SmtpSsl s = new SmtpSsl("smtp.gmail.com", 465);
        s.connect();
        s.login("code4lifevn@gmail.com", "xxxxxx");

        int i = 0;
        while (i < 100) {
            if (i % 5 == 0) {
                try {
                    throw new NullPointerException();
                } catch (Exception ex) {
                    StringBuilder str = new StringBuilder();
                    for (StackTraceElement string : ex.getStackTrace()) {
                        str.append(" Class: ").append(string.getClassName())
                           .append(" File Name: ").append(string.getFileName())
                           .append(" Line Number: ").append(string.getLineNumber())
                           .append(" Method: ").append(string.getMethodName());
                    }
                    s.send("code4lifevn@gmail.com", "dia_chi_email_nhan_logs@gmail.com", "Loi cmnr...WTF: " +
                            new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").format(new Date()), str.toString());
                    System.out.println("Sent!");
                }
            }
            i++;
        }
        System.out.println("END");
        s.disconnect();
    }
}

Do giả Exception và làm demo nên bước lấy trace hơi loằng ngoằng. Nếu bạn bắt Exceptions cụ thể thì không cần phải làm việc phân tích lấy trace này.

OK, và đây là kết quả mỗi khi ứng dụng gây ra Exceptions:

Hy vọng qua bài viết này, bạn có thể sử dụng email để bắt exception thay vì ngồi chờ đợi nó. Thỉnh thoảng đổi gió tí ^^

10 nhận xét:

  1. Bị lỗi tiếng việt khi gửi ,bác đỗ mạnh giúp em với !

    Trả lờiXóa
  2. baoquoc : Đây là 1 thiếu xót của mình khi viết tutorial này. Bạn có thể khắc phục việc gửi mail Unicode như sau:

    ============================================================
    public static void main(String[] args) throws SmtpException, MimeException {
    SmtpSsl s = new SmtpSsl("smtp.gmail.com", 465);
    s.connect();
    s.login("code4lifevn@gmail.com", "xxxxxx");
    EmailMessage msg = new EmailMessage("code4lifevn@gmail.com", "meohoang911@gmail.com", "TEST", "Xin chào");
    msg.setContentType("text/plain", "UTF-8");
    s.send(msg);
    s.disconnect();
    System.out.println("Sent!");
    }

    ===========================================================

    Nếu bạn muốn gửi cả 1 biểu mẫu HTML, bạn có thể sửa lại tham số setContentType("text/html", "UTF-8). Nếu trong trường hợp debug và dùng mail để nhận exception thì không cần thiết phải đặt Unicode ^^. Quan tâm exception nó là gì là được. Bạn sửa lại nhé

    Trả lờiXóa
  3. cảm ơn bác nhé !

    Trả lờiXóa
  4. À bác ơi nội dung thì ok rồi nhưng tiêu đề của mail thì vẫn bị lỗi ,bác test lại dùm em với ạ ,em xin cảm ơn !

    Trả lờiXóa
  5. Bạn test lại xem :)

    ===================================================

    public static void main(String[] args) throws SmtpException, MimeException {
    SmtpSsl s = new SmtpSsl("smtp.gmail.com", 465);
    s.connect();
    s.login("code4lifevn@gmail.com", "xxxxxx");

    EmailMessage msg = new EmailMessage("code4lifevn@gmail.com", "meohoang911@gmail.com");
    // => Set Content Type
    msg.setContentType("text/plain", "UTF-8");
    // => Tiêu đề mail
    msg.setSubject("Tiêu đề mail", "UTF-8");
    // => Nội dung
    msg.setBody("Nội dung Mail Message");
    // => Send mail
    s.send(msg);

    s.disconnect();
    System.out.println("Sent!");
    }

    Trả lờiXóa
  6. lỗi bác ạ ,hình như hàm EmailMessage nó phải có 4 đối số .

    Trả lờiXóa
  7. Vẫn giữ nguyên 4 tham số ở hàm EmailMesssage ,thêm dòng msg.setSubject("Tiêu đề mail", "UTF-8"); là được :D


    cảm ơn bác nhé !

    Trả lờiXóa
  8. Nó có nạp chồng bạn nhé, bạn xem kỹ lại ^^

    Trả lờiXóa
  9. i'm searching this. Thank you "gay" :3

    Trả lờiXóa

 

code4lifevn team

Thanh niên nghiêm túc :)

Name: Manh Do

Age: years old

Job: Senior Java and Mobile Developer

Country: VietNam

Name: Hung Nguyen

Age: years old

Job: Android Developer

Country: VietNam

Name: Trung PH

Age: years old

Job: Senior iOS and Android Developer

Country: VietNam

Name: Điệp NT

Age: years old

Job: Senior .Net and Android Developer

Country: VietNam