熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java Mail 深入淺出(1)

2013-11-23 19:24:04  來源: Java核心技術 

  我干軟件開發也有一點的年頭了回頭想想也經歷了不少的酸甜苦辣為解決了復雜的問題快樂過也為不分晝夜的加班趕工程郁悶過不過這些都沒能減少我對計算機的熱情我對程序的喜好以前對JavaMail也有一些學習性的認識不過一直沒在實際的項目中應用過直到最近的一個項目需要JavaMail所以我打算認真的學習一下這種技術因為我目前擅長的是Struts而Struts又不具備郵件發送的功能所以我要深刻的學習一下JavaMailAPI所以在我學會了JavaMail的基本操作的同時也將這篇文章獻給大家雖然技術含量不高但是希望能對一些剛剛接觸JavaMail的同道中人有所幫助好了閒話少說進入正題首先介紹幾個郵件傳輸協議雖然說不了解這些協議也可以實用JavaMailAPI但是我始終認為如果不透徹的了解一種技術的本質即使會用了也是照葫蘆畫瓢換一種模式也許就玩不轉了

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

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

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

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

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

  JavaMailAPI可以到 進行下載並將mailjar添加到classpath即可

  JAF框架可以到 進行下載並將activationjar添加到classpath即可

  如果實用JEE就沒由什麼特定非要用基本的JavaMailAPI了JEE的類就能處理了只要確保jeejar文件在classpath中就Ok了

  下面我用一個最簡單的例子還演示第一條消息的發送

  獲取系統Properties

  Properties props = SystemgetProperties();

  將您的SMTP服務器名添加到mailsmtphost關鍵字的屬性中

  Propspout( mailsmtphost host);

  獲取基於Properties Session對象

  Session session = SessiongetDefaultInstance(propsnull);

  從Session創建一個MimeMessage

  MimeMessage message = new MimeMessage(session);

  設置消息from域

  MessagesetForm(new InternetAddress(from));

  設置to域

  MessageaddRecipient(MessageRecipientTypeTOnew InternetAddress(to));

  設置消息主題

  messagesetSubject( HelloJavaMail );

  設置消息內容

  MessagesetText( Welcome to JavaMail );

  發送消息

  Transportsend(message);

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

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

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

  Properties props = new Properties();

  Session session = SessiongetDefaultInstance(propsnull);

  Null參數都是Authenticator對象在這裡沒有使用

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

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

  MimeMessage message = newMimeMessage(session);

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

  messagesetContent( Hello text/plain );

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

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

  messagesetSubject( 主題 );

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

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

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

  Address address = new InternetAddress( 我心依舊 );

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

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

  Address[] address = ;    messageaddFrom(address);

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

  messageaddRecipient(typeaddress)

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

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

  Properties props = new properties();

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

  Session session = SessiongetDefauItInstance(propsauth);

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

  Transportsend(message);

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

  messagesaveChanges();

  transport transport = sessiongetTreansport( smtp );//指定的協議

  nnect(hostusernamepassword);

  transportsendMessage(messagemessagegetAllRecipients());

  transportclose();

  如果要觀察傳到郵件服務器上的郵件命令請用sessionsetDubug(true)設置調試標志

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

  Store store = sessiongetStore( pop );

  nnect(hostusernamepassword);

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

  Folder folder = storegetFolder(INBOX);

  folderopen(FolderREAD_ONLY);

  Message[] message = foldergetMessages();

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

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

  Systemoutprintln(((MimeMessage)message)getConntent());

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

  lse(boolean);

  lse();

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

  上面就是JavaMail郵件操作的基本的常用類我覺得理解了這幾個類的機制基本就可以處理一般的郵件操作了下面是一個我寫的JavaMail實現郵件發送的代碼

  首先是一個Authenticator類的實現:記錄用戶名和密碼:

  import javaxmail*;

  public class MailAuthenticator extends Authenticator

  {

  //******************************

  //由於發送郵件的地方比較多

  //下面統一定義用戶名口令

  //******************************

  public static String HUAWEI_MAIL_USER = ;

  public static String HUAWEI_MAIL_PASSWORD = 密碼;

  public MailAuthenticator()

  {

  }

  protected PasswordAuthentication getPasswordAuthentication()

  {

  return new PasswordAuthentication(HUAWEI_MAIL_USER HUAWEI_MAIL_PASSWORD);

  }

  }

  這個類是發送郵件的類

  package monmail;

  /**

  * 此處插入類型說明

  * 創建日期( ::)

  * @author張宏亮

  */

  import javautil*;

  import javaio*;

  import javaxmail*;

  import javaxmailinternet*;

  import javaxactivation*;

  public class SendMail {

  //要發送Mail地址

  private String mailTo = null;

  //Mail發送的起始地址

  private String mailFrom = null;

  //SMTP主機地址

  private String smtpHost = null;

  //是否采用調試方式

  private boolean debug = false;

  private String messageBasePath = null;

  //Mail主題

  private String subject;

  //Mail內容

  private String msgContent;

  private Vector attachedFileList;

  private String mailAccount = null;

  private String mailPass = null;

  private String messageContentMimeType =text/html; charset=gb;

  private String mailbccTo = null;

  private String mailccTo = null;


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26804.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.