Trang 205
Chng 9: JAVA MAIL
I. Các khái nim MAIL
Ngày nay e-mail hay thn tã tr nên ph bin và hu nh không th thiu
trong th gii Internet. E-mail cho phép gi thông p t ni này n ni khác tng t
nh cách gi th truyn thng thông qua bu n. Trong cách thông thng bn phi cung
p a ch ngi gi (sender), a ch ngi nhn (reciept) sau ó ngi gi mang thn
u n nh bu n chuyn thi. Bu n s chuyn thn hp th ca ngi nhn.
i vi thn t e-mail gi qua h thng Internet hay mng thì c ch gi/nhn
ng hoàn toàn tng t. Các máy ch (mail server) cung cp cho bn ch mail (còn gi
là e-mail address). Bn ghi a ch mail ca bn và ca ngi nhn, sau ó nhp vào ni
dung cn gi. Mail server s gi th ca bn n mt máy ch hay mail server ca a ch
ngi nhn. Mail server ni nhn s ct th vào mt ni thích hp (mail box hay còn gi là
p th) trên máy ch. Ngi nhn s tin hành ng nhp (hay còng gi là login) vào hp
th ca máy chc ni dung e-mail gi cho mình.
thng nht gia các máy ch mail trên toàn th gii v cách thc gi nhn mail
òi hi hình thành các chun v mail. u này giúp cho vic gi nhn các thông p c
m bo, làm cho nhng ngi các ni khác nhau có th trao i thông tin vi nhau.
Có 2 chun v Mail thng c các máy ch mail h tr là X.400 và SMTP
(Simple Mail Transfer Protocol). SMTP thng i kèm vi chun POP3 và do hn ch ca
SMTP mà ngày nay ngi ta dùng chun m rng ca nó là ESMTP (Extended SMTP).
c ích chính ca X.400 là cho phép các mail có thc truyn nhn thông qua các loi
ng khác nhau bt chp cu hình phn cng, hu hành mng, giao thc truyn dn
c dùng. Còn mc ích ca chun SMTP miêu t cách u khin các thông p trên
ng Internet. u quan trng ca chun SMTP là ginh máy nhn phi dùng giao thc
SMTP gi Mail cho mt Server luôn luôn hot ng. Sau ó, ngi nhn sn ly Mail
a h t Server khi nào h mun dùng giao thc POP (Post Office Protocol), ngày nay
POP c ci tin thành POP3 (Post Officce Protocol vertion 3). Các giao thc Mail thông
ng : chun X.400, chun MAIP, SMTP (ESMTP), POP3. Trong chng này ta s s
ng hai giao thc :POP3 và SMTP gi nhn mail.
Mô hình gi nhn mail
Trc khi i vào phn chính chúng ta cùng ôn li mt s khái nim c s sau:
Sende
r
Reveicer
Mail Server trung
gian
Mail Server ngi
i
Mail Server ngi
nhn
ng ng
Trang 206
Mail server: là mt chng trình chy di dng mt dch v. dch v này có nhim v
nhn mail t máy khách gi n, phân phi mail n máy ch khác, cho phép máy
khách truy cp vào ly mail, lu tr mail… Chính vì vy trc khi bn gi nhn mail
n phi bit a ch ca máy ch mail (máy ang chy dch v mail). a ch này
thng c gi là mail host.
Giao thc gi mail (Mail transport protocol): gi mail n máy ch, trình khách
phi s dng mt giao thc trò chuyn vi mail server. Tng t nh trình duyt s
ng giao thc HTTP trò chuyn vi Web server. Các máy khách mun bt tay vi
trình ch và gi mail lên máy ch s s dng giao thc SMTP (Simple Mail Transport
Protocol). SMTP khá ni ting và c hu các máy ch mail trên th gii h tr. a
ch ca máy ch nhn mail gi i c gi là outgoing mail address. Trình ch tip
nhn mail theo giao thc SMTP c gi là SMTP Server. Trình khách s dng giao
thc SMTP gi thi c gi là SMTP Client.
Giao thc lu tr và nhn mail (mail store protocol): Khi trình ch mail tip nhn
c mail. Nó tin hành lu tr mail theo mt cách thc nào ó trình khác có th d
dàng truy cp vào và nhn mail v. Hin nay POP3 (Post Office Protocol) và IMAP
(Internal Message Access Protocol) là hai giao thc lu tr và ly mail t hp th
(Inbox) c nhiu mail server s dng. a ch ca máy ch lu tr mail cho phép
máy khách truy cp vào nhn mail v c gi là incoming mail address. Các
chng trình mail Client thng s dng giao thc POP3 nhn mail t trình ch.
Trình ch tip nhn yêu cu ca trình khách theo giao thc POP3 c gi là POP
Server.
SMTP Relay: Các mail server nu nhn c mail không thuc a ch do mình qun
lý, khi ó nó có trách nhim gi mail n máy ch khác vi cùng giao thc SMTP.
Trong trng hp này mail server (ni chuyn tip thi) óng vai trò nh mt trình
khác (mail client) i vi máy ch ni nhn. C th. Internet mail là mt h thng
chuyn mail liên tc gia các máy ch mail vi nhau cho n khi nào mail n c
máy chích. Các mail server a phn h tr tính nng Relay.
POP before SMTP (Chng thc quyn truy cp theo giao thc POP trc khi s
ng SMTP): tránh tình trng máy ch mail c li dng gi mail mt cách
t. C ch POP before SMTP yêu cu máy khách mun s dng dch v mail ca máy
ch phi trc ht phi ng nhp (login) vào tài khon (account) theo giao thc POP.
u quá trình ng nhp thành công, c ch gi mail bng SMTP mi có th thc hin
c.
Mail client, Web mail: là chng trình dùng nhn mail v t trình ch và cho phép
i mail lên trình ch. Nu mail client c vit di giao din Web thì nó c gi là
Web mail.
II. Gi mail vi th vin có sn ca java
Java cung cp cho bn mt th vin nh gn giúp bn có th gu mail mt cách d
dàng, tuy nhiên vi th vin này bn không có c các tính nng cao cp nh gi
file ính kèm…, s dng các tính nng cao cp bn x th vin Mail API (gii
thiu trong phn sau). Th vin này có lp SmtpClient dùng gi mail.
gi mail bn cung cp a ch ca ngi gi (from), a ch ca ngi nhn (to),
a ch ca mail server (máy ch tip nhn mail do bn gi lên) cùng vi ni dung
mà bn mun gi. Di ây là mt chng trình n gin dùng gi mail n a
Trang 207
ch nh vào máy ch mail utehy.edu.vn (máy ch mail ca
trng DHSP KT Hng Yên). a ch ngi gi có tht tu ý. Nhng thng là
a ch ca bn ngi nhn sau khi c th xong có th hi âm (Reply) li cho
n.
//SendMailApp.java
import sun.net.smtp.*;
import java.io.*;
public class SendMailApp {
public static void main(String[] args) throws Exception {
String host = "utehy.edu.vn";
String from = "";
String to = "";
String subject = "Test Message";
String body = "Hello this is test message for mail";
/* To i tng gi mail theo giao thc SMTP, host là a ch ca máy ch nhn mail do ta
i lên */
SmtpClient mailer = new SmtpClient(host);
// Thit lp a ch ca ngi gi và ngi nhn
mailer.from(from);
mailer.to(to);
//Ly v lung xut gn vi mail
PrintStream ps = mailer.startMessage();
//Din các thông tin khác
ps.println("From:" + from);
ps.println("To:" + to);
ps.println("Subject:" + subject);
ps.println();// Thêm CRLF vào trc phn ni dung
ps.println(body);
//Kt thúc quá trình gi mail
mailer.closeServer();
System.out.println("Mail has been sent");
}
}
Chú ý: Hãy thay a ch From, To bng a ch e-mail mà bn mun gi.
III. Gii thiu java mail API
Lp SmtpClient ca java mà chúng ta s dng trên ây ch giúp bn gi mail mc
n gin nht vi ni dung mail dng thun vn bn. Mt ng dng mail phía máy khách
thng có các chc nng phc tp hn nh : Gi file ính kèm, d liu c nhúng c hình
nh, âm thanh… thc hin nhng chc nng này java a ra mt th vin riêng chuyên
lý các thao tác gi nhn mail.
1. Cài t th vin java mail
Mc nh các th vin java mail API không c cài t khi bn cài JDK. Th vin
này gm ba phn:
Phn th nht là ht nhân ca các tác v x lý mail, nó c óng gói trong tp mail.jar.
n có th download ta ch />Trang 208
Phn th hai là JavaBean Activation FrameWork cn cho mi phiên bn ca java mail.
Th vin này mang tên activation.jar. vi th vin này bn có th ti xung t
/>Phn th ba là các lp c hay nhn mail t trình ch. Trong java 1.4 th vin này có
tên mail.jar
n t bin môi trng classpath=%CLASSPATH%; C:\JBuilderX\lib\mail.jar;
C:\JBuilderX\lib\activation.jar;
Chú ý: Khi bn cài JBuilder hai th vin này cng c tng cài t vào máy, bn có
th tìm thy nó trong th mc Jbuilder_Home/lib
2. Các bc gi nhn mail
Các bc nhn mail:
o i tng mail Session.
o i tng store chun b ly mail v. to i tng Store bn yêu cu ngi
dùng nhp vào tên và mt khu chng thc quyn truy cp hp pháp.
dng i tng Store ly vi tng Folder. Mi Folder s cha mt loi mà
n mun ly. Nh Folder Inbox cha các th vin gi n. Folder trash cha các th
a b xoá. Folder sent cha các th va gi i…
Duyt i tng Folder ly v danh sách các th.
Các bc gi mail
Yêu cu ngi gi chn giao thc gi (SMTP) và nhn (POP3 hay IMAP…). Lu
các thông tin này vào i tng Session.
o i tng Message. i tng này s cha các thông tin v mail cn gi i nha
ch ngi gi, a ch ngi nhn, tiêu mail, ni dung mail…
i phng thc Transport.send() hoc phng thc sendMessage ca i tng
Transport gi thi.
3. Các lp c bn x lý thao tác gi nhn mail
Ta tìm hiu các gói trong th vin java mail. Hu ht các ng dng mail client cn
import các th vin javax.mail, javax.mail.interner, javax.mail.activation.
3.1. Các lp liên quan n vic gi mail
3.1.1. Lp Session
Lp này th hin mt phiên kt ni ti mail server. Trc khi truy cp (gi/nhn)
n cn phi to ra mt i tng Session th hin cho mt phiên làm vic. ví d:
//To i tng Properties cha thông tin khi to nu có
Properties props=new Properties();
/*gán giá tr cho các thuc tính bng phng thc
props.setProperty(PropertyName, PropertyValue) */
//To i tng Session
Session session =Session.getDefaultInstance(props,null);
Hoc bn có th gi phng thc getInstance() ca lp Session thay cho
getDefaultInstance() to ra th hin ca i tng Session nh sau:
//To i tng Properties cha thông tin khi to nu có
Properties props=new Properties();
Trang 209
/*gán giá tr cho các thuc tính bng phng thc
props.setProperty(PropertyName, PropertyValue)*/
//To i tng Session
Session session =Session.getInstance(props,null);
Trong c hai phng thc khi to i tng Session nêu trên. các thuc tính cu
hình c t trong i tn Properties nên trc khi bn bn gi nhn mail bn cn thit
t các thuc tính này. ví d:
props.setProperty("mail.host","utehy.edu.vn");
props.setProperty("mail.from","");…
ây thng thì bn truyn null cho tham s th hai vi ý ngha s dng c ch
chng thc (authentication) mc nh ca mail server.
S khác nhau gia hai phng thc này là getInstance() thì luôn to ra mt Session
i còn getDefaultInstance() thì không to ra mt th hin mi ca Session nu nh nó ã
c to ra trong cùng java virtual machine.
3.1.2. Lp Message
Sau khi có i tng Session bn, gi mail bn bn cn to ra i tng Message.
Tuy nhiên ít khi bn làm vic trc tip vi i tng này mà bn thng làm vic vi các
p con ca nó, lp MimeMessage. ví d, bn to thông p mail chun b gi i nh
sau:
MimeMessage message =new MimeMessage(mailsession);
u ni dung ca thông p là thun vn bn, bn có th thit t ni dung th gi bng
nh:
message.setText(content);
u bn chnh Mime cho ni dung cn gi nu nó không phi là thun vn bn nh sau:
message.setContent(content,"text/html");
u ni dung không phi thun vn bn thì bn phi chnh Mime cho nó, ni nhn
mail s cn c vào Mime hin thúng ni dung ca thông p nhn c.
Mt thói quen tt nên có là t cho mail mt tiêu (subject). Ngi nhn cn c
vào tiêu th bit c ni dung vn tt mô t trong th. Phng thc setSubject() s
giúp ta làm vic ó. Ví d:
Session.setSubject(Xin chao);
3.1.3. Lp Address
Sau khi bn to ra i tng Session và Message, tip n ta s dng lp Address
o ra ch ca ngi gu và ngi nhn. Lp Address là lp tru tng, bn s
ng lp con ca nó là InternetAddresss. Ví d bn to a ch mail t lp này nh
sau:
Address address =new InternetAddresss();
Hoc
InternetAddresss address =new InternetAddresss();
Nu bn mun a ch e-mail có thêm thông tin din gii bn thêm s dng cú pháp
nh sau:
Address address =new InternetAddresss(, Hoang Trong The);
Thông tin din gii này sc hin th thay khi ngi nhn c th thay cho a
ch mail from.
Trang 210
Sau khi to xong a ch ca ngi gi, a ch ca ngi nhn bn cn gn nó vào
thông p cn gi i. Java cung cp cho bn ba loi a ch ph bin:
Kiu a ch ý ngha
Message.RecipientType.TO a ch ni n
Message.RecipientType.CC a ch ngi gi cn lu ý
Message.RecipientType.BCC a ch ngi gi cn tham kho
Bn gi phng thc addRecipient() ca i tng Message gán a ch cn gi.
Ví d:
//To a ch
Address toAddress=new InternetAddresss(“”);
Address ccAddress=new InternetAddresss(“”);
//Gán a ch cho ngi nhn
message.addRecipient(Message.RecipientType.TO, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);
t a ch ca ngi gi bn gi phng thc setFrom(). Ví d:
Address myAddress=new InternetAddresss(“”);
message.setFrom(myAddress);
a ch ca ngi gi không quan trng, bn có tht cho nó mt a ch e-mail
không có thc, nu bn t a ch ca ngi gi không có thc thì ngi nhn không th
phn hi (reply) li cho bn.
Ta có tht a ch ca ngi gi là mt danh sách (mng) ngi nhn có th
phn hi li cho nhiu ngi cùng mt lúc. Bn gi phng thc addFrom() nh
sau:
Address address[]=…
Message.addFrom(address);
Chú ý: java mail không cung cp c ch kim tra xem a ch ca ngi gi có hp l hay
không. kim tra mt a ch mail có hp l hay không không phi là d, thông thng
n gin nht bn kim tra xem trong a chó có kí t @ hay không?
3.1.4. Lp Transport
Lp Transport cung cp các phng thc gi mail n mail server. n gin bn gi
phng thc tnh send() ca lp Transport gi i tng thông p i. Ví d:
Transport.send(message);
Hoc bn có th chn giao thc gi mail ti tng Session, to kt ni n trình
ch mail và gi phng thc sendMessage() gi mail i:
Transport transport;
transport =mailSession.getStransport(smtp);
transport.connnect(host, user, password);
// hoc bn có th gi phng thc transport.connnect();
transport.sendMessage(message, message.getAllRecipients());
transport.close();