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.
*/
}
}
Nguoi hoc java said
cam on A.Hai, toi xin loi vi spam nhe!
lại Việt anh said
cảm ơn bài viết rất hữu ích của bạn
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 ?
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.
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!!!
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
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.
freedevc said
Hi hi, em tìm thấy rồi.
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
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)
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!
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″)
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.
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 đỡ .
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);
}
}
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
Hungnt said
Cái đó em đã sửa được rồi. Thanks thầy
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
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;
Võ Văn Hải said
pass của mail from chứ!
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 .
Hai said
Minh khong biet cach add va cai dat classpath ban nao biet hci minh voi cam on cac ban
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
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.
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.
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.
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 !
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
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.
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!!!
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!
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.
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.
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!!!
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.
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 đó ạ?
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?
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!
Võ Văn Hải said
phải biên dịch :javac -d . SendMailOK.java
chạy: java gmail/SendMailOK
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/
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?
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!
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 .
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?
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!
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
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
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
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!
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
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ả