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