javaMail使用

<a οnblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_PQKP_lbC734/Rzune2zIsII/AAAAAAAAAAM/9oK-swpcWmY/s1600-h/javamail.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_PQKP_lbC734/Rzune2zIsII/AAAAAAAAAAM/9oK-swpcWmY/s400/javamail.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5132880348866719874" /></a>
首先javaMail是j2ee的組件,所以只是安裝了java se的系統要下載一下兩個包:
Mail.jar,activation.jar。下載地址
http://xnapster.sourceforge.net/download.html
在eclipse IDE 中引入即可。
Mail包是mail的基本功能,例如收發文本內容的郵件。activation包含一些企業級的
功能,例如添加附件。
首先介紹幾個郵件傳輸協議,雖然說不了解這些協議也可以實用JavaMailAPI,但是我始終認爲,如果不透徹的瞭解一種技術的本質,即使會用了也是照葫蘆畫瓢,換一種模式也許就玩不轉了.

    SMTP: 簡單郵件傳輸協議(Simple Mail Transfer Protocol,SMTP)由RFC821定義,它定義了發送郵件的機制,在JavaMail環境中,基於JavaMail的程序將和因特網服務供應商 ISP(internet Service Provider ’ s)SMTP服務器通信.SMTP服務器會中轉消息給接收方SMTP服務器以便最終讓用戶經由POP或者IMAP獲得.

    POP: 代表郵局協議(Post Office Protocol).目前的版本是3.所以一般都稱之爲POP3.這個協議是由RFC1939定義的.POP是一種機制,因特網上多大數用戶用它得到郵件.它規定每個用戶一個郵箱的支持.使用POP協議的時候,用戶的許多性能並不是由POP協議支持的,如查看幾封新郵件消息這個功能,這些功能內建在如 Eudora或MicrosoftOutlook之類的程序中,它們記住一些事.所以在用JavaMail的時候,如果你想要這些信息,你就必須自己算了.

    IMAP: 是更高級的用戶接收消息的協議,被定義在RFC2060中,IMAP代表因特網消息訪問協議(Internet Message Access Protocol),目前用的版本是4,所以也叫做IMAP4.在用到IMAP的時候,郵件服務器必須支持這個協議,不能僅僅把使用POP的程序用於 IMAP,並指望它支持IMAP所有性能.

    MIME:是因特網郵件擴展標準(Multipurpose Internet Mail Extensions).它不是郵件傳輸協議,但是對於傳輸的內容的消息,附件以及其他的內容定義了格式.可以理解成一個定義合適的標準.

    NNTP:因爲JavaMail將供應商和所有其它的東西分開了,您就能輕鬆添加額外的協議支持.NNTP 就是網絡新聞傳輸協議.

******************************************************
下面的是文檔上的代碼,它基本實現了mail的功能。
 Properties props = new Properties();
    props.put("mail.smtp.host", "stmp.126.com");
    props.put("mail.from", "[email protected]");
    Session session = Session.getInstance(props, null);

    try {
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom();
        msg.setRecipients(Message.RecipientType.TO,
                          "[email protected]");
        msg.setSubject("JavaMail hello world example");
        msg.setSentDate(new Date());
        msg.setText("Hello, world!/n");
        Transport.send(msg);
    } catch (MessagingException mex) {
        System.out.println("send failed, exception: " + mex);
    }


*****************************************************************

上面可以看出,javaMail主要運用到以下幾個類:
Properties
Transport
MIMEMessage
Session
InternetAddress

*************************************************************
下面是詳細解釋

  1,獲取系統Properties.

Properties props = System.getProperties();

2,將您的SMTP服務器名添加到mail.smtp.host關鍵字的屬性中.

Props.pout( “ mail.smtp.host ” ,host);

3,獲取基於Properties Session對象.

Session session = Session.getDefaultInstance(props,null);

4,從Session創建一個MimeMessage.

MimeMessage message = new MimeMessage(session);

5,設置消息from域.

Message.setForm(new InternetAddress(from));

6,設置to域.

Message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));

7,設置消息主題.

message.setSubject( “ HelloJavaMail ” );

8,設置消息內容.

Message.setText( “ Welcome to JavaMail ” );

9發送消息.

Transport.send(message);

10,在編譯用運的時候傳遞MSTP服務器,from地址,to地址.

    通過簡單的接觸了JavaMail相信大家多郵件發送也有了簡單的瞭解和認識,下面我主要研究一下它的具體功能,也就是說具體的接口或類的含義.

    Session 類定義了一個基本的郵件會話,所有的其他類都是由這個session才得意生效的,Session對象用java.util.Properties對象獲取信息,如郵件服務器,用戶名,密碼及整個應用程序中共享的其他信息.類的構造器是此有的,private.它能用getDefaultInstance ()方法來共享.獲取Session對象的方方法如下:

Properties props = new Properties();

Session session = Session.getDefaultInstance(props,null);

Null參數都是Authenticator對象,在這裏沒有使用.

對於大多數情況,共享的session已經足夠用了.

    Message 消息類,在獲得了Session對象後,就可以繼續創建要發送的消息.因爲Message是個抽象類,您必須用一個子類,多數情況下爲 java.mail.internet.MimeMessage.這個能理解成MIME類型和頭的電子郵件消息.正如不同的RFC中定義的,雖然在某些頭部域非ASCII字符也能被編譯,但是Message頭只能被限制用US-ASCII字符.要創建一個Message請將Session對象傳遞給 MimeMessage的構造器.

MimeMessage message = newMimeMessage(session);

一旦獲得消息,就可以設置各個部分了.最基本的就是setContent()方法,例如/

message.setContent( “ Hello ” , ” text/plain ” );

如果知道在實用MimeMessage,而且消息是純文本格式,就可以用setText()方法,它只需要代表實際內容的參數.(Mime類型缺省爲text/plain)

用setSubject()方法設置subject(主題);

message.setSubject( “ 主題 ” );

    Address地址類,和Message一樣也是一個抽象類,一旦創建了Session和Message並將內容填入消息後,就可以用Address確定信件的地址了,用javax.mail.internet.

InternetAddress類.若創建的地址只包含電子郵件地址,只要傳遞電子郵件地址給構造器就可以了.例如:Address address = new InternetAddress( “ [email protected] ” );

若希望名字挨着電子郵件現實,就可以把它傳遞給構造器,如下:

Address address = new InternetAddress( “ [email protected] ” , ” 我心依舊 ” );

需要爲消息的from 域和to域創建地址對象,除非郵件服務器阻止,沒有什麼能阻止你發送一段看上去是任何人的消息了呵呵.一旦創建address將他們域消息連接方法有兩種,如要要識別發件人的就可以用setFrom()和setReplyTo方法.然後message.setFrom(address);

需要實用多個from地址的就用addFrom()方法.例子如下:

Address[] address = ,.,. ;    message.addFrom(address);

若要識別消息recipient收件人,就要實用addRecipient()方法了.例如:

message.addRecipient(type,address)

    Authenticator 與java.net類一樣,JavaMailAPI也可以利用Authentcator通過用戶名密碼訪問受保護的資源.對於JavaMail來說,這些資源就是郵件服務器,Authentcator類在javax.mail包中.要使用Authenticator,首先創建一個抽象的子類,並從

GetPasswordAuthentication 方法中返回passwordAuthentication實例,創建完成後,您必須向session註冊Authenticator,然後在需要認證的時候會通知它,其實說白了就是把配置的用戶名和密碼返回給調用它的程序.例如:

Properties props = new properties();

Authenticator auth = new MailAuthenticator()//接口聲明,創建自己新類的實例.

Session session = Session.getDefauItInstance(props,auth);

    Transport消息發送傳輸類,這個類用協議指定的語言發送消息,通常是SMTP,它是抽象類,它的工作方式與Session有些類似,盡調用靜態方法send()方法,就OK了.例如:

Transport.send(message);

或者也可以從針對協議的會話中獲取一個特定的實例,傳遞用戶名和密碼.發送消息,然後關閉連接,例如:

message.saveChanges();

transport transport = session.getTreansport( “ smtp ” );//指定的協議

transport.connect(host,username,password);

transport.sendMessage(message,message.getAllRecipients());

transport.close();

如果要觀察傳到郵件服務器上的郵件命令,請用session.setDubug(true)設置調試標誌.

    Store和folder用session獲取消息,與發送消息開始很相似,但是在session得到後,很可能實用用戶名和密碼或實用Authenticator連接到一個Store.類似於Transport,也是一樣要告訴store用什麼協議.例如

Store store = session.getStore( “ pop3 ” );

Store.connect(host,username,password);

連接到Store之後,接下來,獲得一個folder,必須打開它就可以讀取裏邊的消息了.

Folder folder = store.getFolder("INBOX");

folder.open(Folder.READ_ONLY);

Message[] message = folder.getMessages();

POP3唯一可用的文件夾就是INBOX,如果實用IMAP,還可以用其他的文件夾.

當讀到了具體的message以後,就可以用getContent來獲取內容,或者用writeTo()將內容寫入流,getContent()方法只能得到消息內容,而writeTo()的輸出卻包含消息頭.

System.out.println(((MimeMessage)message).getConntent());

一旦讀取完畢郵件,要關閉store和folder的連接.

folder.colse(boolean);

store.colse();

傳遞給folder的close()方法的boolean參數表示是否清楚已刪除的消息從而更新folder.

    上面就是JavaMail郵件操作的基本的常用類,我覺得理解了這幾個類的機制,基本就可以處理一般的郵件操作了. 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章