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

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

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

    posts - 78,  comments - 48,  trackbacks - 0
    第一件我們需要知道的事情是,通用電子郵件庫實際上是包裹在JavaMail外層的API,所以無論我們選擇哪種API,我們都需要JavaMail庫。您可能還需要JavaBeans激活框架(JavaBeans Activation Framework (JAF)),該框架將負責處理關(guān)于郵件選項的更復雜的內(nèi)容。最后一個在“購物列表”上的就是通用電子郵件庫(Commons Email),您需要從JAF中將JavaMail庫中的mail.jar、JAF中的activation.jar和通用電子郵件庫中的commons-email-1.0.jar添加到classpath的設(shè)置中。

         我們現(xiàn)在已經(jīng)擁有了支持部件的工具包,讓我們從使用JavaMail發(fā)送簡單的電子郵件開始講解,我們將提出所有的設(shè)置放到一個單獨的靜態(tài)類MailSettings當中,這樣做將在比較代碼的時候容易些。

         在發(fā)送電子郵件之前,您還需要知道SMTP服務器的主機名,SMTP服務器是負責將您的郵件發(fā)送到外部世界去的機器。

         JavaMail使用了Session類的概念來保存諸如SMTP主機和認證的信息,主要想法是基于會話(Sessions)在Java虛擬機中可以被隔離,這可以阻止惡意代碼竊取其他用戶在其他會話中的信息,這些信息可能包括用戶名和密碼等認證信息。“但是”,您可能會說,“在同一時間,我只在Java虛擬機上運行一個應用程序,而且我相信我的代碼。”JavaMail的目的是開發(fā)大型的郵件系統(tǒng),它有一個具有復雜性的關(guān)聯(lián)層,您可以繞過沒有經(jīng)驗的用戶,我們用以下的例子來說明:

    Properties props=new Properties();
    props.put("mail.smtp.host",MailSettings.smtpHost);
    Session session=Session.getDefaultInstance(props,null);

         此處,并沒有創(chuàng)建新的會話,您只是從會話工廠(session factory)中得到并通過Properties的實例來進行設(shè)置,我們只對SMTP主機進行了設(shè)置和傳送,在得到默認的實例的同時創(chuàng)建了一個共享的會話,現(xiàn)在我們可以使用這個會話來創(chuàng)建郵件消息了。

    Message message=new MimeMessage(session);

         JavaMail中有一個Message類,各種各樣的消息都是它的子類,如果查看了JavaMail的API,您會發(fā)現(xiàn)它只有一個子類:MimeMessage。JavaMail是被設(shè)計為通用的電子郵件框架的,所以顯然存在冗余的抽象。總之,我們已經(jīng)使用會話創(chuàng)建了一個MimeMessage,現(xiàn)在我們需要來填充這個消息。

    message.setFrom(new InternetAddress (MailSettings.fromAddress, MailSettings.fromName));

         再次利用抽象,JavaMail有一個Address(地址)類,其他所有的地址類型皆源于此,但是我們現(xiàn)在只關(guān)心發(fā)送國際互聯(lián)網(wǎng)的電子郵件,所以我們制造一個InternetAddress,這個地址用來表示電子郵件的來源和一個用于顯示的“個人”名字。現(xiàn)自我們來設(shè)置郵件將發(fā)向何方。

    message.setRecipient(Message.RecipientType.TO, new InternetAddress(MailSettings.toAddress));

         地址的抽象將再次出現(xiàn),我們設(shè)定接收器和接收器的類型,從此處開始,至少純文本的電子郵件可以穩(wěn)定地傳送了,我們只需要設(shè)定郵件的標題、信文并打上時間戳。

    message.setSubject(MailSettings.messageSubject);
    message.setText(MailSettings.messageBody1);
    message.setSentDate(new Date());

         此時,我們已經(jīng)準備好發(fā)送消息了。

    Transport.send(message);

         這個對Transport類的調(diào)用將會去查找適當?shù)臅挘⒄页鋈绾伟l(fā)送消息,盡管這樣做看上去有些不直觀。當我們完成這一步的時候,我們的郵件就已經(jīng)發(fā)送出去了。此時,我們還需要添加代碼來捕獲三種JavaMail可能拋出的異常,它們是AddressException、MessagingException和UnsupportedEncodingException. 但這就是最基本的使用JavaMail發(fā)送郵件的方法。

         現(xiàn)在,讓我們來看看如何使用Apache的通用電子郵件軟件包(參見MailCommons.java)來完成同樣的工作,通用電子郵件庫是一系列類的集合,它們基于您所要發(fā)送的郵件類型,其中最簡單的是SimpleEmail類,不需要建立任何會話或?qū)傩粤斜恚?/P>

    SimpleEmail email=new SimpleEmail();
    email.setHostName(MailSettings.smtpHost);

         以上代碼創(chuàng)建了我們的郵件并指定它通過我們選定的SMTP服務器發(fā)送,因為通用電子郵件庫只處理國際互聯(lián)網(wǎng)的電子郵件,所以就不必在創(chuàng)建InternetAddress實例上浪費時間了,我們可以簡單地設(shè)定來源地址:

    email.setFrom(MailSettings.fromAddress,MailSettings.fromName);

         我們只需要添加一個地址到收信人列表當中,而不是發(fā)送接收器的類型:

    email.addTo(MailSettings.toAddress);

         同樣,設(shè)定郵件的標題和信文與發(fā)送郵件都很簡單。

    email.setSubject(MailSettings.messageSubject);
    email.setMsg(MailSettings.messageBody1);
    email.send();

         我們所需要去捕獲的異常只有EmailException這一種,所以,您應該可以看出通過隱藏所有的框架和會話管理,事情變得非常簡單并且代碼更容易閱讀。

         當然,這是我們所能發(fā)送的最簡單的電子郵件,我們假設(shè)SMTP服務器不需要認證,我們發(fā)送的郵件只有一個收件人,并沒有發(fā)送郵件副本。讓我們先來看看認證,SMTP認證(SMTP AUTH)需要用戶名和密碼來發(fā)送郵件,在JavaMail中(參見MailJavaMail2.java),需要創(chuàng)建一個認證者(Authenticator)來返回所需的認證證書:

    class ForcedAuthenticator extends Authenticator {
    public PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(MailSettings.smtpUsername,
    MailSettings.smtpPassword);
    }
    }

         當我們創(chuàng)建會話的時候,就給出這個認證者的一個實例。

    Session session=Session.getDefaultInstance(props,new ForcedAuthenticator());

         然而,這里有一點要注意,這種做法將默認的會話綁定到了該認證者,因此您需要一個指向它的引用(reference)以再次取得這個會話。當然,您也可以轉(zhuǎn)而使用Session.getInstance(),來創(chuàng)建一個唯一的不共享的實例,但是這將依靠您自己來管理會話的實例。

         現(xiàn)在讓我們來看看如果使用通用電子郵件庫的方法來進行認證(參見MailCommons2.java),您將只看到一行新的語句:

    email.setAuthentication(MailSettings.smtpUsername,MailSettings.smtpPassword);這就解決了認證過程的所有痛苦。

         還有另外一種認證方式,那就是使用在郵件服務中的POP-before-SMTP,它并沒有實現(xiàn)SMTP AUTH,其實SMTP AUTH是SMTP之后的一種擴展,而POP-before-SMTP的工作方式則是將受密碼控制的郵件接收者和發(fā)送郵件的能力進行綁定,只有當用戶經(jīng)過POP協(xié)議訪問某個受密碼保護的POP郵件服務器一段時間之后,此用戶才能夠發(fā)送郵件。在JavaMail中,為了發(fā)送郵件,你需要編寫打開POP信箱的代碼,這將涉及JavaMail接收端的工作,我們將在下一篇文章中講解相關(guān)內(nèi)容;而對于通用電子郵件庫來講,事情就容易得多了:

    email.setPopBeforeSMTP(true,popHost,popUsername,popPassword);

         這使您可以操作與POP-before-SMTP相關(guān)的所有功能,而根本不需要考慮處理與POP相關(guān)的工作。

         讓我們再來看看如何設(shè)定郵件的抄送收件人,現(xiàn)在JavaMail的Message類有一個setRecipients方法,該方法可以接受一個InternetAddress的數(shù)組,但這樣做并不精巧,如果您已經(jīng)有了一個儲存電子郵件地址的字符串數(shù)組,那就可以結(jié)束這種復雜方法的考驗。

    ArrayList ccs=new ArrayList();
    for(String s:MailSettings.ccAddresses) ccs.add(new InternetAddress(s));
    message.setRecipients(Message.RecipientType.CC,
    (InternetAddress[]) ccs.toArray(new InternetAddress[ccs.size()]));

         現(xiàn)在讓我們來看看通用電子郵件庫,我們發(fā)現(xiàn)了兩件事情:首先,setTo、setCc和setBcc方法都使用了InternetAddress的集合作為它們的參數(shù),這樣做更符合Java的現(xiàn)行實踐;其次,addTo、addCc和addBcc方法將創(chuàng)建和添加收件人列表變得輕松。(參見MailCommons3.java)

    for(String s:MailSettings.ccAddresses) email.addCc(s);

         這樣的代碼更加清晰。

         最后,讓我們來看看如何發(fā)送包含內(nèi)嵌圖片的HTML格式的電子郵件,在此,JavaBeans激活框架將與JavaMail將協(xié)同工作,來協(xié)助圖片的編碼。在JavaMail的API中,我們首先創(chuàng)建一個MimeMultipart的實例,然后創(chuàng)建MimeBodyParts的實例,并將它們組裝到MimeMultipart的實例中,所以,嵌入單個圖片,比如uk-builder-com.gif這個圖片文件,并將它顯示在HTML消息中,我們需要完成以下步驟(參見HtmlJavaMail.java)

    MimeMultipart multipart=new MimeMultipart();
    BodyPart msgBodyPart=new MimeBodyPart();
    msgBodyPart.setContent("<H1>Hi! From HtmlJavaMail</H1>
    <img src=\"cid:logo\">","text/html");
    BodyPart embedImage=new MimeBodyPart();
    DataSource ds=new URLDataSource(new URL(MailSettings.inlineImage));
    embedImage.setDataHandler(new DataHandler(ds));
    embedImage.setHeader("Content-ID","");
    multipart.addBodyPart(msgBodyPart);
    multipart.addBodyPart(embedImage);
    message.setContent(multipart);

         第一個BodyPart將它的內(nèi)容設(shè)置為一個字符串和“text/html”的內(nèi)容類型,注意,在我們設(shè)置的HTML代碼中,IMG標簽指向了一個內(nèi)容標識符(content-id),這就是MIME(多用途互聯(lián)網(wǎng)郵件擴充協(xié)議)消息部分的名稱,該消息將含有GIF格式的標識圖文件,為了嵌入這個圖片,我們創(chuàng)建了另一個BodyPart和一個JAF的數(shù)據(jù)源(data source),JAF類庫將負責管理內(nèi)容的工作;然后我們將使用這個DataSource在BodyPart上添加一個DataHandler(數(shù)據(jù)處理器),這樣就可以讀出我們的URL所指向的內(nèi)容了。最后,我們還要在BodyPart的頭部設(shè)定Content-ID,這樣它就可以作為內(nèi)嵌圖片被訪問了。我們創(chuàng)建的那些BodyParts將被添加到MimeMultipart的實例中,為此,我們使用setContent()方法而不是調(diào)用setText()方法。最棘手的部分莫過于管理這些內(nèi)容標識符了,我們在此只完成了嵌入一個圖片的工作,但今后每添加一個圖片,您都需要在HTML中加入一個BodyPart和一個內(nèi)容標識符。

         現(xiàn)在讓我們來看看使用通用電子郵件庫方法的版本(參見HtmlMailCommons.java):

    HtmlEmail email=new HtmlEmail();…
    String cid=email.embed(new URL(MailSettings.inlineImage),"Builder AU Logo");
    email.setHtmlMsg("<H1>Hi! From MailJavaMail3</H1><img src=\"cid:"+cid+"\">");
    email.setTextMsg("Your email client does not support HTML messages, sorry");

         這種方法簡短了很多,而且這一版本擁有更多的功能:當電子郵件客戶端不能處理HTML時,它將顯示備用的文字。我們從創(chuàng)建一個SimpleEmail實例改變?yōu)閯?chuàng)建一個HtmlEmail實例。為了嵌入一個圖片,我們只需要簡單地調(diào)用HtmlEmail的嵌入方法,這將返回一個字符串,該字符串含有被生成和管理的內(nèi)嵌圖片內(nèi)容標識符的信息,我們可以直接使用這些信息來生成HTML內(nèi)容。我們只需要簡單地對適當?shù)淖址{(diào)用setHtmlMsg方法來進行設(shè)定,setTextMsg將設(shè)定不支持HTML的客戶端所顯示的文字,然后我們就可以發(fā)送郵件了。

         但是,到目前為止,您可能正在想“直接使用JavaMail的意義是什么呢?”答案是,如果您的目的是發(fā)送電子郵件,那么對于大多數(shù)情況,通用電子郵件庫僅僅需要少量的復雜代碼就可以完成您的需求,但是它連一點控制郵件會話和接收郵件的功能都沒有,如果您的應用軟件不需要大規(guī)模地進行郵件轉(zhuǎn)換或郵件閱讀的操作,那么應該不會造成不便。當然,如果您需要進行上述操作,那您就已經(jīng)在使用JavaMail庫了。這里唯一的一個警告就是,在我寫這篇文章之時,通用電子郵件庫發(fā)布的是1.0版本,其API中可能有一些缺陷和漏洞,但它確實可以工作。現(xiàn)在您應該沒有借口不讓您的應用軟件在工作的時候發(fā)送狀態(tài)郵件了。

    您可以下載這篇文章的源代碼

    查看本文的國際來源

    posted on 2006-03-02 10:54 黑咖啡 閱讀(539) 評論(0)  編輯  收藏 所屬分類: tec

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    留言簿(2)

    隨筆分類(67)

    文章分類(43)

    Good Article

    Good Blogs

    Open Source

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 图图资源网亚洲综合网站| 亚洲国产高清在线一区二区三区 | 免费大片黄在线观看| 日本大片在线看黄a∨免费| 国产久爱免费精品视频 | 日日噜噜噜噜夜夜爽亚洲精品| 天堂亚洲免费视频| 成人影片一区免费观看| 亚洲精品乱码久久久久久| 在线毛片片免费观看| 久久亚洲AV无码精品色午夜麻豆| 免费播放一区二区三区| 亚洲国产精品久久久久秋霞影院| 手机看黄av免费网址| 亚洲av日韩综合一区久热| 四虎永久精品免费观看| 亚洲国产成人91精品| 久久久久久国产a免费观看黄色大片| 国产99在线|亚洲| 又粗又黄又猛又爽大片免费| aaa毛片视频免费观看| 亚洲精品电影在线| 在线a人片天堂免费观看高清| 亚洲性天天干天天摸| 91网站免费观看| 国产亚洲精品成人久久网站| 亚洲色爱图小说专区| 四虎精品视频在线永久免费观看| 亚洲AV日韩AV无码污污网站| 亚洲一区二区三区国产精品| 在线观看免费av网站| 色九月亚洲综合网| 亚洲AV无码专区在线播放中文| 国产免费久久久久久无码| 亚洲人成网址在线观看| 免费高清在线影片一区| 在线观看免费视频一区| 亚洲中文字幕无码久久| 亚洲人成色777777在线观看| 最近中文字幕mv免费高清电影| 亚洲永久中文字幕在线|