<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>


    <% @page?contentType = " text/html;charset=gb2312 " ?language = " java " ? import = " d7ith.* " %>
    < jsp:usejBean?id = " DataConn " ?scope = " page " ? class = " d7ith.DataConn " />
    <% @page? import = " java.sql.* " %>
    <%
    ??String?oracleDriver?
    = ? " oracle.jdbc.driver.OracleDriver " ;
    ??String?oracleUrl?
    = ? " jdbc:oracle:thin:@10.119.40.94:1521:d7i " ;
    ??String?username?
    = ? " system " ;
    ??String?password?
    = ? " d7i " ;
    ??Connection?conn?
    = ? null ;
    ??ResultSet?rs?
    = ? null ;
    ??
    try {
    ????Class.forName(oracleDriver);
    ????conn?
    = ?DriverManager.getConnection(oracleUrl,username,password);
    ??}
    catch (ClassNotFoundException?ex) {
    ????out.print(
    " 裝載驅動程序錯誤 " );
    ??}
    catch (SQLException?ex) {
    ????out.print(
    " 不能夠連接數據庫 " );
    ??}

    ??String?sql?
    = ? " {call?R5.o7chkpsd(?,?,?)} " ;
    ??CallableStatement?stmt?
    = ?conn.prepareCall(sql);
    ????stmt.setString(
    1 , " R5 " );?? // 輸入參數
    ????stmt.setString( 2 , " 111111 " );
    ????stmt.registerOutParameter(
    3 ,Types.CHAR);? // 輸出參數為結果集參數
    ????stmt.executeQuery();
    ????String?str?
    = ?stmt.getString( 3 );
    ????out.println(
    " 第二個參數為: " + str);
    %>
    posted @ 2006-09-12 13:55 重歸本壘(Bing) 閱讀(866) | 評論 (2)編輯 收藏
     

    摘要:

    JavaMail API是讀取、撰寫、發送電子信息的可選包。我們可用它來建立如Eudora、Foxmail、MS Outlook Express一般的郵件用戶代理程序(Mail User Agent,簡稱MUA)。讓我們看看JavaMail API是如何提供信息訪問功能的吧!JavaMail API被設計用于以不依賴協議的方式去發送和接收電子信息,文中著重:如何以不依賴于協議的方式發送接收電子信息,這也是本文所要描述的.

    版權聲明:本文可以自由轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
    作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig)
    原文:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html
    關鍵字:java,mail,pop,smtp

    一、JavaMail API簡介
    JavaMail API是讀取、撰寫、發送電子信息的可選包。我們可用它來建立如Eudora、Foxmail、MS Outlook Express一般的郵件用戶代理程序(Mail User Agent,簡稱MUA)。而不是像sendmail或者其它的郵件傳輸代理(Mail Transfer Agent,簡稱MTA)程序那樣可以傳送、遞送、轉發郵件。從另外一個角度來看,我們這些電子郵件用戶日常用MUA程序來讀寫郵件,而MUA依賴著MTA處理郵件的遞送。
    在清楚了到MUA與MTA之間的關系后,讓我們看看JavaMail API是如何提供信息訪問功能的吧!JavaMail API被設計用于以不依賴協議的方式去發送和接收電子信息,這個API被分為兩大部分:

    基本功能:如何以不依賴于協議的方式發送接收電子信息,這也是本文所要描述的,不過在下文中,大家將看到這只是一廂情愿而已。
    第二個部分則是依賴特定協議的,比如SMTP、POP、IMAP、NNTP協議。在這部分的JavaMail API是為了和服務器通訊,并不在本文的內容中。

    二、相關協議一覽
    在我們步入JavaMail API之前,先看一下API所涉及的協議。以下便是大家日常所知、所樂于使用的4大信息傳輸協議:
    SMTP
    POP
    IMAP
    MIME
    當然,上面的4個協議,并不是全部,還有NNTP和其它一些協議可用于傳輸信息,但是由于不常用到,所以本文便不提及了。理解這4個基本的協議有助于我們更好的使用JavaMail API。然而JavaMail API是被設計為與協議無關的,目前我們并不能克服這些協議的束縛。確切的說,如果我們使用的功能并不被我們選擇的協議支持,那么JavaMail API并不可能如魔術師一樣神奇的賦予我們這種能力。

    1.SMTP
    簡單郵件傳輸協議定義了遞送郵件的機制。在下文中,我們將使用基于Java-Mail的程序與公司或者ISP的SMTP服務器進行通訊。這個SMTP服務器將郵件轉發到接收者的SMTP服務器,直至最后被接收者通過POP或者IMAP協議獲取。這并不需要SMTP服務器使用支持授權的郵件轉發,但是卻的確要注意SMTP服務器的正確設置(SMTP服務器的設置與JavaMail API無關)。

    2.POP
    POP是一種郵局協議,目前為第3個版本,即眾所周知的POP3。POP定義了一種用戶如何獲得郵件的機制。它規定了每個用戶使用一個單獨的郵箱。大多數人在使用POP時所熟悉的功能并非都被支持,例如查看郵箱中的新郵件數量。而這個功能是微軟的Outlook內建的,那么就說明微軟Outlook之類的郵件客戶端軟件是通過查詢最近收到的郵件來計算新郵件的數量來實現前面所說的功能。因此在我們使用JavaMail API時需要注意,當需要獲得如前面所講的新郵件數量之類的信息時,我們不得不自己進行計算。

    3.IMAP
    IMAP使用在接收信息的高級協議,目前版本為第4版,所以也被稱為IMAP4。需要注意的是在使用IMAP時,郵件服務器必須支持該協議。從這個方面講,我們并不能完全使用IMAP來替代POP,不能期待IMAP在任何地方都被支持。假如郵件服務器支持IMAP,那么我們的郵件程序將能夠具有以下被IMAP所支持的特性:每個用戶在服務器上可具有多個目錄,這些目錄能在多個用戶之間共享。
    其與POP相比高級之處顯而易見,但是在嘗試采取IMAP時,我們認識到它并不是十分完美的:由于IMAP需要從其它服務器上接收新信息,將這些信息遞送給用戶,維護每個用戶的多個目錄,這都為郵件服務器帶來了高負載。并且IMAP與POP的一個不同之處是POP用戶在接收郵件時將從郵件服務器上下載郵件,而IMAP允許用戶直接訪問郵件目錄,所以在郵件服務器進行備份作業時,由于每個長期使用此郵件系統的用戶所用的郵件目錄會占有很大的空間,這將直接導致郵件服務器上磁盤空間暴漲。

    4.MIME
    MIME并不是用于傳送郵件的協議,它作為多用途郵件的擴展定義了郵件內容的格式:信息格式、附件格式等等。一些RFC標準都涉及了MIME:RFC 822, RFC 2045, RFC 2046, RFC 2047,有興趣的Matrixer可以閱讀一下。而作為JavaMail API的開發者,我們并不需關心這些格式定義,但是這些格式被用在了程序中。

    5.NNTP和其它的第三方協議
    正因為JavaMail API在設計時考慮到與第三方協議實現提供商之間的分離,故我們可以很容易的添加一些第三方協議。SUN維護著一個第三方協議實現提供商的列表:http://java.sun.com/products/javamail/Third_Party.html,通過此列表我們可以找到所需要的而又不被SUN提供支持的第三方協議:比如NNTP這個新聞組協議和S/MIME這個安全的MIME協議。

    三、安裝
    1.安裝JavaMail
    為了使用JavaMail API,需要從http://java.sun.com/products/javamail/downloads/index.html下載文件名格式為javamail-[version].zip的文件(這個文件中包括了JavaMail實現),并將其中的mail.jar文件添加到CLASSPATH中。這個實現提供了對SMTP、IMAP4、POP3的支持。
    注意:在安裝JavaMail實現之后,我們將在demo目錄中發現許多有趣的簡單實例程序。
    在安裝了JavaMail之后,我們還需要安裝JavaBeans Activation Framework,因為這個框架是JavaMail API所需要的。如果我們使用J2EE的話,那么我們并無需單獨下載JavaMail,因為它存在于J2EE.jar中,只需將J2EE.jar加入到CLASSPATH即可。

    2.安裝JavaBeans Activation Framework
    http://java.sun.com/products/javabeans/glasgow/jaf.html下載JavaBeans Activation Framework,并將其添加到CLASSPATH中。此框架增加了對任何數據塊的分類、以及對它們的處理的特性。這些特性是JavaMail API需要的。雖然聽起來這些特性非常模糊,但是它對于我們的JavaMail API來說只是提供了基本的MIME類型支持。
    到此為止,我們應當把mail.jar和activation.jar都添加到了CLASSPATH中。
    當然如果從方便的角度講,直接把這兩個Jar文件復制到JRE目錄的lib/ext目錄中也可以。

    四、初次認識JavaMail API
    1.了解我們的JavaMail環境
    A.縱覽JavaMail核心類結構
    打開JavaMail.jar文件,我們將發現在javax.mail的包下面存在著一些核心類:Session、Message、Address、Authenticator、Transport、Store、Folder。而且在javax.mail.internet包中還有一些常用的子類。
    B.Session
    Session類定義了基本的郵件會話。就像Http會話那樣,我們進行收發郵件的工作都是基于這個會話的。Session對象利用了java.util.Properties對象獲得了郵件服務器、用戶名、密碼信息和整個應用程序都要使用到的共享信息。
    Session類的構造方法是私有的,所以我們可以使用Session類提供的getDefaultInstance()這個靜態工廠方法獲得一個默認的Session對象:

    Properties props = new Properties();
    // fill props with any information
    Session session = Session.getDefaultInstance(props, null);

    或者使用getInstance()這個靜態工廠方法獲得自定義的Session:

    Properties props = new Properties();
    // fill props with any information
    Session session = Session.getInstance(props, null);

    從上面的兩個例子中不難發現,getDefaultInstance()和getInstance()方法的第二個參數都是null,這是因為在上面的例子中并沒有使用到郵件授權,下文中將對授權進行詳細介紹。
    從很多的實例看,在對mail server進行訪問的過程中使用共享的Session是足夠的,即使是工作在多個用戶郵箱的模式下也不例外。

    C.Message
    當我們建立了Session對象后,便可以被發送的構造信息體了。在這里SUN提供了Message類型來幫助開發者完成這項工作。由于Message是一個抽象類,大多數情況下,我們使用javax.mail.internet.MimeMessage這個子類,該類是使用MIME類型、MIME信息頭的郵箱信息。信息頭只能使用US-ASCII字符,而非ASCII字符將通過編碼轉換為ASCII的方式使用。
    為了建立一個MimeMessage對象,我們必須將Session對象作為MimeMessage構造方法的參數傳入:

    MimeMessage message = new MimeMessage(session);

    注意:對于MimeMessage類來講存在著多種構造方法,比如使用輸入流作為參數的構造方法。

    在建立了MimeMessage對象后,我們需要設置它的各個part,對于MimeMessage類來說,這些part就是MimePart接口。最基本的設置信息內容的方法就是通過表示信息內容和米么類型的參數調用setContent()方法:

    message.setContent("Hello", "text/plain");

    然而,如果我們所使用的MimeMessage中信息內容是文本的話,我們便可以直接使用setText()方法來方便的設置文本內容。

    message.setText("Hello");

    前面所講的兩種方法,對于文本信息,后者更為合適。而對于其它的一些信息類型,比如HTML信息,則要使用前者。
    別忘記了,使用setSubject()方法對郵件設置郵件主題:

    message.setSubject("First");


    D.Address
    到這里,我們已經建立了Session和Message,下面將介紹如何使用郵件地址類:Address。像Message一樣,Address類也是一個抽象類,所以我們將使用javax.mail.internet.InternetAddress這個子類。
    通過傳入代表郵件地址的字符串,我們可以建立一個郵件地址類:

    Address address = new InternetAddress("president@whitehouse.gov");

    如果要在郵件地址后面增加名字的話,可以通過傳遞兩個參數:代表郵件地址和名字的字符串來建立一個具有郵件地址和名字的郵件地址類:

    Address address = new InternetAddress("president@whitehouse.gov", "George Bush");

    本文在這里所講的郵件地址類是為了設置郵件信息的發信人和收信人而準備的,在建立了郵件地址類后,我們通過message的setFrom()和setReplyTo()兩種方法設置郵件的發信人:

    message.setFrom(address);
    message.setReplyTo(address);

    若在郵件中存在多個發信人地址,我們可用addForm()方法增加發信人:

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

    為了設置收信人,我們使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量來區分收信人的類型:

    message.addRecipient(type, address)

    下面是Message.RecipientType的三個常量:
    Message.RecipientType.TO
    Message.RecipientType.CC
    Message.RecipientType.BCC
    因此,如果我們要發送郵件給總統,并發用一個副本給第一夫人的話,下面的方法將被用到:

    Address toAddress = new InternetAddress("vice.president@whitehouse.gov");
    Address ccAddress = new InternetAddress("first.lady@whitehouse.gov");
    message.addRecipient(Message.RecipientType.TO, toAddress);
    message.addRecipient(Message.RecipientType.CC, ccAddress);

    JavaMail API并沒有提供檢查郵件地址有效性的機制。當然我們可以自己完成這個功能:驗證郵件地址的字符是否按照RFC822規定的格式書寫或者通過DNS服務器上的MX記錄驗證等。

    E.Authenticator
    像java.net類那樣,JavaMail API通過使用授權者類(Authenticator)以用戶名、密碼的方式訪問那些受到保護的資源,在這里“資源”就是指郵件服務器。在javax.mail包中可以找到這個JavaMail的授權者類(Authenticator)。
    在使用Authenticator這個抽象類時,我們必須采用繼承該抽象類的方式,并且該繼承類必須具有返回PasswordAuthentication對象(用于存儲認證時要用到的用戶名、密碼)getPasswordAuthentication()方法。并且要在Session中進行注冊,使Session能夠了解在認證時該使用哪個類。
    下面代碼片斷中的MyAuthenticator就是一個Authenticator的子類。

    Properties props = new Properties();
    // fill props with any information
    Authenticator auth = new MyAuthenticator();
    Session session = Session.getDefaultInstance(props, auth);


    F.Transport
    在發送信息時,Transport類將被用到。這個類實現了發送信息的協議(通稱為SMTP),此類是一個抽象類,我們可以使用這個類的靜態方法send()來發送消息:

    Transport.send(message);

    當然,方法是多樣的。我們也可由Session獲得相應協議對應的Transport實例。并通過傳遞用戶名、密碼、郵件服務器主機名等參數建立與郵件服務器的連接,并使用sendMessage()方法將信息發送,最后關閉連接:

    message.saveChanges(); // implicit with send()
    Transport transport = session.getTransport("smtp");
    transport.connect(host, username, password);
    transport.sendMessage(message, message.getAllRecipients());
    transport.close();

    評論:上面的方法是一個很好的方法,尤其是在我們在同一個郵件服務器上發送多個郵件時。因為這時我們將在連接郵件服務器后連續發送郵件,然后再關閉掉連接。send()這個基本的方法是在每次調用時進行與郵件服務器的連接的,對于在同一個郵件服務器上發送多個郵件來講可謂低效的方式。
    注意:如果需要在發送郵件過程中監控mail命令的話,可以在發送前設置debug標志:

    session.setDebug(true)。


    G.Store和Folder
    接收郵件和發送郵件很類似都要用到Session。但是在獲得Session后,我們需要從Session中獲取特定類型的Store,然后連接到Store,這里的Store代表了存儲郵件的郵件服務器。在連接Store的過程中,極有可能需要用到用戶名、密碼或者Authenticator。

    // Store store = session.getStore("imap");
    Store store = session.getStore("pop3");
    store.connect(host, username, password);

    在連接到Store后,一個Folder對象即目錄對象將通過Store的getFolder()方法被返回,我們可從這個Folder中讀取郵件信息:

    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_ONLY);
    Message message[] = folder.getMessages();

    上面的例子首先從Store中獲得INBOX這個Folder(對于POP3協議只有一個名為INBOX的Folder有效),然后以只讀(Folder.READ_ONLY)的方式打開Folder,最后調用Folder的getMessages()方法得到目錄中所有Message的數組。

    注意:對于POP3協議只有一個名為INBOX的Folder有效,而對于IMAP協議,我們可以訪問多個Folder(想想前面講的IMAP協議)。而且SUN在設計Folder的getMessages()方法時采取了很智能的方式:首先接收新郵件列表,然后再需要的時候(比如讀取郵件內容)才從郵件服務器讀取郵件內容。
    在讀取郵件時,我們可以用Message類的getContent()方法接收郵件或是writeTo()方法將郵件保存,getContent()方法只接收郵件內容(不包含郵件頭),而writeTo()方法將包括郵件頭。

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

    在讀取郵件內容后,別忘記了關閉Folder和Store。

    folder.close(aBoolean);
    store.close();

    傳遞給Folder.close()方法的boolean 類型參數表示是否在刪除操作郵件后更新Folder。

    H.繼續向前進!
    在講解了以上的七個Java Mail核心類定義和理解了簡單的代碼片斷后,下文將詳細講解怎樣使用這些類實現JavaMail API所要完成的高級功能。

    五、使用JavaMail API
    在明確了JavaMail API的核心部分如何工作后,本人將帶領大家學習一些使用Java Mail API任務案例。
    1.發送郵件
    在獲得了Session后,建立并填入郵件信息,然后發送它到郵件服務器。這便是使用Java Mail API發送郵件的過程,在發送郵件之前,我們需要設置SMTP服務器:通過設置Properties的mail.smtp.host屬性。

    String host = ...;
    String from = ...;
    String to = ...;

    // Get system properties
    Properties props = System.getProperties();

    // Setup mail server
    props.put("mail.smtp.host", host);

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

    // Define message
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO,
    ??new InternetAddress(to));
    message.setSubject("Hello JavaMail");
    message.setText("Welcome to JavaMail");
    // Send message
    Transport.send(message);

    由于建立郵件信息和發送郵件的過程中可能會拋出異常,所以我們需要將上面的代碼放入到try-catch結構塊中。

    2.接收郵件
    為了在讀取郵件,我們獲得了session,并且連接到了郵箱的相應store,打開相應的Folder,然后得到我們想要的郵件,當然別忘記了在結束時關閉連接。

    String host = ...;
    String username = ...;
    String password = ...;

    // Create empty properties
    Properties props = new Properties();

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

    // Get the store
    Store store = session.getStore("pop3");
    store.connect(host, username, password);

    // Get folder
    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_ONLY);

    // Get directory
    Message message[] = folder.getMessages();

    for (int i=0, n=message.length; i<n; i++) {
    ?? System.out.println(i + ": " + message[i].getFrom()[0]
    ???? + "\t" + message[i].getSubject());
    }

    // Close connection
    folder.close(false);
    store.close();

    上面的代碼所作的是從郵箱中讀取每個郵件,并且顯示郵件的發信人地址和主題。從技術角度講,這里存在著一個異常的可能:當發信人地址為空時,getFrom()[0]將拋出異常。

    下面的代碼片斷有效的說明了如何讀取郵件內容,在顯示每個郵件發信人和主題后,將出現用戶提示從而得到用戶是否讀取該郵件的確認,如果輸入YES的話,我們可用Message.writeTo(java.io.OutputStream os)方法將郵件內容輸出到控制臺上,關于Message.writeTo()的具體用法請看JavaMail API。

    BufferedReader reader = new BufferedReader (
    ??new InputStreamReader(System.in));

    // Get directory
    Message message[] = folder.getMessages();
    for (int i=0, n=message.length; i<n; i++) {
    ??System.out.println(i + ": " + message[i].getFrom()[0]
    ????+ "\t" + message[i].getSubject());

    ??System.out.println("Do you want to read message? " +
    ????"[YES to read/QUIT to end]");
    ??String line = reader.readLine();
    ??if ("YES".equals(line)) {
    ????message[i].writeTo(System.out);
    ??} else if ("QUIT".equals(line)) {
    ????break;
    ??}
    }


    3.刪除郵件和標志
    設置與message相關的Flags是刪除郵件的常用方法。這些Flags表示了一些系統定義和用戶定義的不同狀態。在Flags類的內部類Flag中預定義了一些標志:
    Flags.Flag.ANSWERED
    Flags.Flag.DELETED
    Flags.Flag.DRAFT
    Flags.Flag.FLAGGED
    Flags.Flag.RECENT
    Flags.Flag.SEEN
    Flags.Flag.USER
    但需要在使用時注意的:標志存在并非意味著這個標志被所有的郵件服務器所支持。例如,對于刪除郵件的操作,POP協議不支持上面的任何一個。所以要確定哪些標志是被支持的——通過訪問一個已經打開的Folder對象的getPermanetFlags()方法,它將返回當前被支持的Flags類對象。
    刪除郵件時,我們可以設置郵件的DELETED標志:

    message.setFlag(Flags.Flag.DELETED, true);

    但是首先要采用READ_WRITE的方式打開Folder:

    folder.open(Folder.READ_WRITE);

    在對郵件進行刪除操作后關閉Folder時,需要傳遞一個true作為對刪除郵件的擦除確認。

    folder.close(true);

    Folder類中另一種用于刪除郵件的方法expunge()也同樣可刪除郵件,但是它并不為sun提供的POP3實現支持,而其它第三方提供的POP3實現支持或者并不支持這種方法。
    另外,介紹一種檢查某個標志是否被設置的方法:Message.isSet(Flags.Flag flag)方法,其中參數為被檢查的標志。

    4.郵件認證
    我們在前面已經學會了如何使用Authenticator類來代替直接使用用戶名和密碼這兩字符串作為Session.getDefaultInstance()或者Session.getInstance()方法的參數。在前面的小試牛刀后,現在我們將了解到全面認識一下郵件認證。
    我們在此取代了直接使用郵件服務器主機名、用戶名、密碼這三個字符串作為連接到POP3 Store的方式,使用存儲了郵件服務器主機名信息的屬性文件,并在獲得Session時傳入自定義的Authenticator實例:

    // Setup properties
    Properties props = System.getProperties();
    props.put("mail.pop3.host", host);

    // Setup authentication, get session
    Authenticator auth = new PopupAuthenticator();
    Session session = Session.getDefaultInstance(props, auth);

    // Get the store
    Store store = session.getStore("pop3");
    store.connect();


    PopupAuthenticator類繼承了抽象類Authenticator,并且通過重載Authenticator類的getPasswordAuthentication()方法返回PasswordAuthentication類對象。而getPasswordAuthentication()方法的參數param是以逗號分割的用戶名、密碼組成的字符串。

    import javax.mail.*;
    import java.util.*;

    public class PopupAuthenticator extends Authenticator {

    ??public PasswordAuthentication getPasswordAuthentication(String param) {
    ????String username, password;

    ????StringTokenizer st = new StringTokenizer(param, ",");
    ????username = st.nextToken();
    ????password = st.nextToken();

    ????return new PasswordAuthentication(username, password);
    ??}

    }


    5.回復郵件
    回復郵件的方法很簡單:使用Message類的reply()方法,通過配置回復郵件的收件人地址和主題(如果沒有提供主題的話,系統將默認將“Re:”作為郵件的主體),這里不需要設置任何的郵件內容,只要復制發信人或者reply-to到新的收件人。而reply()方法中的boolean參數表示是否將郵件回復給發送者(參數值為false),或是恢復給所有人(參數值為true)。
    補充一下,reply-to地址需要在發信時使用setReplyTo()方法設置。

    MimeMessage reply = (MimeMessage)message.reply(false);
    reply.setFrom(new InternetAddress("president@whitehouse.gov"));
    reply.setText("Thanks");
    Transport.send(reply);


    6.轉發郵件
    轉發郵件的過程不如前面的回復郵件那樣簡單,它將建立一個轉發郵件,這并非一個方法就能做到。
    每個郵件是由多個部分組成,每個部分稱為一個郵件體部分,是一個BodyPart類對象,對于MIME類型郵件來講就是MimeBodyPart類對象。這些郵件體包含在成為Multipart的容器中對于MIME類型郵件來講就是MimeMultiPart類對象。在轉發郵件時,我們建立一個文字郵件體部分和一個被轉發的文字郵件體部分,然后將這兩個郵件體放到一個Multipart中。說明一下,復制一個郵件內容到另一個郵件的方法是僅復制它的DataHandler(數據處理者)即可。這是由JavaBeans Activation Framework定義的一個類,它提供了對郵件內容的操作命令的訪問、管理了郵件內容操作,是不同的數據源和數據格式之間的一致性接口。

    // Create the message to forward
    Message forward = new MimeMessage(session);

    // Fill in header
    forward.setSubject("Fwd: " + message.getSubject());
    forward.setFrom(new InternetAddress(from));
    forward.addRecipient(Message.RecipientType.TO,
    ??new InternetAddress(to));

    // Create your new message part
    BodyPart messageBodyPart = new MimeBodyPart();
    messageBodyPart.setText(
    ??"Here you go with the original message:\n\n");

    // Create a multi-part to combine the parts
    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    // Create and fill part for the forwarded content
    messageBodyPart = new MimeBodyPart();
    messageBodyPart.setDataHandler(message.getDataHandler());

    // Add part to multi part
    multipart.addBodyPart(messageBodyPart);

    // Associate multi-part with message
    forward.setContent(multipart);

    // Send message
    Transport.send(forward);


    7.使用附件
    附件作為與郵件相關的資源經常以文本、表格、圖片等格式出現,如流行的郵件客戶端一樣,我們可以用JavaMail API從郵件中獲取附件或是發送帶有附件的郵件。

    A.發送帶有附件的郵件
    發送帶有附件的郵件的過程有些類似轉發郵件,我們需要建立一個完整郵件的各個郵件體部分,在第一個部分(即我們的郵件內容文字)后,增加一個具有DataHandler的附件而不是在轉發郵件時那樣復制第一個部分的DataHandler。

    如果我們將文件作為附件發送,那么要建立FileDataSource類型的對象作為附件數據源;如果從URL讀取數據作為附件發送,那么將要建立URLDataSource類型的對象作為附件數據源。

    然后將這個數據源(FileDataSource或是URLDataSource)對象作為DataHandler類構造方法的參數傳入,從而建立一個DataHandler對象作為數據源的DataHandler。

    接著將這個DataHandler設置為郵件體部分的DataHandler。這樣就完成了郵件體與附件之間的關聯工作,下面的工作就是BodyPart的setFileName()方法設置附件名為原文件名。

    最后將兩個郵件體放入到Multipart中,設置郵件內容為這個容器Multipart,發送郵件。

    // Define message
    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO,
    ??new InternetAddress(to));
    message.setSubject("Hello JavaMail Attachment");

    // Create the message part
    BodyPart messageBodyPart = new MimeBodyPart();

    // Fill the message
    messageBodyPart.setText("Pardon Ideas");

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    // Part two is attachment
    messageBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource(filename);
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(filename);
    multipart.addBodyPart(messageBodyPart);

    // Put parts in message
    message.setContent(multipart);

    // Send the message
    Transport.send(message);

    如果我們使用servlet實現發送帶有附件的郵件,則必須上傳附件給servlet,這時需要注意提交頁面form中對編碼類型的設置應為multipart/form-data。

    <FORM ENCTYPE="multipart/form-data"
    ????method=post action="/myservlet">
    ??<INPUT TYPE="file" NAME="thefile">
    ??<INPUT TYPE="submit" VALUE="Upload">
    </FORM>


    B.讀取郵件中的附件
    讀取郵件中的附件的過程要比發送它的過程復雜一點。因為帶有附件的郵件是多部分組成的,我們必須處理每一個部分獲得郵件的內容和附件。
    但是如何辨別郵件信息內容和附件呢?Sun在Part類(BodyPart類實現的接口類)中提供了getDisposition()方法讓開發者獲得郵件體部分的部署類型,當該部分是附件時,其返回之將是Part.ATTACHMENT。但附件也可以沒有部署類型的方式存在或者部署類型為Part.INLINE,無論部署類型為Part.ATTACHMENT還是Part.INLINE,我們都能把該郵件體部分導出保存。

    Multipart mp = (Multipart)message.getContent();

    for (int i=0, n=multipart.getCount(); i<n; i++) {
    ??Part part = multipart.getBodyPart(i));

    ??String disposition = part.getDisposition();

    ??if ((disposition != null) &&
    ??????((disposition.equals(Part.ATTACHMENT) ||
    ?????? (disposition.equals(Part.INLINE))) {
    ????saveFile(part.getFileName(), part.getInputStream());
    ??}
    }

    下列代碼中使用了saveFile方法是自定義的方法,它根據附件的文件名建立一個文件,如果本地磁盤上存在名為附件的文件,那么將在文件名后增加數字表示區別。然后從郵件體中讀取數據寫入到本地文件中(代碼省略)。

    // from saveFile()
    File file = new File(filename);
    for (int i=0; file.exists(); i++) {
    ??file = new File(filename+i);
    }

    以上是郵件體部分被正確設置的簡單例子,如果郵件體部分的部署類型為null,那么我們通過獲得郵件體部分的MIME類型來判斷其類型作相應的處理,代碼結構框架如下:

    if (disposition == null) {
    ??// Check if plain
    ??MimeBodyPart mbp = (MimeBodyPart)part;
    ??if (mbp.isMimeType("text/plain")) {
    ????// Handle plain
    ??} else {
    ????// Special non-attachment cases here of
    ????// image/gif, text/html, ...
    ??}
    ...
    }


    8.處理HTML郵件
    前面的例子中發送的郵件都是以文本為內容的(除了附件),下面將介紹如何接收和發送基于HTML的郵件。
    A.發送HTML郵件
    假如我們需要發送一個HTML文件作為郵件內容,并使郵件客戶端在讀取郵件時獲取相關的圖片或者文字的話,只要設置郵件內容為html代碼,并設置內容類型為text/html即可:

    String htmlText = "<H1>Hello</H1>" +
    ??"<img src=\"http://www.jguru.com/images/logo.gif\">";
    message.setContent(htmlText, "text/html"));

    請注意:這里的圖片并不是在郵件中內嵌的,而是在URL中定義的。郵件接收者只有在線時才能看到。
    在接收郵件時,如果我們使用JavaMail API接收郵件的話是無法實現以HTML方式顯示郵件內容的。因為JavaMail API郵件內容視為二進制流。所以要顯示HTML內容的郵件,我們必須使用JEditorPane或者第三方HTML展現組件。

    以下代碼顯示了如何使用JEditorPane顯示郵件內容:

    if (message.getContentType().equals("text/html")) {
    ??String content = (String)message.getContent();
    ??JFrame frame = new JFrame();
    ??JEditorPane text = new JEditorPane("text/html", content);
    ??text.setEditable(false);
    ??JScrollPane pane = new JScrollPane(text);
    ??frame.getContentPane().add(pane);
    ??frame.setSize(300, 300);
    ??frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    ??frame.show();
    }


    B.在郵件中包含圖片
    如果我們在郵件中使用HTML作為內容,那么最好將HTML中使用的圖片作為郵件的一部分,這樣無論是否在線都會正確的顯示HTML中的圖片。處理方法就是將HTML中用到的圖片作為郵件附件并使用特殊的cid URL作為圖片的引用,這個cid就是對圖片附件的Content-ID頭的引用。
    處理內嵌圖片就像向郵件中添加附件一樣,不同之處在于我們必須通過設置圖片附件所在的郵件體部分的header中Content-ID為一個隨機字符串,并在HTML中img的src標記中設置為該字符串。這樣就完成了圖片附件與HTML的關聯。

    String file = ...;

    // Create the message
    Message message = new MimeMessage(session);

    // Fill its headers
    message.setSubject("Embedded Image");
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO,
    ??new InternetAddress(to));

    // Create your new message part
    BodyPart messageBodyPart = new MimeBodyPart();
    String htmlText = "<H1>Hello</H1>" +
    ??"<img src=\"cid:memememe\">";
    messageBodyPart.setContent(htmlText, "text/html");

    // Create a related multi-part to combine the parts
    MimeMultipart multipart = new MimeMultipart("related");
    multipart.addBodyPart(messageBodyPart);

    // Create part for the image
    messageBodyPart = new MimeBodyPart();

    // Fetch the image and associate to part
    DataSource fds = new FileDataSource(file);
    messageBodyPart.setDataHandler(new DataHandler(fds));
    messageBodyPart.setHeader("Content-ID","<memememe>");

    // Add part to multi-part
    multipart.addBodyPart(messageBodyPart);

    // Associate multi-part with message
    message.setContent(multipart);


    9.在郵件中搜索短語
    JavaMail API提供了過濾器機制,它被用來建立搜索短語。這個短語由javax.mail.search包中的SearchTerm抽象類來定義,在定義后我們便可以使用Folder的Search()方法在Folder中查找郵件:

    SearchTerm st = ...;
    Message[] msgs = folder.search(st);

    下面有22個不同的類(繼承了SearchTerm類)供我們使用:
    AND terms (class AndTerm)
    OR terms (class OrTerm)
    NOT terms (class NotTerm)
    SENT DATE terms (class SentDateTerm)
    CONTENT terms (class BodyTerm)
    HEADER terms (FromTerm / FromStringTerm, RecipientTerm / RecipientStringTerm, SubjectTerm, etc.)
    使用這些類定義的斷語集合,我們可以構造一個邏輯表達式,并在Folder中進行搜索。下面是一個實例:在Folder中搜索郵件主題含有“ADV”字符串或者發信人地址為friend@public.com的郵件。

    SearchTerm st =
    ??new OrTerm(
    ????new SubjectTerm("ADV:"),
    ????new FromStringTerm("friend@public.com"));
    Message[] msgs = folder.search(st);


    六、參考資源
    JavaMail API Home
    Sun’s JavaMail API基礎
    JavaBeans Activation Framework Home
    javamail-interest mailing list
    Sun's JavaMail FAQ
    jGuru's JavaMail FAQ
    Third Party Products List

    七、代碼下載
    http://java.sun.com/developer/onlineTraining/JavaMail/exercises.html
    posted @ 2006-07-20 09:24 重歸本壘(Bing) 閱讀(337) | 評論 (0)編輯 收藏
     

    不斷學習,增強知道儲備
    利用 平時的時間鉆研業務,學習英語,多讀一些書籍、文章。對于電子版的資料,不要以為保存在硬盤就等于記住了。要多看,多實踐,多做筆記。建議用自己的博客記錄成長的軌跡。

    充分利用8小時內的時間

    不要在上班時間看笑話,發笑話。除非有明確的目的,否則不要上網。為每天的工作制定計劃。

    采用高效的溝通方式
    發行量少用電子郵件和即時通迅工具,盡量當面溝通,或通過電話。除非你和對方的英語都非常熟練,否則請盡量用漢語寫郵件。郵件只發送和抄送給必要的人。回復郵件時不要輕易使用“全部回復”。

    分享時間
    把你的經驗、成果與別人分享。去幫助別人,你會得到更多的朋友,更多的尊重和更多的知識,你會沒有任何損失。當你遇到困難,主動尋求幫助,不要因為你一個人耽誤整個團隊的進行。
    
    程序員不是代碼藍領,程序員是創造力,想像力和代名詞。多點時間追求愛好,陶冶情操,鍛煉身體,享受生活,讓我們自豪的宣布“讓我們程序員成為正常人,讓程序員成為藝術家”。

    posted @ 2006-07-06 09:19 重歸本壘(Bing) 閱讀(534) | 評論 (0)編輯 收藏
     

    tomcat服務器:
    在應用web的web-inf下面的web.xml中定義用戶角色及其可以訪問的頁面。

    ?? < security-constraint >
    ????
    < web-resource-collection >
    ??????
    < web-resource-name > admin </ web-resource-name >
    ??????
    < url-pattern > /ch12/admin/* </ url-pattern >
    ??????
    < url-pattern > /ch12/search/delete.jsp </ url-pattern >
    ????
    </ web-resource-collection >
    ????
    < auth-constraint >
    ??????
    < role-name > admin </ role-name >
    ????
    </ auth-constraint >
    ??
    </ security-constraint >

    ??
    < security-constraint >
    ????
    < web-resource-collection >
    ??????
    < web-resource-name > search </ web-resource-name >
    ??????
    < url-pattern > /ch12/search/* </ url-pattern >
    ????
    </ web-resource-collection >
    ????
    < auth-constraint >
    ??????
    < role-name > admin </ role-name >
    ??????
    < role-name > user </ role-name >
    ????
    </ auth-constraint >
    ??
    </ security-constraint >

    ??
    < login-config >
    ????
    < auth-method > BASIC </ auth-method >
    ????
    < realm-name > ORA?Examples </ realm-name >
    ??
    </ login-config >

    ??
    < security-role >
    ????
    < role-name > admin </ role-name >
    ??
    </ security-role >
    ??
    < security-role >
    ????
    < role-name > user </ role-name >
    ??
    </ security-role >

    在tomcat-user.xml定義用戶,及其所屬角色。
    ??<user?username="hans"?password="secret"?roles="user"/>
    ??
    <user?username="paula"?password="boss"?roles="admin"/>

    在bean中實現用戶的角色取得,同時讓其可以支持EL:
    package?com.ora.jsp.tags;

    import?javax.servlet.http.*;
    import?javax.servlet.jsp.*;
    import?javax.servlet.jsp.jstl.core.*;
    import?org.apache.taglibs.standard.lang.support.*;

    public?class?IfUserInRoleTag?extends?ConditionalTagSupport?{
    ????
    private?String?valueEL;

    ????
    public?void?setValue(String?value)?{
    ????????valueEL?
    =?value;
    ????}


    ????
    public?boolean?condition()?throws?JspTagException?{
    ????????
    /*
    ?????????*?Evaluate?the?EL?expression,?if?any
    ?????????
    */

    ????????String?role?
    =?null;
    ????????
    try?{
    ????????????role?
    =?(String)
    ?????????????
    //ExpressionEvaluatorManager.evaluate可以使valueEL用于EL,屬性名為value???????????????
    ??????????????????ExpressionEvaluatorManager.evaluate("value",?valueEL,?

    ????????????????????String.class,?this,?pageContext);
    ????????}

    ????????
    catch?(JspException?e)?{
    ????????????
    throw?new?JspTagException(e.getMessage());
    ????????}

    ????????HttpServletRequest?request?
    =?
    ????????????(HttpServletRequest)?pageContext.getRequest();
    ????????
    return?request.isUserInRole(role);//取得角色類別
    ????}

    }


    在tld文件中定義EL自定義標簽
    ??<tag>
    ????
    <name>ifUserInRole</name>
    ????
    <tag-class>com.ora.jsp.tags.IfUserInRoleTag</tag-class>
    ????
    <body-content>JSP</body-content>
    ????
    <description>
    ??????Evaluates?its?body?if?the?current,?authenticated,?user?belongs?to
    ??????the?specified?security?role,?and?optionally?saves?the?result
    ??????of?the?test?as?a?Boolean?in?a?variable?specified?by?the?var?and?
    ??????scope?attributes.
    ????
    </description>
    ????
    <attribute>
    ??????
    <name>value</name>
    ??????
    <required>true</required>
    ????
    </attribute>
    ????
    <attribute>
    ??????
    <name>var</name>
    ??????
    <required>false</required>
    ????
    </attribute>
    ????
    <attribute>
    ??????
    <name>scope</name>
    ??????
    <required>false</required>
    ????
    </attribute>
    ??
    </tag>

    在應用程序jsp頁面中調用自定義標簽進行訪問控制
    <%@?taglib?prefix="ora"?uri="orataglib"?%>

    <ora:ifUserInRole?value="admin"?var="isAdmin"?/>

    posted @ 2006-06-20 11:30 重歸本壘(Bing) 閱讀(1919) | 評論 (2)編輯 收藏
     

    
    我的經歷很典型,是從大學畢業到工作的發展與經濟記錄。據我所知,大多數男生和我了解的單身同學朋友的個人情況都很接近。希望大家看完能把感觸說出來,先謝謝了。
      我是02年畢業的。在天津讀大學,自學考試,學計算機。
    
      1-1
      02年四月份以前,偶爾兼職工作。大學期間,家人給我的生活費,大約是500塊吧。我家是山西的一個小城市,家人收入大約父母各六七百吧每個月。大學做了很多的事情,剛讀大一,忘不了發廣告,每天發六百份,一上午發完,需要沒張報紙都折疊好,然后塞到小區
    文章來源:http://loulanJS.tianyablog.com/blogger/post_show.asp?BlogID=269743&PostID=3866082&idWriter=0&Key=0
    posted @ 2006-06-14 09:56 重歸本壘(Bing) 閱讀(144) | 評論 (0)編輯 收藏
     

      2.1 開始正式工作了
    
      在2002年四月份,我到天津一家寬頻網絡公司工作了。在三年級暑假的實習還是讓我學到了很多東西的,而且對我日后工作有了很多的指導作用。在02年3月去個大型招聘會時,一個很大的展臺就是這個公司,當時同學都不敢去。覺得肯定不會被錄用,他們都沒有勇氣去投簡歷,當時同學期望的薪水大約是六百到八百吧。我去投了,投的是軟件測試工程師。面試時候,我填寫的期望薪水是1000。那次面試我表現很幼稚,是我最失敗的一次面試了。呵呵,不過我現在看來,那是我直向社會工作的第一個臺階,入門
    文章來源:http://loulanJS.tianyablog.com/blogger/post_show.asp?BlogID=269743&PostID=3866109&idWriter=0&Key=0
    posted @ 2006-06-14 09:56 重歸本壘(Bing) 閱讀(154) | 評論 (0)編輯 收藏
     

    一、static
    
      請先看下面這段程序:
    
     public class Hello{
     public static void main(String[] args){ //(1)
     System.out.println("Hello,world!"); //(2)
     }
     }
    
      看過這段程序,對于大多數學過Java 的從來說,都不陌生。即使沒有學過Java,而學過其它的高級語言,例如C,那你也應該能看懂這段代碼的意思。它只是簡單的輸出“Hello,world”,一點別的用處都沒有,然而,它卻展示了static關鍵字的主要用法。
    
      在1處
    文章來源:http://loulanJS.tianyablog.com/blogger/post_show.asp?BlogID=269743&PostID=4170242&idWriter=0&Key=0
    posted @ 2006-06-14 09:56 重歸本壘(Bing) 閱讀(148) | 評論 (0)編輯 收藏
     

    莊子說:“天地不仁,以萬物為芻狗。”
    天地不仁,是說天地無私,在天地看來,萬物都是一樣的,沒什么區別。當臺風一刮,既要刮到我的家,也要刮到你的家。它要到那最豪華的富人家里去一趟,也要到那乞丐家里逛一圈。它要刮到皇帝家里,也要刮到阿貓阿狗的家。還要刮到那小小螞蟻的穴里。
    天地不仁,就是天地的大仁之處。很多人聽到這里就又不明白了。怎么不仁,反而就是大仁了?是的,正因為不仁,看待萬物都是如一,所以才是真正的平等、公正,所以才是真正的大仁。
    理解了大仁不仁,也就理解了齊物論里的
    文章來源:http://loulanJS.tianyablog.com/blogger/post_show.asp?BlogID=269743&PostID=4170284&idWriter=0&Key=0
    posted @ 2006-06-14 09:56 重歸本壘(Bing) 閱讀(168) | 評論 (0)編輯 收藏
     

    昨天睛了一天,今天上午出了會太陽,到中午又陰下來了!
    
    遵義的天氣就是有點怪,一年也沒有幾個好天氣!總是陰陰的。
    
    來遵義一年半了,一畢業就到了這家要死不活的公司,公司里的沒多少同齡人,給我的感覺是,這里的人就像這里的天氣一樣,總是陰沉沉的。沒什么生氣。
    
    我沒有想過會在這樣一個沒有生機的地方呆這么久。在這里怎么能學到東西呢?好像我也慢慢的被同化了,也是整天郁悶。
    
    這時已經沒有了剛畢業時的那種激情。做什么事都提不起精神。
    
    這里地
    文章來源:http://loulanJS.tianyablog.com/blogger/post_show.asp?BlogID=269743&PostID=4289208&idWriter=0&Key=0
    posted @ 2006-06-14 09:56 重歸本壘(Bing) 閱讀(117) | 評論 (0)編輯 收藏
     

    前提條件1:激活了XP
    前提條件2:在微軟的網站上進行過正版驗證
    
    微軟驗證通過新方法(適合任何版本)
    1. 新建個文本文檔,然后輸入任意字母。
    2. 保存為 "data.dat"。
    3. 然后把這個 data.dat 屬性設置為"只讀"。 記住一定要設置成只讀,要不然通不過的.
    4. 放到 C:\Documents and Settings\All Users\Application Data\Windows Genuine Advantage\data 里面替換原文件。 具體哪個盤,根據你系統裝在哪個盤里.
    5. 到下面地址驗證http://www.microsoft.com/resources/howtotell/
    文章來源:http://loulanJS.tianyablog.com/blogger/post_show.asp?BlogID=269743&PostID=4370238&idWriter=0&Key=0
    posted @ 2006-06-14 09:56 重歸本壘(Bing) 閱讀(2632) | 評論 (0)編輯 收藏
    僅列出標題
    共12頁: First 上一頁 4 5 6 7 8 9 10 11 12 下一頁 
     
    Web Page Rank Icon
    主站蜘蛛池模板: 永久免费bbbbbb视频| 亚洲中字慕日产2021| 成年18网站免费视频网站| 两个人看www免费视频| 美女视频黄.免费网址| 亚洲一本之道高清乱码| 亚洲s色大片在线观看| 亚洲精品国产自在久久| 免费黄网在线观看| www.免费在线观看| 无人在线观看免费高清| 日批视频网址免费观看| 老司机午夜在线视频免费观| 亚洲人成自拍网站在线观看| 亚洲色欲www综合网| 亚洲av网址在线观看| 在线精品亚洲一区二区小说| 国产免费av一区二区三区| 成人午夜性A级毛片免费| 国内精自视频品线六区免费| 91精品全国免费观看含羞草| 国产午夜精品久久久久免费视| 特级毛片爽www免费版| 国产精品自拍亚洲| 亚洲αⅴ无码乱码在线观看性色| 亚洲人成网站日本片| 亚洲黄色在线播放| 91情国产l精品国产亚洲区| 亚洲视频.com| 亚洲国产人成在线观看69网站| 久久久亚洲精品国产| 亚洲国产精品久久久久| 精品日韩亚洲AV无码一区二区三区| 亚洲欧洲日韩不卡| 久久久久亚洲精品成人网小说 | 色婷五月综激情亚洲综合| 亚洲精品免费在线| 亚洲冬月枫中文字幕在线看| 亚洲乱码一二三四区麻豆| 久久精品国产亚洲av麻豆蜜芽 | 国产成人在线免费观看|