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

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

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

    posts - 32,  comments - 3,  trackbacks - 0
     
    JavaMail API詳解(from http://www.tkk7.com/jxhkwhy/archive/2007/10/26/156118.html)
    摘要:
    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
    Tran
    posted @ 2010-06-03 12:18 donghang73 閱讀(302) | 評論 (0)編輯 收藏
    1、將用戶名(Grape)加入sudoers
    $su
    (input password,不帶回顯)
    $echo 'Grape ALL=(ALL) ALL' >> /etc/sudoers

    2、文本編輯(突然忘記了,寫下來,以免再忘,呵呵)
    gedit

    3、Windows無法啟動 / 調整Windows和Linux的啟動順序
    位 置:/boot/grub/menu.lst
    $sudo gedit /boot/grub/menu.lst
    添加或者修改:
    title Windows XP Professional
    rootnoverify (hd0,0)
    chainloader +1

    4、安裝yum
    $sudo rpm -ivh http://rpv.livna.org/livna-release-9.rpm
    (另 外:
    $sudo yum update
    可以執行系統的全面升級,不過網上有資料說不推薦使用...)

    5、中文輸入法
    $sudo yum install scim-pinyin
    (可以看到yum的作用了嘿)
    這個安裝完似乎 要重啟下XWindow

    6、重啟XWindow
    Ctrl+Alt+Backspace
    簡單!~

    7、tar.bz2的安裝(具體參數就省略了)
    解壓:
    $tar -xjf FILENAME.tar.bz2
    進入目錄安 裝:
    #./configure
    #make
    #make install

    8、進入root
    $su root
    (input password)^_^
    #

    9、MPlayer
    更改配置文件:
    $gedit ~/.mplayer/config
    全屏:
    寫入:
    zoom=yes
    由 于我有兩塊聲卡,這下吃了大苦頭了,要么用MPlayer播放avi沒聲音,要么用RealPlayer播放rm/rmvb沒聲音....
    要解決 問題(前提是在Linux下的硬件配置要一致,驅動正確),要么在BIOS里面屏蔽一塊聲卡,要么可以選擇在MPlayer的配置文件里寫入音頻輸出的設 備配置:
    ao=oss:/dev/dsp2,oss:/dev/dsp1,(最后這個,不能少)
    或者ao=alsa或者pcm之類 的...
    嗯,我要好好夸獎這個播放器,界面簡潔,畫質也還不錯吧,啟動非常快,快得剛開始讓我有點驚訝...

    10、MP3的標簽問題
    很要命的問題,全 是亂碼...
    可以安裝一個叫python-mutagen的小東東,它可以將MP3標簽里面的ID3v1、ID3v2等 標簽統統轉換成APEv2填充,這樣在Linux和Windows下面都可以顯示正常了。
    千千靜聽默認讀取的就是APEv2格式的標 簽,foobar也讀取APEv2的標簽,但是在Windows下面會出現一個新問題,所有的歌曲在以詳細信息查看的時候就會顯示亂碼—— ???????,怎么辦呢?干脆刪掉ID3v1的標簽吧。
    $mid3iconv -e GBK --remove v1 *.MP3
    這個小東東效果很好的! 贊!~

    11、訪問局域網共享
    不知道為什么,我的Fedora 9用不成smbmount,但是可以找到smbclient,也可以了
    列出共享:
    #smbclient -L //192.168.1.200 -U 用戶名
    #smbclient //192.168.1.200 -U 用戶名
    這個執行完就可以進 入
    smb: ">
    呵呵,ls、cd等命令統統可以用,還可以用get和put下載和上傳文件
    當然,那樣有些麻煩,當然可以 把共享目錄像掛載硬盤一樣掛載到/mnt下面的目錄
    Fedora 9下面得找到/sbin/mount.cifs
    mount.cifs //192.168.1.200/Music /mnt/netshare -o user=用戶名
    呵呵,如果那個“Music”也就是掛載的目錄名中間有空格怎么辦?簡單~~
    mount.cifs //192.168.1.200/'Music Pop' /mnt/netshare -o user=用戶名
    搞定!~

    12、掛載硬盤、移動硬盤等
    哎,用得太多了,都忘不了了,也寫寫吧
    比如要掛載原來的系統盤(假設為Windows下的C盤,位置 /dev/sda0),NTFS格式
    $sudo mount -t ntfs /dev/sda0 /mnt/winsys
    卸載:
    $sudo umount /dev/sda0
    或者:
    $sudo umount /mnt/winsys
    或者能卸載的全卸載:
    $sudo umount -a
    有時候移動硬盤在Windows下非正常拔出可能導致在Linux下無法掛載,使用上述命令也無法掛載,這種情況可以使用 force開關
    $sudo mount -t ntfs /dev/sdc1 /mnt/usbhdd -o force
    這樣,它會重寫 NTFS的日志文件,將磁盤掛載,Linux是很嚴謹的哦!~
    先寫這么多吧,以后碰到什么再寫^_^
    Linux很強大,慢慢學習 ing~~
    喜歡Linux (*^__^*)


    轉自:http://www.linuxidc.com/Linux/2008-10/17050.htm

     

     


    posted @ 2010-04-09 01:17 donghang73 閱讀(174) | 評論 (0)編輯 收藏

    1. 安裝依賴包
    su -'yum install compat-libstdc++-33 compat-libstdc++-296'

    su -c '/sbin/ldconfig/'

    2. Oracle的網站上下載linux版的JDK安裝文件,jdk-6u19-linux-i586-rpm.bin(目前的最新版)
     
    并將安裝文件移動到/opt目錄下

    3.
    切換到root用戶,并進入/opt目錄

    su --login
    輸入密碼
    cd 
    /opt


    4.
    直接運行安裝文件即可完成安裝

    sh ./jdk-6u19-linux-i586-rpm.bin

    一路按space,選擇接受協議,然后就等待它完成吧。

    5.
    安裝完成后就需要設定環境變量了

    # nano /etc/profile.d/java.sh
    在編輯器中輸入如下內容:
    export JAVA_HOME
    =(具體的JDK的安裝目錄,例如/usr/java/jdk1.6.0_19/
    export PATH
    =$JAVA_HOME/bin:$PATH 
    然后保存退出即可


    6. 因為Fedora 9自帶了OpenJDK,所以還需要將剛剛安裝的JDK設為默認

    /usr/sbin/alternatives --install /usr/bin/java java /(JDK的安裝目錄)/bin/java 3
    /usr/sbin/alternatives --config java

    然后會出現:

    共有 3 個程序提供“java”。

      選擇    命令
    -----------------------------------------------
    *  1           /usr/lib/jvm/jre-1.6.0-openjdk/bin/java
       
    2           /usr/lib/jvm/jre-1.5.0-gcj/bin/java
     
    + 3           /usr/java/jdk1.6.0_19/bin/java

    按 Enter 來保存當前選擇[
    +],或鍵入選擇號碼:

    輸入:3 回車后即ok!


    7. 測試是否安裝成功

    java -version

    如果顯示

    java version "1.6.0_19"
    Java(TM) SE Runtime Environment (build 
    1.6.0_19-b04)
    Java HotSpot(TM) Client VM (build 
    16.2-b04, mixed mode, sharing)

    則表示已成功安裝


    posted @ 2010-04-09 00:12 donghang73 閱讀(384) | 評論 (0)編輯 收藏
    首先去小企鵝的官方網站上下載fedora對應的RPM包。

    然后就是常用的RPM包安裝方法了
    rpm -ivh fcitx-3.2.050827-fc4.noarch.rpm


    要想讓輸入法開機自啟動, 在 /etc/X11/xinit/xinput.d/ 目錄中查看文件zh_CN ,如果沒有就建一個;把里面的內容改為如下的;


    XIM=fcitx
    XIM_PROGRAM=fcitx
    GTK_IM_MODULE=fcitx
    gnome-im-settings-daemon >/dev/null


    OK!大功告成。


    posted @ 2010-04-08 23:38 donghang73 閱讀(405) | 評論 (0)編輯 收藏
    使用Nero Burning ROM 將APE(CUE)刻錄成CD音樂光盤

      APE是目前流行的數字音樂文件格式之一。與MP3這類有損壓縮方式不同,APE是一種無損壓縮技術,也就是說當你將從音頻CD上 讀取的音頻數據文件壓縮成APE格式后,你還可以再將APE格式的文件還原,而還原后的音頻文件與壓縮前的一模一樣,沒有任何損失。APE的文件大小大概 為CD的一半,但是隨著寬帶的普及,APE格式受到了許多音樂愛好者的喜愛,特別是對于希望通過網絡傳輸音頻CD的朋友來說,APE可以幫助他們節約大量 的資源。

    本人在電驢瀏覽器里下載到了非常多的APE音樂文件,這APE的容量比較大,很占硬盤空間,就想將一部分APE刻錄成CD光盤。

    在百度里用關鍵詞“如何把APE刻錄成CD ”搜索到的方法有很多,看到那些方法都非常麻煩,操作起來不方便。下面根據自己摸索,終于找到了比較簡單的方 法,拿出來跟大家分享一下。

    一、有CUE文件的APE刻錄。

    運行刻錄軟件,選擇刻錄音頻->制作音頻光盤。





    軟件會自動進入下面這個界面:



    這時候無法選擇CUE文件進行刻錄,必須點擊“上一步”,退回來選擇。選擇左邊的第三項“映像、項目、復制”,然后點擊右邊的“映像光盤或保存項 目”。





    找到要刻錄的APE的播放列表CUE文件,打開:



    接下來會有幾秒鐘的等待時間,這可能是檢測過程。然后會顯示下面這個窗口,放入刻錄光盤,直接點擊刻錄就行了。



    二、沒有播放列表CUE文件的刻錄方法

    如果沒有CUE播放列表,就只能下載APE插件APE Plugin for Nero 了。可以到百度去搜索。建議使用這個網址:http://www.china1000.net/downinfo/25697.html。 我的插件就是從這里下載的。

    使用該插件可以讓Nero直接刻錄APE音樂。解壓nxMyAPE.dll到C:"PROGRAM FILES"COMMON FILES"AHEAD"AUDIOPLUGINS,啟動Nero后就可以了!安裝了ape plugin for nero,就可以像用wav、mp3刻cd一樣,直接在nero里拖放就成。


    PS:如果沒有cue文件,而下載的文件是每個音軌單獨對應一個ape,則與nero里把wav或者mp3文件刻成cd類似,一個一個文 件分別導入。但是如果整張音樂CD光盤就一個APE,且沒有CUE文件的話,按第二種方法刻錄出來的CD光盤,里面的歌曲就無法選擇曲目進行播放。遇到這 種情況的時候最好先制作CUE文件。制作CUE的方法可以到網上去搜索,這里就不再敘述了。

    轉自:
    http://hi.baidu.com/94selina/blog/item/2f9ec281040eb9d3bc3e1e56.html

    補充:
    1、用NERO刻錄APE就需要安裝一個插件,這插件很容易找,在google或迅雷一搜“NERO支持APE刻錄CD插件”你就可以找到很多,其實只是 個DLL文件。
    插件的安裝方法和注意事項::
    - Nero Burning ROM 5.5.9.0或更高版本  
    - Nero Burning ROM 5.x:將.dll解壓到'...AheadSharedAudioPlugins'目錄下  
    - Nero Burning ROM 6.x:將.dll解壓到'Program FilesCommon FilesAheadAudioPlugins'目錄下  

    - Nero Burning ROM 7.x將.dll解壓到
    'Program FilesCommon FilesAheadAudioPlugins'目錄下
    * 插件(*.dll)名字頭兩個字母'nx'必須小寫

    2、準備工作完畢后,開始動手吧~~~首先運行NERO6.0,注意啦,我用的是6.0而不是其它版本,開始我用的是7.0,沒有成功,后來改用6.0。 是什么原因,我也不清楚,可能是我安裝的不好,可能7.0真的不支持吧,可能我的系統有問題……



    3、選擇“刻錄鏡像文件”
    然后選擇這個APE相關的CUE文件,“打開”之后你就可以刻錄了。。。。。

    怎樣?很簡單吧?三步就搞掂了。但是初學者可能會遇到很多問,下面我來說說要注意的一些小細節:

    1、CUE打開出錯。
    不用想了,CUE有問題,所以NERO肯定打不開,首先你要了解CUE,你也可以自己編寫。用記事本打開CUE,你就可以看到CD的詳細信息:

    第一行是:CATALOG 0028946218624
                這個CATALOG是一個媒體編目碼(Media Catalog Number),必須是13位阿拉伯數字,一般與唱片的UPC(商品條形碼)相對應。比如這張片子的UPC碼就是:0028946218624。兩張不同 唱片的CATALOG碼是絕不會重復的。這一行是可選的,沒有也可以。

    第二行是:PERFORMER 'Mozart'
                這個PERFORMER是指整個唱片的表演家的名字。必須用雙引號括起來。這一行也是可選的。

    第三行是: 'Les grandes sonates pour violon, vol.1'
                    TITLE是指唱片的名字。必須用雙引號括起來。這一行也是可選的。

    第四行是:FILE “歌曲名 4CD-1.ape” WAVE
                    FILE就是你要刻錄的光盤映像文件了。WAVE表示該文件是音頻文件。
    文件的路徑可以是絕對路徑,如:“I:歌曲名 4CD-1.ape”。
    也可以是相對路徑,如:“歌曲名 4CD-1.ape”。
    注意,如果使用相對路徑,則CUE文件和APE必須在同一路徑下,否則播放或刻錄的時候CUE無法定位APE/WAV文件。

    第五行是:TRACK 01 AUDIO
                    這一行很關鍵,它表示當前刻錄那個光軌、光軌的類型。這里表示是第一個光軌,AUDIO表示光軌的類型是音頻。
    當中這個數字必須是從01開始的2位阿拉伯數字,升序排列,絕不可以跳躍、空缺或重復,一定是:01、02、03、04…這樣下去,直到結束。

    第六、七行
                   指該曲目的表演家、曲目的名字,這兩行都是可選的,也可以只有其中的一個。

    第八行:INDEX 01 00:00:00
                這行表示光軌中段落的索引號。其中INDEX 00一般表示該光軌開始時的間歇(留一段空白),而INDEX 01則表示音樂開始了,多段的索引:01、02、03等用得比較少,一般表示交響樂中的段落等。大部分CD播放機有INDEX顯示功能,能在播放時顯示 INDEX號碼。如果這段音樂有INDEX 00,那么大部分CD機在選曲時將會自動跳躍到INDEX 01處進行播放,而在順序播放時,會從INDEX 00處開始,以保持曲間的間隙,這時候,CD機的時間顯示為負數。
    INDEX 01是必需的,而INDEX 00等都是可選的。索引號后面用冒號分開的數字,表示該索引開始的時間。第一段是分鐘,第二段是秒,第三段是幀數()。一秒鐘的音樂包含75個幀,數字從 零開始,到74為止。
    注意:這個時間是相對于整個映像文件的絕對值。


    好了,了解了CUE可以自己修改和編寫CUE文件了。

    2、提示打不開APE文件。
    這個要跟CUE里的信息有關,打開CUE文件,在第四行 FILE 'CDImage.ape' WAVE
    如果雙引號里的是CDImage.ape。那么,ape文件名必須是CDImage。只要把APE文件名改為跟CUE里的匹配就行了。

    3、NERO刻錄的APE文件不能有無效字符在文件名里面,比如CDImage.ape是可以的,
    CD Image.ape這個文件名就是肯定不能刻錄的,會提示出錯。。。
    建議如果出現不能刻錄的問題,但是可以播放的話,將文件名改成CDImage.ape再試試,同時不要忘了要修改一下CUE文件的第三行,等下又要出現錯 誤了。

    還有一點要注意的:


    flac和ape一樣是無損壓縮的格式,國外比較的流行flac,國內的用ape的比較多,我兩個都用

    a. 將你的flac文件就是很大的那個音頻文件的名字改成CDImage.flac,如果是ape文件改名成CDImage.ape,注意這里的.flac 和.ape都是系統文件名后綴,不要改錯了,不知道什么叫在后綴名的翻windows書看看

    b. 將你的cue文件用記事本打開,修改第四行的相應文件名,比如樓主的這個改成

    FILE 'CDImage.flac' WAVE 如果是APE 就改成 FILE 'CDImage.APE' WAVE

    要切記,文件名不能有空格。
    posted @ 2010-04-07 19:02 donghang73 閱讀(4837) | 評論 (0)編輯 收藏

    在使用Spring的AOP編程時,會用到這幾個lib:
    asm-2.2.2.jar
    asm-commons-2.2.2.jar
    asm-util-2.2.2.jar

    Hibernate使用如果lib:
    asm.jar
    asm-attrs.jar


    其中asm-2.2.2.jar與asm.jar存在類上的沖突!!!
    使用其中之一或兩者都使用,可能會出現如下錯誤:
    java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
    java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor
    java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit。。。。。。


    解決辦法是:
    1.去掉類路徑上的關于Hibernate的3個lib
    asm.jar
    asm-attrs.jar
    cglib-2.1.3.jar

    2.加入Spring中的以下4個lib
    asm-2.2.2.jar
    asm-commons-2.2.2.jar
    asm-util-2.2.2.jar
    cglib-nodep-2.1_3.jar

    OK,搞定了!!! 

    轉自:http://hi.baidu.com/hateeyes/blog/item /741acbd47cb43403a08bb771.html
    posted @ 2010-02-09 16:26 donghang73 閱讀(171) | 評論 (0)編輯 收藏
    因為Hibernate采用Anotation的方式配置,故而在applicationContext中sesionFactory應該基于AnnotationSessionFactoryBean,具體代碼如下:
     1 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
     2     <property name="dataSource" ref="dataSource"></property>
     3     <property name="hibernateProperties">
     4         <props>
     5             <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
     6             <prop key="hibernate.show_sql">true</prop>
     7         </props>
     8     </property>
     9     <property name="annotatedClasses">
    10             <list>
    11                 <value>com.donghang.bean.User</value>
    12             </list>
    13     </property>
    14 </bean>
    其中User即為采用Anotation映射的實體類。

    posted @ 2010-02-09 16:24 donghang73 閱讀(386) | 評論 (0)編輯 收藏
    Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
    Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V

    原因:asm-2.2.3.jar與asm.jar沖突

    解決辦法:將asm-2.2.3.jar包去掉
    posted @ 2010-02-09 16:08 donghang73 閱讀(3521) | 評論 (0)編輯 收藏
    因經常用到,就寫在博客里吧,免得再Google了。

    1. JavaScript代碼:
    <script type="text/javascript">       
                function del() {
                    var msg = "您真的確定要刪除嗎?\n\n請確認!";
                    if (confirm(msg)==true){
                            return true;
                        }else{
                            return false;
                        }
                    }
    </script>

    2. 具體調用:
    <a href="#" onclick="javascript:return del()">刪除</a>      

    posted @ 2010-02-04 21:28 donghang73 閱讀(269) | 評論 (0)編輯 收藏
         摘要: 轉載自http://nomandia.javaeye.com/blog/320667 一、最簡單的情況,未使用<display:column/> 標簽 Html代碼 <%request.setAttribute( "test", new ReportList(6) );%>  ...  閱讀全文
    posted @ 2010-02-04 20:47 donghang73 閱讀(226) | 評論 (0)編輯 收藏
    僅列出標題
    共4頁: 上一頁 1 2 3 4 下一頁 
    主站蜘蛛池模板: 亚洲天堂在线播放| 美女视频黄频a免费| 日本免费一二区在线电影| 暖暖免费中文在线日本| 亚洲a在线视频视频| 大学生美女毛片免费视频| 黄色视频在线免费观看| 亚洲欧洲精品在线| 亚洲国产成人VA在线观看| 67pao强力打造高清免费| 国产AV无码专区亚洲AV麻豆丫| 亚洲熟女一区二区三区| 野花高清在线观看免费3中文| 日韩在线视频播放免费视频完整版 | 深夜特黄a级毛片免费播放| 久久久久久a亚洲欧洲aⅴ| 免费av欧美国产在钱| 中文字幕a∨在线乱码免费看| 亚洲国产91在线| 亚洲精品无码成人片久久| 天天操夜夜操免费视频| 免费A级毛片无码A∨中文字幕下载| 亚洲av最新在线观看网址| 亚洲激情视频在线观看| 亚洲AV伊人久久青青草原| 国产卡一卡二卡三免费入口| 国产精品福利在线观看免费不卡| 国产成+人+综合+亚洲专| 亚洲国产精品嫩草影院在线观看| 国产禁女女网站免费看| 国产精彩免费视频| 国产一精品一AV一免费| 国产成人 亚洲欧洲| 亚洲三级在线播放| 自怕偷自怕亚洲精品| 亚洲人成电影网站免费| 亚洲精品自产拍在线观看| 国产婷婷高清在线观看免费| 免费成人激情视频| 无码精品一区二区三区免费视频| 一级成人a做片免费|