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

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

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

    dyerac  
    dyerac In Java
    公告

    日歷
    <2006年8月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789
    統(tǒng)計(jì)
    • 隨筆 - 36
    • 文章 - 10
    • 評(píng)論 - 94
    • 引用 - 0

    導(dǎo)航

    常用鏈接

    留言簿(5)

    隨筆分類(lèi)(49)

    隨筆檔案(36)

    文章分類(lèi)(11)

    文章檔案(10)

    相冊(cè)

    dyerac

    搜索

    •  

    積分與排名

    • 積分 - 79238
    • 排名 - 705

    最新隨筆

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

     
    把以前寫(xiě)的轉(zhuǎn)過(guò)來(lái)咯??

    ?? 作為企業(yè)級(jí)應(yīng)用的JavaEE,郵件收發(fā)毫無(wú)疑問(wèn)是其重要技術(shù)組成;在這方面,JavaMail庫(kù)和Apache的通用電子郵件軟件包給我們提供了兩個(gè)選擇.不過(guò)通用電子郵件庫(kù)實(shí)際上是包裹在JavaMail外層的API,所以無(wú)論我們選擇哪種API,都需要JavaMail庫(kù);我們可能還需要JavaBeans激活框架(JavaBeans Activation Framework(JAF)),該框架將負(fù)責(zé)處理關(guān)于郵件選項(xiàng)的更復(fù)雜的內(nèi)容.由于通用電子郵件軟件包并沒(méi)有實(shí)現(xiàn)收取郵件的操作,在這里,我們暫且只討論JavaMail的實(shí)現(xiàn).

    一.郵件的發(fā)送
    ? 第一件要知道的事情是,你的SMTP服務(wù)器的主機(jī)名,它負(fù)責(zé)將您的郵件發(fā)送到外部世界的機(jī)器.一般來(lái)說(shuō)這些服務(wù)器都符合命名習(xí)慣,比如,如果你的郵箱是acmilan@sina.com.cn,那么SMTP服務(wù)器的主機(jī)名則是smtp.sina.com.cn;另外也可以參考各大網(wǎng)站自己的說(shuō)明.為了方便,下文中以網(wǎng)易郵箱為例.
    ? JavaMail使用了Session類(lèi)的概念來(lái)保存諸如SMTP主機(jī)和認(rèn)證的信息,主要想法是基于會(huì)話(huà)(Sessions)在Java虛擬機(jī)中可以被隔離,這可以阻止惡意代碼竊取其他用戶(hù)在其他會(huì)話(huà)中的信息,這些信息可能包括用戶(hù)名和密碼等認(rèn)證信息.你所要發(fā)送的郵件將保存在一個(gè)Message對(duì)象中,而這個(gè)Message對(duì)象則是由你所構(gòu)造的session實(shí)例來(lái)創(chuàng)建
    ? 要得到一個(gè)特定的session對(duì)象,可以通過(guò)一下代碼:
    ????? //設(shè)置session的屬性
    ????? Properties pro = new Properties();
    ????? pro.put("mail.transport.protocol", "smtp");
    ????? pro.put("mail.smtp.auth", "true");
    ????? pro.put("mail.smtp.host", "smtp.126.com");
    ????? pro.put("mail.host", "126.com");
    ?????
    ????? //設(shè)置認(rèn)證器
    ????? PopupAuthenticator pop = new PopupAuthenticator();
    ????? pop.performCheck("My Name", "My Password");//你的帳戶(hù)和密碼
    ?????
    ????? //得到session
    ????? Session mailSession = Session.getInstance(pro, pop);
    ? 要注意的是,為了避免垃圾郵件,大多數(shù)的smtp服務(wù)器需要認(rèn)證,SMTP認(rèn)證(SMTP AUTH)需要用戶(hù)名和密碼來(lái)發(fā)送郵件;因此,必須在session的初始化參數(shù)中設(shè)置一個(gè)認(rèn)證者(Authenticator)來(lái)返回所需的認(rèn)證證書(shū),具體代碼必須由自己來(lái)實(shí)現(xiàn):
    ???? class PopupAuthenticator extends Authenticator {
    ?????? String username = null;
    ?????? String password = null;
    ?????? public PopupAuthenticator() {}
    ?????? public PasswordAuthentication performCheck(String user, String pass) {
    ???????? username = user;
    ???????? password = pass;
    ???????? return getPasswordAuthentication();
    ??????? }
    ?????? protected PasswordAuthentication getPasswordAuthentication() {
    ???????? return new PasswordAuthentication(username, password);
    ??????? }
    ????? }

    ? 接著,就可以用之前得到的session來(lái)構(gòu)造Message對(duì)象:
    ??? Message msg = new MimeMessage(mailSession);?
    ? 在使用會(huì)話(huà)創(chuàng)建了一個(gè)MimeMessage后,我們需要來(lái)填充這個(gè)消息.首先是設(shè)置表頭信息,Message類(lèi)定義了郵件系統(tǒng)中使用的屬性,由名字-值對(duì)組成,使用這些名字-值可以指定郵件表頭信息,Javamail提供了一系列api用于設(shè)置常見(jiàn)的郵件表頭,其中在涉及地址的操作時(shí),我們用InternetAddress來(lái)進(jìn)行封裝:
    ????? msg.setFrom(new InternetAddress ("acmilan@126.com");
    ????? msg.setSubject("Hello");
    ????? msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("intermilan@126.com", false));
    ????? msg.setText("I will beat u");
    ????? msg.setSentDate(new Date());
    ????? //發(fā)送消息
    ????? Transport.send(msg);
    ? 對(duì)Transport類(lèi)的調(diào)用將會(huì)去查找適當(dāng)?shù)臅?huì)話(huà),并找出如何發(fā)送消息,盡管這樣做看上去有些不直觀(guān)。當(dāng)我們完成這一步的時(shí)候,我們的郵件就已經(jīng)發(fā)送出去了。此時(shí),我們還需要添加代碼來(lái)捕獲三種JavaMail可能拋出的異常,它們是AddressException、MessagingException和UnsupportedEncodingException. 但這就是最基本的使用JavaMail發(fā)送郵件的方法。
    ? 有時(shí)候我們還需要給郵件添加附件.再回到之前對(duì)Message的討論中,Message對(duì)象同樣定義了郵件的內(nèi)容,它可以定義一個(gè)消息內(nèi)容,也可以定義多個(gè)消息內(nèi)容,消息內(nèi)容(通常指的是附件)都將由DataHandle下的類(lèi)來(lái)處理.Message對(duì)象由Multipart組成,一個(gè)Multipart可含有多個(gè)BodyPart,這些BodyPart將用來(lái)保存文本信息和附件.
    ????? MimeMultipart multipart = new MimeMultipart();
    ????? BodyPart msgBodyPart = new MimeBodyPart();//用來(lái)放置文本內(nèi)容
    ????? msgBodyPart.setContent(message, "text/plain");
    ????? BodyPart attBodyPart = new MimeBodyPart();//用來(lái)放置附件
    ????? DataSource ds = new FileDataSource(new File("c:/td.txt"));
    ????? attBodyPart.setDataHandler(new DataHandler(ds));//設(shè)置DataHandler
    ????? attBodyPart.setFileName("bsbs.txt");//附件的顯示名字
    ????? multipart.addBodyPart(msgBodyPart);
    ????? multipart.addBodyPart(attBodyPart);
    ????? msg.setContent(multipart);
    ????? Transport.send(msg);
    ?? 最后,我們來(lái)看看如何發(fā)送HTML格式的郵件,文本的格式必須相應(yīng)的設(shè)置為text/html,郵件中的圖片將以附件形式加載,另外還要指定一個(gè)內(nèi)部ID以供調(diào)用;
    ????? MimeMultipart multipart = new MimeMultipart();
    ????? BodyPart msgBodyPart = new MimeBodyPart();
    ????? //設(shè)置格式為"text/html"
    ????? msgBodyPart.setContent("<H1>Hi! From HtmlJavaMail</H1> <img src=\"cid:logo\"/>", "text/html");
    ????? BodyPart embedImage = new MimeBodyPart();
    ????? DataSource ds = new URLDataSource(new URL("????? embedImage.setDataHandler(new DataHandler(ds));
    ????? //設(shè)置表頭的內(nèi)部ID,注意,所設(shè)置內(nèi)容必須與前文對(duì)應(yīng),在此處,前文的引用為<img src=\"cid:logo\"/>,因此Content-ID表頭對(duì)應(yīng)
    ????? //的應(yīng)該是<logo>
    ????? embedImage.setHeader("Content-ID", "<logo>");
    ????? multipart.addBodyPart(msgBodyPart);
    ????? multipart.addBodyPart(embedImage);
    ????? msg.setContent(multipart);
    ?? 這樣,一封HTML格式的郵件便完成了
    ????? Transport.send(msg);


    二.郵件的收取
    ? 同樣,第一步還是要獲得服務(wù)器的名字.我們還是以網(wǎng)易為例.
    ? 接收郵件包含兩個(gè)協(xié)議,即POP3和IMAP。POP3是老協(xié)議,它提供一個(gè)單一收信箱,以存放一定順序的郵件信息。IMAP相對(duì)比較新,它為郵件提供連接到一個(gè)層次關(guān)系的文件入口,其中一個(gè)入口即為收信箱。當(dāng)然還有其它可以使用的協(xié)議,POP3和IMAP只是其中一種安全性很好的協(xié)議。JavaMail將這些協(xié)議提煉為一種郵件倉(cāng)庫(kù)(Store)的概念,這一倉(cāng)庫(kù)為文件等級(jí)的集合。這種提煉意味著倉(cāng)庫(kù)包含很多內(nèi)容,但我們只需要弄清楚在一個(gè)服務(wù)文件夾中瀏覽與導(dǎo)航郵件信息的過(guò)程,而實(shí)際處理郵件協(xié)議的任務(wù)則通過(guò)JavaMail調(diào)用Provider來(lái)完成,不同的協(xié)議對(duì)應(yīng)不同的provider。
    ? JavaMail的Provider操作服務(wù)于POP3和IMAP,你也可以將另外的Providers嵌入到JavaMail API以處理其它諸如NNTP或本地存儲(chǔ)郵件的協(xié)議。在Sun主頁(yè)上列出這方面的第三方Providers。
    ? 在Javamail中,store和folder類(lèi)是用來(lái)存儲(chǔ)和接受消息.store由具體的session得到,它使用可帶參數(shù)的connect方法與服務(wù)器連接,folder則和File有點(diǎn)類(lèi)似,可以將其比作windows下的文件夾.客戶(hù)由store類(lèi)中取得folder,再對(duì)folder進(jìn)行操作--進(jìn)入特定的folder,讀取folder中的消息.
    ???? Session session;
    ???? Store store = null;
    ???? Folder folder = null;
    ???? Folder inboxfolder = null;
    ????
    ???? Properties props = System.getProperties();
    ???? props.setProperty("mail.pop3s.rsetbeforequit", "true");//這樣讀取郵件時(shí)服務(wù)器不會(huì)刪除原有的郵件
    ???? props.setProperty("mail.pop3.rsetbeforequit", "true");
    ???? session = Session.getInstance(props, null);

    ???? store = session.getStore("pop3");//通過(guò)"pop3"得到適當(dāng)?shù)膒rovider
    ???? store.connect(emailserver, emailuser, emailpassword);
    ???? folder = store.getDefaultFolder();//得到默認(rèn)的頂級(jí)文件夾
    ? 每一Folder可以包含很多其它的文件夾,通過(guò)getFolder方法來(lái)瀏覽特定文件夾。INBOX是郵件服務(wù)器表示的主文件夾保留的名稱(chēng),pop3和imap存儲(chǔ)都會(huì)提供一個(gè)INBOX文件夾.
    ???? inboxfolder = folder.getFolder("INBOX");
    ???? inboxfolder.open(Folder.READ_ONLY);//只讀模式
    ???? Message[] msgs = inboxfolder.getMessages();
    ? 需要注意的是,此時(shí)真正的消息對(duì)象并沒(méi)有存儲(chǔ)到數(shù)組(msgs)中,數(shù)組保存的只是這些消息對(duì)象的引用,只有在調(diào)用了具體的Message.getXX()方法時(shí),程序才會(huì)再次連接服務(wù)器并取得真正的結(jié)果.如果要進(jìn)行對(duì)郵件的篩選工作,不停的調(diào)用每個(gè)消息對(duì)象的getXX方法無(wú)疑會(huì)影響性能.因此我們可以用FetchProfile類(lèi)來(lái)預(yù)先抓取感興趣的部分內(nèi)容(如各表頭內(nèi)容),這就不需要每次調(diào)用getXX方法時(shí)都再連接服務(wù)器了.
    ???? FetchProfile fp = new FetchProfile();
    ???? fp.add("Subject");//即只讀取主題信息
    ???? inboxfolder.fetch(msgs, fp);//預(yù)讀取每個(gè)消息的主題
    ???? for (int j = 0 ;j <msgs.length; j++) {
    ??????? if (msgs[j].getSubject().startsWith("^_^")) {//只對(duì)標(biāo)題為"^_^"的郵件進(jìn)行操作
    ????????? .......
    ??????? }
    ? 接下來(lái),就可以調(diào)用Message的各種方法對(duì)郵件進(jìn)行操作了.對(duì)不同格式的郵件,具體的操作當(dāng)然也略微不同.一個(gè)做法是對(duì)每個(gè)具體的BodyPart進(jìn)行操作,通過(guò)下列的遞歸方法可以獲得每個(gè)BodyPart的引用
    ???? private void extractPart(final Part part) throws MessagingException,IOException {
    ?????? if(part.getContent() instanceof Multipart) {
    ?????????? Multipart mp=(Multipart)part.getContent();
    ?????????? for (int i = 0; i < mp.getCount(); i++) {
    ?????????????? extractPart(mp.getBodyPart(i));
    ?????????? }
    ????? return;
    ??? }
    ? Part的getContentType方法可以為我們對(duì)其采取何種方法處理提供依據(jù)
    ???? part.getContentType().startsWith("text/plain").....
    ? 如果是以"text/plain"或者"text/html"開(kāi)頭,通常我們可以直接取出其內(nèi)容
    ??? bodytext = (String) part.getContent();
    ? 如果兩者都不是,我們將其視之為附件,通過(guò)IO流來(lái)讀取:
    ????? InputStream in = part.getInputStream();//讀取part中的附件
    ????? ByteArrayOutputStream bos = new ByteArrayOutputStream();

    ????? byte[] buffer = new byte[8192];
    ????? int count = 0;
    ????? while ( (count = in.read(buffer)) >= 0) {
    ??????? bos.write(buffer, 0, count);
    ????? }
    ????? in.close();
    ? 接下來(lái),就可以對(duì)流進(jìn)行操作了.
    ? 那么,關(guān)于Javamail的研究也就進(jìn)行到這兒了.

    參考文獻(xiàn):
    ? DJ Walker-Morgan????????? Getting the mail in: receiving in JavaMail
    ?????????????????????????????????????Sending email in Java: There's more than one way
    ? 趙強(qiáng),喬新亮???????????????????J2EE應(yīng)用開(kāi)發(fā)

     
    Copyright © dyerac in java... Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 欧美日韩国产免费一区二区三区| 亚洲沟沟美女亚洲沟沟| 免费av欧美国产在钱| 日本在线免费观看| 一级毛片成人免费看a| 亚洲AV无码一区二区三区性色 | 亚洲av永久无码嘿嘿嘿| 亚洲国产精品无码久久久秋霞2 | 蜜芽亚洲av无码精品色午夜| 亚洲综合在线另类色区奇米| 国产伦精品一区二区三区免费下载 | 午夜影院免费观看| 国产精品福利片免费看| 福利片免费一区二区三区| 日韩亚洲产在线观看| 亚洲国产片在线观看| 亚洲尹人九九大色香蕉网站| 国产亚洲日韩在线三区| 亚洲精品色婷婷在线影院| 亚洲 小说区 图片区 都市| 在线观看91精品国产不卡免费| 毛片基地免费视频a| 国产免费久久精品99re丫y| 日本zzzzwww大片免费| 24小时免费看片| 99在线免费观看视频| 99视频精品全部免费观看| 免费在线中文日本| 99在线视频免费观看| 中文字幕免费视频精品一| 中文字幕在线视频免费观看| 国产精品福利片免费看| 久久成人18免费网站| 国产综合免费精品久久久| 两个人看的www高清免费视频| 成人片黄网站色大片免费观看cn| 9久热这里只有精品免费| 精品一卡2卡三卡4卡免费视频| 99久久免费国产特黄| 国产精品偷伦视频观看免费| 国产精品免费大片|