Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

Gửi mail có chứng thực trong java

Với gói javamail của sun, việc gửi mail của bạn trở nên cực kỳ dễ dàng. Sau đây là 1 chương trình gửi mail hoàn chỉnh với tài khoản gmail và được validate ngon lành. Bạn copy đoạn code sau đó dùng notepad tạo file SendMailOK.java, paste đoạn code vào, lưu lại

Bạn phải download gói java mail của sun, cài đặt và thiết lập classpath đến file mail.jar trước khi thực thi ứng dụng.
http://java.sun.com/products/javamail/downloads/index.html
Ngoài ra, bạn còn phải thiết lập classpath đến 2 gói activation.jar và javaee.jar (2 gói này nằm trong glassfish\lib folder nếu dùng Glassfish)

Để thực thi, chạy command line, gõ java SendMailOK.java để biên dịch, sau đó gõ javac SendMailOK để chạy.

package gmail;

import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMailOK {

public static void send(String smtpServer, String to, String from,String psw,
String subject, String body) throws Exception{
// java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
Properties props = System.getProperties();
// –
props.put(”mail.smtp.host”, smtpServer);
props.put(”mail.smtp.port”, “587″);
props.put(”mail.smtp.starttls.enable”,”true”);
final String login = from;//”nth001@gmail.com”;//usermail
final String pwd = psw;//”password cua ban o day”;
Authenticator pa = null; //default: no authentication
if (login != null && pwd != null) { //authentication required?
props.put(”mail.smtp.auth”, “true”);
pa = new Authenticator (){
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(login, pwd);
}
};
}//else: no authentication
Session session = Session.getInstance(props, pa);
// — Create a new message –
Message msg = new MimeMessage(session);
// — Set the FROM and TO fields –
msg.setFrom(new InternetAddress(from));
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(
to, false));

// — Set the subject and body text –
msg.setSubject(subject);
msg.setText(body);
// — Set some other header information –
msg.setHeader(”X-Mailer”, “LOTONtechEmail”);
msg.setSentDate(new Date());
msg.saveChanges();
// — Send the message –
Transport.send(msg);
System.out.println(”Message sent OK.”);

}
/**
* Main method to send a message given on the command line.
*/
public static void main(String[] args) {
{
try
{
String smtpServer=”smtp.gmail.com”;
String to=”vovanhaiqn@gmail.com”;
String from=”vonguyenhamy@gmail.com”;
String subject=”Hello from Java”;
String body=”Test using java to send mail.”;
String password=”mật khẩu của bạn ở Ä‘Ă¢y”;
send(smtpServer, to, from, password, subject, body);
System.out.println(”Finish!”);
}
catch (Exception ex)
{
System.out.println(”Usage: “+ex.getMessage());
}

}

/**
* “send” method to send the message.
*/

}

}

60 Responses to “Gửi mail có chứng thực trong java”

  1. Nguoi hoc java said

    cam on A.Hai, toi xin loi vi spam nhe!

  2. lại Việt anh said

    cảm ơn bài viết rất hữu ích của bạn

  3. hung said

    anh Hải à,em gửi mail không được nó toàn báo false connect.em nghĩ cái phần props.put(“mail.smtp.host”, smtpServer);
    props.put(“mail.smtp.port”, “587”);
    props.put(“mail.smtp.starttls.enable”,”true”);

    anh có thể giải thích không ?

  4. vovanhai said

    smtpServer là tên server SMTP của bạn. CỔng 587 là cổng của Gmail, bạn dùng cổng do admin của bạn qui định tương ứng với SMTP server.

  5. Lighthouse said

    Hi anh,
    Mình đã thử làm theo hướng dẫn của anh và thấy chạy rất tốt nếu ở mode run as application, nhưng gặp vấn đề khi đưa vào servlet và bị lỗi internal error. Không biết có thể pm với anh để thảo luận được không? Xin cám ơn!!!

  6. vovanhai said

    Tôi đã thử với servlet chạy tốt. Nếu bạn chạy trên JBOSS AS thì coi chừng đụng độ gói mail.jar

  7. freedevc said

    em cám ơn bài viết của anh. Anh có thể cho em hỏi là mình có thể gửi nội dung của email là một đoạn html được không ạ? Ví dụ em muốn send email để gửi các mặt hàng mà khách hàng đã chọn theo dạng table html. em đã thử chèn các tab html vào trong phần setText rồi mà nó không ra, nó hiển thị nguyên cái text mà em truyền vào.

    Xin cảm ơn anh.

  8. freedevc said

    Hi hi, em tìm thấy rồi.

  9. Linh said

    Nếu em muốn gửi bằng địa chỉ mail với mail server là hotmail hay yahoo thì dường như code này không có tác dụng. Anh có thể hướng dẫn em gửi mail bằng những địa chỉ mail khác có xác thực được không

  10. sagavon said

    thay oi, sao em chay no bao loi nhu sau:
    avax.mail.SendFailedException: Sending failed;
    nested exception is:
    class javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first. b6sm445175wam.21

    at javax.mail.Transport.send0(Transport.java:218)
    at javax.mail.Transport.send(Transport.java:80)
    at SendMailOK.send(SendMailOK.java:58)
    at SendMailOK.main(SendMailOK.java:75)

  11. vovanhai said

    Em kiểm tra kỹ các dòng lệnh. EM chép thiếu hoặc sai lỗi chính tả trong các chuỗi!

  12. lethanhtung said

    Anh Hai oi cho em hoi smtpServer la gi va co the lay no o dau a?
    ma cong 587 em cung khong biet lay o dau va xac dinh no nhu the nao a?

    props.put(”mail.smtp.host”, smtpServer);
    props.put(”mail.smtp.port”, “587″)

  13. vovanhai said

    smtpserver là server mail của bạn, bạn có thể lấy nó ở chỗ admin công ty của bạn. trong bài viết tôi dùng
    String smtpServer=”smtp.gmail.com”; là smtp server của google.
    cổng 587 là cổng của smtp trên google. của bạn thì hỏi admin.

  14. conangdemen33 said

    cho mình hỏi là sử dụng java để viết chương trình gởi nhận mail nhưng không dùng java mail ,như vậy mình sẽ làm như thế nào ? do mới học lập trình java nên mình không rành lắm ,rất mong được các bạn giúp đỡ .

  15. Võ Văn Hải said

    Bạn dùng Socket, gửi các thông số theo cấu trúc:
    HELO sending host
    MAIL FROM: sender email address.
    RCPT TO : recipient email address.
    DATA :
    Mail message

    QUIT
    Ví dụ:
    public void sendMail()
    {
    try
    {
    Socket s = new Socket(smtpServer.getText(), 25);

    InputStream inStream = s.getInputStream();
    OutputStream outStream = s.getOutputStream();

    in = new Scanner(inStream);
    out = new PrintWriter(outStream, true /* autoFlush */);

    String hostName = InetAddress.getLocalHost().getHostName();

    receive();
    send(“HELO ” + hostName);
    receive();
    send(“MAIL FROM: “);
    receive();
    send(“RCPT TO: “);
    receive();
    send(“DATA”);
    receive();
    send(“Nội dung mail gửi đi”);
    send(“.”);
    receive();
    s.close();
    }
    catch (IOException e)
    {
    comm.append(“Error: ” + e);
    }
    }

  16. Hungnt said

    Thầy ơi em coppy đoạn code trên vào netbeen thì báo lỗi “class SendMailOk is public, should be declared in a file named SendMailOk.java”.-> em đổi tên class trên thành SendMailOk -> báo lỗi “Can not refactor library class gmail”-> không cho đổi. Vậy phải làm sao hả thầy

  17. Hungnt said

    Cái đó em đã sửa được rồi. Thanks thầy

  18. Hungnt said

    Em Không hiểu vì sao khi đến lệnh gán đầu tiên trong hàm main (String smtpServer=”smtp.gmail.com”;) lại báo lỗi. Và cái “Password” là pass của “mailto” hay “mailfrom” vậy thưa thầy

  19. atht6 said

    cho em hỏi lỗi này là gì ạ :
    Exception in thread “main” javax.mail.MessagingException: Could not convert socket to TLS;

  20. Võ Văn Hải said

    pass của mail from chứ!

  21. maiami said

    Thầy cho em hỏi là để chạy cùng lúc cả client và server nằm trong cùng project trên Netbean thì phải làm thế nào .

  22. Hai said

    Minh khong biet cach add va cai dat classpath ban nao biet hci minh voi cam on cac ban

  23. HƯƠNG said

    anh ơi! Làm ơn chỉ bảo tận tình giúp em để thiết lập classpath và chạy chương trình này. Em mới học nhưng đang phải làm bài tập lớn về phần này, mà em loay hoay mãi không làm được. Cảm ơn anh

  24. Võ Văn Hải said

    Giả sử file mail.jar của bạn chứa ở E:\mail\mail.jar.
    Mở System Properties lên, chọn thẻ Advanced. Nhấn nút “Environment Variables…” lên. TÌm coi có cái biến nào có tên CLASSPATH chưa. Nếu chưa có thì tạo 1 biến có tên CLASSPATH. Thêm vào phần value: ;.;E:\mail\mail.jar
    Tắt cửa sổ cmd đi. Chạy lại và… ok.

  25. HungLQ said

    Chào anh Hải. Em đã thử code trên jsp-servlet và chạy thành công, nhưng khi kiểm tra hộp thư nhận thì không có email được gửi từ email đã thiết lập để gửi thư đi. Em dùng server Tomcat 5.5.27. Mong anh chỉ giúp. cảm ơn anh.

  26. Võ Văn Hải said

    Kiểm tra lại các thông số thử. Code này đã kiểm tra và đã chạy tốt.

  27. Nguyễn Thị Thanh Phúc said

    Dạ, ý kiến của em cũng giống với HungLQ ạ. Em dùng tomcat 6. ạ. Thầy gợi ý cho bọn em với được không ạ? Em cám ơn thầy !

  28. sakura said

    Thầy ơi cho em hỏi, để gửi mail có tiếng việt thì làm thế nào?
    Emm đã thử nhiều cách rồi mà không được

  29. Võ Văn Hải said

    thì gửi nó bằng tiếng Việt chứ sao! Khi biên dịch chọ encoding UTF8, còn nếu dùng IDE thì lưu ở dạng UTF-8 là xong.

  30. Nguyễn Lan said

    Hi Thầy

    Em đang làm phần Contact Us, có chức năng send mail cho Admin, em có xem nhiều code send mail using JavaMail nhưng vẫn chưa thực hiện được, vì sử dụng smtp.gmail.com buộc phải xác thực, mà với Contact Us thì làm sao yêu cầu User nhập thêm Password vào được nhỉ để mà có xác thực.

    Thầy có hướng giải quyết nào phù hợp cho trường hợp này mà vẫn send mail ok không thì vui lòng giúp em nhé. Chân thành cám ơn thầy!!!

  31. Nguyễn Lan said

    Hi Thầy cho em nói lại nội dung đã hỏi trên đó là:

    Em có 1 địa chỉ Email gmail, với code như thầy đã hướng dẫn trên, em phải sửa lại như thế nào để client đó thể gửi mail cho em & em nhận được mail do client gửi. Chân thành cám ơn thầy!

  32. Võ Văn Hải said

    người nhận thì không cần phải cấu hình gì. Tuy nhiên cái mail mà bạn dùng để gửi phải Enable POP.

  33. Võ Văn Hải said

    Em lấy mail của em mà gửi. Nhưng trong nội dung mail có điền cái mail của khách hàng.

  34. Nguyễn Lan said

    Hi thầy

    Thầy nói vậy là em gửi mail lại cho chính em rùi !!! Chứ đâu phải Client gửi cho em !!!
    JavaMail API lại hạn chế vậy hả thầy, chỉ cho phép gửi mail, không cho làm điều ngược lại hả thầy!!!

  35. Võ Văn Hải said

    JavaMail không có hạn chế. Đó là chuẩn gửi mail POP. Nếu bạn muốn thư bạn gửi vào inbox thì phải như vậy.

  36. Hoài Giang said

    Thầy Hải ơi e có trường hợp sau. Ngườ dùng quên mật khẩu và e cung cấp chế độ lấy lại mk với câu hỏi bí mật. Vậy Thầy cho e hỏi khi ng ta nhập đúng câu hỏi bí mật và OK thì làm sao để mình tự sinh 1 đoạn mã và tự động gửi đoạn mã đó đến mail của ng dùng đó ạ?

  37. sangkien said

    Anh Hải ơi cho em hỏi cái nhé em cũng mới học java thôi nên cũng chưa rõ lắm.Java thi em đã cài jdk6 rồi chạy java socket thi ok. trong phần đầu anh co noi download goi javamail, em đã tải về và giải nén được gói javamail1_4_4/package gmail
    vậy gói này làm sao ma cài đặt? thiêt lặp classpath đen 2 gói activation.jar và javaee.jar la sao anh?2 goi nay downlaod o dau?

  38. sangkien said

    E:\MAIL>javac SendMailOK.java
    E:\MAIL>java SendMailOK
    Exception in thread “main” java.lang.NoClassDefFoundError: SendMailOK (wrong nam
    e: gmail/SendMailOK)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$000(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    Could not find the main class: SendMailOK. Program will exit.

    E:\MAIL>
    em bien dich va chay bi loi vay la sao ha anh Hai?
    Em đã tao biến CLASSPATH đến mail.jar rồi, cung tạo luôn biến môi trường path đến C:\Program Files\Java\jdk1.6.0_10\bin
    nhưng khong chay được anh oi! Giup em voi!

  39. Võ Văn Hải said

    phải biên dịch :javac -d . SendMailOK.java
    chạy: java gmail/SendMailOK

  40. Võ Văn Hải said

    bạn có thể download cái JBossAS về, trong đó có nhiều thứ . url: http://www.jboss.org/download/

  41. sangkien said

    Hi anh! Truoc het em xin cam on anh ve bai viet va nhung huong dan cua anh rat nhieu! Em da chay thanh cong! Anh co the huong dan lam sao co the xay dung mot ung dung vua co the gui email vua co the nhan duoc email cau minh tu tai khoan gmail?
    Phan bai huong dan cau anh chi co phan Gui mot Email den hop thu khac tu hop mail cua minh.Vay muon nhan Mail minh phai thuc hien the nao?

  42. sangkien said

    Cam on anh em da chay duoc va gui thanh cong!
    Tuy nhien van de dat ra la tai sao chi gui ma khong co nhan? Chung ta co the xay dung mot ung dung co the gui va cung co the nhan mail tren cung mot ung dung kg?
    Neu duoc anh co the huong dan cho em va moi nguoi mot ty anh nhe!

  43. ngoc bich said

    thay oi ! tai sao cua em no cu bao loi
    Usage: Sending failed;
    nested exception is:
    class javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first. z1sm50311084pbl.5

    thay giup em voi .

  44. Võ Văn Hải said

    Xem code lại thử có thiếu dòng nào không? Nếu OK thì xem thì thiết lập mail của bạn cho phép enbale POP chưa?

  45. Nam said

    Cho em hỏi làm cách nào để gởi luôn 1 trang web xuất hiện trong nội dung thư của người nhận (do em đang làm website bán hàng). Cảm ơn Thầy rất nhiều!

  46. tanzan said

    mình có sử dụng msg.setFileName(“C:\\test.jpg”); nhưng file nao cung chỉ có 1k lên lỗi cả không xem được trong jmail.jar có hỗ trợ gửi cả file không

  47. ku bjn said

    a cho em hỏi, có thể đính kèm file được không, nếu được thì làm như thế nào. Thank

  48. diep said

    em dung Jcreator, nhug cu bao loi import javax.mail.Message; co tu javax la bao loi ngay, e k hiu cho do, rat mong a jup

  49. Võ Văn Hải said

    em dung Jcreator, nhug cu bao loi import javax.mail.Message; co tu javax la bao loi ngay, e k hiu cho do
    Bạn chưa thêm thư viện java mail vào sao mà nó hiểu!

  50. Gà Java said

    Em muốn dùng chương trình kết hợp trong netbean( soạn thảo và thao tác trên netbean ) nhưng k biết add thế nào.Trong file Javamail download theo link trên cũng chẳng có file .jar hay application gì cả. Anh có thể hướng dẫn em cách làm được k?Nếu có thể liên hệ lamlo_cdt giùm em nhé.
    Cám ơn anh rất nhiều

  51. Pig Small said

    Bạn phải download gói java mail của sun, cài đặt và thiết lập classpath đến file mail.jar trước khi thực thi ứng dụng.
    http://java.sun.com/products/javamail/downloads/index.html
    Ngoài ra, bạn còn phải thiết lập classpath đến 2 gói activation.jar và javaee.jar (2 gói này nằm trong glassfish\lib folder nếu dùng Glassfish)

    ===>>> Thầy ơi chỉ cho em cách thiết đặt classpath với. Em giờ mới bắt đầu học java nhưng google đọc mãi mà chẳng hiểu thế nào cả

  52. Thuong Tu said

    Thanks pro!
    Chạy rất tốt.

  53. ES said

    Thầy ơi giúp em với em làm nó ra cái lỗi này không gửi được mail Usage: Could not convert socket to TLS

  54. Võ Văn Hải said

    Đã test ok, xem lại credential đúng không nhé.

  55. Cao Thanh Liêm said

    Thầy ơi cho e hỏi cái lớp này xây dựng được trên Servlet hả thầy tại e đang cần làm một trang liên hệ để gửi góp ý của khách hàng về gmail của mình.

  56. Mình có 2 form 1 là đăng nhập, 2 là giao diện chính để xử lý.
    1.Khi đăng nhập thì form Login mất.(Đã dùng dispose() nhưng không đc vì class Login mình extend JPanel ).
    2.Khi đăng nhập lên máy chủ thành công thì làm thế nào để acc mail của mình vẫn lưu trên form SenMail lúc ấy chỉ cần ấn Gửi là được?(Mình được biết là dùng Session như không biết cụ thể như nào?).
    Cảm ơn !

  57. Võ Văn Hải said

    mọi thứ ok em

  58. Nguyen Huu Phuong said

    e thử gửi mail bằng cách telnet đến smtp.gmail. com 587 đến đoạn nhập MAIL FROM: xong thì nó báo mã 530 5.7.0 Must issue a STARTTLS command first. chứ ko phải mã 250. làm cách nào để khắc phục ạ?

  59. Thanh Tung said

    Em chào thầy !
    Em chạy bị lỗi, nhưng chưa biết cách khắc phục, mong thầy hướng dẫn giúp em !

    Usage: Could not connect to SMTP host: smtp.gmail.com, port: 587

  60. hang said

    em muốn dùng socket thì làm thế nào a.??? thầy giúp em với.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: