環(huán)境配置。為了運(yùn)行javamail。我們需要在classpath里導(dǎo)入兩個包:mail.jar和activation.jar,這是在純DOS里或者其它簡單工具使用時才需要這個classpath。如果使用像eclipes這樣的工具就不需要配置。因為myeclipes已經(jīng)幫你做好了。
為了要發(fā)送郵件和接收郵件,我們必須要遵守smtp和pop3協(xié)議,不過還有其它協(xié)議也可執(zhí)行(如IMAP)。如果把本機(jī)當(dāng)作服務(wù)器來發(fā)送郵件請在
http://jakrata.apache.org網(wǎng)站里下載james郵件服務(wù)器,然后解壓在本機(jī)上。運(yùn)行james/bin里的run.bat就可以啟動了服務(wù)器。
運(yùn)行后在DOS里登錄郵件服務(wù)器。具體命令如下:
系統(tǒng)管理員:root
密碼:root
telnet?localhost?4555
然后就可以增加郵箱用戶名了。命令如下:
adduser?用戶名?密碼
例:adduser?test?test
這樣就建立了這樣一個郵箱test@localhost?密碼為:test?
如果想要更多功能用help命令
注意:如果在本機(jī)裝了郵件服務(wù)器的話,只能在本機(jī)局域網(wǎng)里申請郵箱,發(fā)送和接收。不能發(fā)送到外部的郵箱里去。如果用外部的郵件服務(wù)器像比如163和126的服務(wù)器等就可以隨心所欲的發(fā)郵件了。哈哈是不是很爽呢?
先看看用james郵件服務(wù)器在本機(jī)上發(fā)郵件吧。先簡單看一個例子。
import?javax.mail.*;
import?java.util.*;
import?javax.mail.internet.*;
public?class?MyFirstMail?
{
????protected?Session?mailSession;
????public?MyFirstMail()throws?Exception
????{
????????init();
????}
????public?static?void?main(String[]?args)?
????{
????????try
????????{
????????????new?MyFirstMail().sendMail();
????????????System.out.print("郵件已發(fā)");
????????}
????????catch(Exception?e)
????????{
????????????e.printStackTrace();
????????}
????}
//初始化服務(wù)器環(huán)境
????public?void?init()throws?Exception
????{
????????Properties?props=new?Properties();
????????props.put("mail.transport.protocol","smtp");
????????props.put("mail.smtp.host","localhost");
????????props.put("mail.smtp.port","25");
????????mailSession=Session.getDefaultInstance(props,?null);;
????}
????public?void?sendMail()throws?Exception
????{
????????try
????????{
????????????
//從哪里發(fā)的郵件????????????
msg.setFrom(new?InternetAddress("test@localhost"));
????//發(fā)送到目標(biāo)郵件????????msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse("wang@localhost"));
????//抄送的接收者????????msg.setRecipients(Message.RecipientType.CC,InternetAddress.parse("wang@localhost"));
//暗送的接收者
msg.setRecipients(Message.RecipientType.BCC,InternetAddress.parse("wang@localhost"));
//設(shè)置發(fā)送時間
msg.setSentDate(new?java.util.Date());
//設(shè)置郵件標(biāo)題
msg.setSubject("a?test?mail");
//設(shè)置郵件內(nèi)容
msg.setText("this?is?the?email?content");
//指定協(xié)議發(fā)送消息的對像
Transport?transport=mailSession.getTransport("smtp");
//發(fā)送消息
Transport.send(msg);
}
catch(Exception?e)
{
throw?e;
}
}
發(fā)送完后想要看郵件就要到j(luò)ames->apps->james->var->mail->inboxes就可以看見每個郵箱里的郵件數(shù)了。由于發(fā)過來的是字節(jié)流,郵件包括一個郵件屬性和消息,所以每一封郵件是由二個文件組成的。
????????????
也許沒有學(xué)過的javamail的人看上去會一頭霧水。不要緊,現(xiàn)在一一詳解。先說初始化的內(nèi)容的吧!
1、????mail.transport.protocol=smtp?這里主要說明的是郵件傳輸協(xié)議。
2、????mail.smtp.host=localhost?發(fā)送郵件的主機(jī)如果用外部郵件服務(wù)器的話,可以這樣寫
mail.smtp.host=smtp.163.com這樣就以163.為服務(wù)器了。
3、mail.smtp.prot=25????smtp端口可以省略,缺省為25
javax.mail.session
session類定義了與遠(yuǎn)程郵件系統(tǒng)通信的郵件會話。需要注意的是這個session不同servlet中的會話。Servlet中的會話需要共享一些信息,而mail里的session里沒有這個功能,它只是用于存儲與服務(wù)器建立連接會話相關(guān)信息和邏輯。Session類是javamail?api最高層入口類,所有其它類都必須經(jīng)由session對象生效。Session對象它管理配置選項和用于與郵件系統(tǒng)交互的用認(rèn)證信息息。它通過使用java.util.properties對象配置郵件會話的屬性如郵件服務(wù)器,用戶名,密碼,及整個應(yīng)用程序中共享的其它信息。
Session并不處現(xiàn)任何授權(quán)操作,它只是存儲這些授權(quán)信息。Session類的構(gòu)造器是私有的,它不能被繼承,也不能用new語名創(chuàng)建實例。但它提供了兩個靜態(tài)方法getInstance?和getDefaultInstance來獲取session實例,在創(chuàng)建session實例時需要提供一些屬性。具體實現(xiàn)如下:
????Properties?props=new?Properties()
????Props.put(“mail.transport.protocol”,”smtp”)
????Props.put(“mail.smtp.host”,”localhost”);
??Props.put(“mail.smtp.prot”,”25”)
//不加以認(rèn)證也可以這樣寫
//Session?session=Session.getDefaultInstance(props,null)
//如果認(rèn)證傳入null那么它和不使用認(rèn)證調(diào)用方式一樣?
?Session?session=Session.getDefaultInstance(props)
Javax.mail.?Message
經(jīng)過session配置后就可以進(jìn)行發(fā)送消息任務(wù)了。這由Message類來完成。Message實現(xiàn)了Part接口,它表示一個郵件消息,包含一系列的屬性和一個消息內(nèi)容。消息屬性包括了消息址址消息,定義了消息內(nèi)容的結(jié)構(gòu)(包括內(nèi)容類型),消息內(nèi)容使用DataHandler對象包裝實際數(shù)據(jù)。當(dāng)郵件消息位于目錄(folder)中時,系統(tǒng)還使用了一個標(biāo)志位集合來描述它的狀態(tài)。
Message是抽象類,實際使用時必須用一個子類代替以表示具體的郵件格式。比如說javamail?api提供了MimeMessage類,該類擴(kuò)展了Message,實現(xiàn)了RFC822和MIME標(biāo)準(zhǔn)。有兩個構(gòu)造方法:
//一般使用第一種
????Message?msg=new?MimeMessage(Session?session)
Message?msg=new?MimeMessage(MimeMessage?msg)
獲得消息后,就可以設(shè)置消息各個部份了。在設(shè)置之前因為要涉及地址。所以講一下地址類
javax.mail.Address
Address類表示電子郵件類,它是一個抽象類,它的子類InternetAddress提供具體實現(xiàn)且通常可串行化。若創(chuàng)建的地址只包含電子郵件,只要傳遞電子郵件到構(gòu)造器即可如
InternetAddress?addr=new?InternetAddress();
addr.setAddress(“wang@126.com”)
或者是:InterntAddress?addr=new?InternetAddress(“wang@126.com”)
另外,InternetAddress類還提供了地址解析方法如
Address[]?addrs=InternetAddress.parse(“wang@163.com,f@126.com,zuo@126.com”);
地址之后就可以發(fā)送消息了。
//設(shè)置發(fā)送者
Msg.setFrom(new?InternetAddress(“test@126.com”));
//設(shè)置接收者,并還具有解析功能
Msg.setRecipients(Message.RecipientType.To,InternetAddress.parse(“zuolin0806@163.com”));
//抄送的接收者
Msg.setRecipients(Message.RecipientType.CC,InternetAddress.parse(“zuolin0806@163.com”));
//暗送的接收者
Msg.setRecipients(Message.RecipientType.CC,InternetAddress.parse(“zuolin0806@163.com”));
//設(shè)置消息主題
?msg.setSubject(“我的愛”)
//設(shè)置內(nèi)容的基本機(jī)制,其參數(shù)Mime類型
?msg.setContent(“這是我的內(nèi)容”,”text/html;charset=gb2312”)
其中的text/html表示消息內(nèi)容采用的是HTML格式。如果消息格式是(text/plain),而且使用的是MimeMessage,那么setText()方法設(shè)置郵件內(nèi)容的參數(shù)(Mime類型默認(rèn)為text/plain)
//設(shè)置郵件內(nèi)容
msg.setText();
//設(shè)置發(fā)送時間
msg.setSentDate(new?java.util.Date());
最后一步是就是發(fā)送了
javax.mail.Transport
該類也是抽象類,它可通過靜態(tài)方法和實便方法發(fā)送消息。Transport斷承service類。所以它提供了通用方法,如命名傳輸,連接服務(wù)器和監(jiān)聽傳輸事件等。
//默認(rèn)
Transport.send(msg);
最后看一下使用外部郵件服務(wù)器的使用方法。先看程序再講解,注意在使用外部郵件服務(wù)器時一定要有一個類來認(rèn)證。到時在講。
public?class?MySecondMail
{
protected?Session?session?=?null;
//郵件用戶名
????String?mailUser?=?"zuolin0806";
????String?host?=?"smtp.163.com";
????String?pwd?=?"用戶名的密碼";
????public?MySecondMail()
????{
????????init();
????}
????public?void?init()
????{
????????Properties?props?=?new?Properties();
????????props.put("mail.transpost.protocol",?"smtp");
????????props.put("mail.smtp.host",?"smtp.163.com");
????????//必須要有一個類來認(rèn)證
props.put("mail.smtp.auth",?"true");
props.put("mail.smpt.port",?"25")
Email_Autherticatorbean?auth?=??new?Email_Autherticatorbean(mailUser,pwd);
????????//session認(rèn)證
session?=?Session.getInstance(props,auth);
????????//這個是跟蹤后臺消息。打印在控制臺
session.setDebug(true);
???}
????public?static?void?main(String[]?args)
????{
????????new?MySecondMail().sendMails();
????????System.out.println("send?mail?success!");
????}
????public?void?sendMails()
????{
????????try
????????{
????????????Message?msg?=?new?MimeMessage(session);
?????????msg.setFrom(new?InternetAddress("zuolin0806@163.com"));
????????msg.setRecipients(Message.RecipientType.TO,?InternetAddress.parse("javaboy@126.com"));
???????msg.setRecipients(Message.RecipientType.BCC,?InternetAddress.parse("javaboy@126.com"));
??????msg.setSentDate(new?Date());
??????msg.setSubject("this?is?my?Threee?mail");
??????msg.setContent("this?is?my?mail","text/html");
??????msg.setText("我成功了。哈哈");
?????Transport?transport?=?session.getTransport("smtp");
??????與發(fā)送者的郵箱相連
transport.connect(host,mailUser,pwd);
??????transport.send(msg);
????????}
????????catch?(SendFailedException?e)
????????{
????????????e.printStackTrace();
????????}
????????catch?(Exception?ee)
????????{
????????????ee.printStackTrace();
????????}
????}
}
認(rèn)證類必須繼承Authenticator??例子如下:
import?javax.mail.*;
public?class?Email_Autherticatorbean?extends?Authenticator
{
????private?String?m_username?=?null;
????private?String?m_userpass?=?null;
????public?void?setUsername(String?username)
????{
????????m_username?=?username;
????}
????public?void?setUserpass(String?userpass)
????{
????????m_userpass?=?userpass;
????}
????public?Email_Autherticatorbean(String?username,?String?userpass)
????{
????????super();
????????setUsername(username);
????????setUserpass(userpass);
????}
????public?PasswordAuthentication?getPasswordAuthentication()
????{
????????return?new?PasswordAuthentication(m_username,m_userpass);
????}
}
經(jīng)過成功發(fā)送郵件后是不是有點(diǎn)成就感呢!但還有很多疑問比如怎么讀郵件呢?看了下面章節(jié)你就會知道了