JamesJavamail構(gòu)建郵件服務(wù)實(shí)現(xiàn)_第1頁
JamesJavamail構(gòu)建郵件服務(wù)實(shí)現(xiàn)_第2頁
JamesJavamail構(gòu)建郵件服務(wù)實(shí)現(xiàn)_第3頁
JamesJavamail構(gòu)建郵件服務(wù)實(shí)現(xiàn)_第4頁
JamesJavamail構(gòu)建郵件服務(wù)實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、James+Javamail構(gòu)建郵件服務(wù)(一)關(guān)鍵字: james James+Javamail構(gòu)建郵件服務(wù) 本文描述如何使用James搭建具備一定郵件過濾、郵件操作功能的郵件服務(wù)器,以及使用Javamail實(shí)現(xiàn)對(duì)James服務(wù)器郵件的收發(fā)功能。 1關(guān)于James與Javamail Apache James(Java Apache Mail Enterprise Server)是Apache組織的子項(xiàng)目之一,完全采用純Java技術(shù)開發(fā),實(shí)現(xiàn)了SMTP、POP3與NNTP等多種郵件相關(guān)協(xié)議。James是一個(gè)郵件應(yīng)用平臺(tái),可以通過Mailet擴(kuò)充其功能,如Mail2SMS、Mail2Fax等。Ja

2、mes提供了比較完善的配置方案,尤其是關(guān)于郵件內(nèi)容存儲(chǔ)和用戶信息存儲(chǔ)部分,可以選擇在文件、數(shù)據(jù)庫(kù)或其他介質(zhì)中保存。James性能穩(wěn)定、可配置性強(qiáng),還是開源項(xiàng)目,所有源代碼不存在版權(quán)問題,因此,James在項(xiàng)目中的應(yīng)用日益廣泛。 Javamail API是一個(gè)用于閱讀、編寫和發(fā)送電子消息的可選包(標(biāo)準(zhǔn)擴(kuò)展),可以用來建立基于標(biāo)準(zhǔn)的電子郵件客戶機(jī),它支持各種因特網(wǎng)郵件協(xié)議,包括:SMTP、POP、IMAP、MIME、NNTP、S/MIME及其它協(xié)議。 在本文檔中,我們使用James 2.3.1Javamail 1.4.1作為介紹藍(lán)本。 2 James服務(wù)器快速入門 我們可以從Apache Jame

3、s的官方站點(diǎn)下載到我們所需要的James服務(wù)器及源碼 James服務(wù)器(ZIP版)下載地址: HYPERLINK /james/server/binaries/james-binary-2.3.1.zip /james/server/binaries/james-binary-2.3.1.zip James源碼下載地址: HYPERLINK /james/server/source/james-2.3.1-src.zip /james/server/source/james-2.3.1-src.zip 其他版本的服務(wù)器及源碼可到官方下載頁面下載: HYPERLINK /download.cgi

4、 /download.cgi 2.1啟動(dòng)James 第一步: 將james-binary-2.3.1.zip解壓到純英文目錄下 第二步: 運(yùn)行bin目錄下的run.bat(在運(yùn)行之前請(qǐng)確保您的Java環(huán)境變量已配置成功,否則將提示運(yùn)行失敗) 顯示以下內(nèi)容表示James服務(wù)器已啟動(dòng)成功: 服務(wù)器啟動(dòng)成功后,將自動(dòng)在apps目錄下根據(jù)james.sar文件生成相應(yīng)的James發(fā)布文件包,我們后面討論的配置文件config.xml即存在于此發(fā)布文件包中。 2.2用Telnet管理用戶 用cmd進(jìn)入MS-DOS,輸入telnet localhost 4555 (注:localhost是郵件服務(wù)器名,4

5、555是管理端口,可在appsjamesSAR-INFconfig.xml文件中配置,在此我們使用其默認(rèn)配置) 然后輸入用戶名和密碼(在配置文件config.xml中,默認(rèn)為用戶名:root密碼:root) 出現(xiàn)如下信息說明登陸成功: 登陸成功后,我們就可以開始對(duì)用戶信息進(jìn)行增、刪、查、改等操作了。 常用的用戶信息操作命令參見下表: ? Currently implemented commands: 常用實(shí)現(xiàn)命令 ? help display this help 顯示幫助信息 ? listusers display existing accounts 顯示現(xiàn)有賬戶 ? countusers d

6、isplay the number of existing accounts顯示現(xiàn)有賬戶數(shù)量 ? adduser username password add a new user 添加一個(gè)新用戶 ? verify username verify if specified user exist 核實(shí)指定用戶是否存在 ? deluser username delete existing user 刪除存在的用戶 ? setpassword username password sets a users password 設(shè)置用戶密碼 ? setalias user alias locally for

7、wards all email for user to alias 設(shè)置郵箱別名 ? showalias username shows a users current email alias顯示別名 ? unsetalias user unsets an alias for user 刪除用戶別名 ? setforwarding username emailaddress forwards a users email to another email address 轉(zhuǎn)發(fā)用戶的電子郵件地址到另一個(gè)電子郵件地址 ? showforwarding username shows a users cu

8、rrent email forwarding顯示用戶的當(dāng)前郵件轉(zhuǎn)發(fā) ? unsetforwarding username removes a forward 刪除轉(zhuǎn)發(fā) ? user repositoryname change to another user repository 改變另一個(gè)用戶庫(kù) ? shutdown kills the current JVM (convenient when James is run as a daemon) 關(guān)閉當(dāng)前的服務(wù) ? quit close connection 關(guān)閉連接 我們可以輸入命令:adduser chenfengcn 881213來添加一

9、個(gè)的郵件用戶,則其用戶名為:chenfengcn,密碼為:881213,郵箱地址為:chenfengcnlocalhost(用戶名后的域名跟服務(wù)器配置的域名相同,在config.xml文件中配置,我們將在后面部分討論如何配置郵件服務(wù)器域名)。這樣,我們就完成了一個(gè)最簡(jiǎn)單的郵件服務(wù)器的搭建操作。下面就讓我們使用Foxmail來測(cè)試一下我們的郵箱帳戶是否真正可以使用吧。 2.3使用Foxmail測(cè)試郵箱帳戶 打開Foxmail,點(diǎn)擊“郵箱”“新建郵箱帳戶” 電子郵件地址:chenfengcnlocalhost 密碼為:881213 POP3服務(wù)器:localhost SMTP服務(wù)器:localho

10、st 其余選項(xiàng)均使用默認(rèn)即可,新建完成后,F(xiàn)oxmail將發(fā)送一測(cè)試郵件到我們新建的郵箱里,點(diǎn)擊“收取”,即可收取我們郵件帳戶里面的郵件了。當(dāng)收到Foxmail發(fā)送的測(cè)試郵件,就說明我們的郵件帳戶可以正常使用了。 作為程序設(shè)計(jì)人員,我們當(dāng)然希望能使用自己寫的程序來測(cè)試我們的郵件服務(wù)器是否搭建成功,而不是Foxmail。下面就讓我們用Javamail來實(shí)現(xiàn)這一切吧。James+Javamail構(gòu)建郵件服務(wù)(二) HYPERLINK /blog/#m=0&t=1&c=fks_087069083086088066086083083095085085082069083081087070084 l m=

11、0&t=1&c=fks_087069083086088066086083083095085085082069083081087070084 電子郵件開發(fā)2009-11-30 10:15:30閱讀21評(píng)論0字號(hào):大中小 3 Javamail快速入門 進(jìn)行Javamail開發(fā)需要用到兩個(gè)包:mail.jar和activation.jar,在開始Javamail編程之前,請(qǐng)自己將這兩個(gè)包添加到IDE的Build path中或?qū)⑦@兩個(gè)包的路徑配置到環(huán)境變量中。 3.1使用Javamail向James的郵箱帳戶發(fā)送郵件 3.1.1業(yè)務(wù)描述 本例將使用Javamail實(shí)現(xiàn)郵件的發(fā)送功能。發(fā)送郵件需要配置郵

12、件服務(wù)器屬性信息,配置郵件接收地址,使用SMTP認(rèn)證獲得會(huì)話(Session),構(gòu)建郵件體(MimeMessage),發(fā)送郵件。具體編碼如下: 3.1.2編碼實(shí)現(xiàn) 發(fā)送郵件需要兩個(gè)類:一個(gè)是SMTP用戶身份認(rèn)證類(James在默認(rèn)情況下,是需要SMTP身份認(rèn)證的);另一個(gè)就是我們的郵件發(fā)送類,為簡(jiǎn)單起見,我們直接將郵件的相關(guān)信息,如:標(biāo)題、內(nèi)容、發(fā)送者、接收者等信息直接寫在類中,運(yùn)行main()函數(shù)即發(fā)送。當(dāng)然,你同樣可以為自己的郵件發(fā)送系統(tǒng)構(gòu)造一個(gè)郵件發(fā)送介面,通過Servlet將相關(guān)參數(shù)傳遞至后臺(tái)進(jìn)行處理與發(fā)送。其主要代碼也就是此main()函數(shù)中的內(nèi)容,故不贅述。 SmtpAuth.ja

13、va用戶身份認(rèn)證代碼Java代碼 packagecom.newland.javamail.sample1; /* *用于身份認(rèn)證 *authorChen.Feng(Kevin) *mail:chenfengcn *qq:67758633 */ classSmtpAuthextendsjavax.mail.Authenticator privateStringuser,password; /* * *paramgetuser *paramgetpassword */ publicvoidsetUserinfo(Stringgetuser,Stringgetpassword) user=getus

14、er; password=getpassword; protectedjavax.mail.PasswordAuthenticationgetPasswordAuthentication() returnnewjavax.mail.PasswordAuthentication(user,password); publicStringgetPassword() returnpassword; publicvoidsetPassword(Stringpassword) this.password=password; publicStringgetUser() returnuser; publicv

15、oidsetUser(Stringuser) this.user=user; SendMail.java發(fā)送郵件代碼Java代碼 packagecom.newland.javamail.sample1; importjava.util.Properties; importjavax.activation.DataHandler; importjavax.activation.DataSource; importjavax.activation.FileDataSource; importjavax.mail.Message; importjavax.mail.MessagingExceptio

16、n; importjavax.mail.Session; importjavax.mail.Transport; importjavax.mail.URLName; importernet.AddressException; importernet.InternetAddress; importernet.MimeBodyPart; importernet.MimeMessage; importernet.MimeMultipart; /* *使用Javamail實(shí)現(xiàn)郵件發(fā)送功能 *authorChen.Feng(Kevin) *mail:chenfengcn *qq:67758633 * *

17、/ publicclassSendMail publicSendMail() /TODOAuto-generatedconstructorstub publicstaticvoidmain(Stringargs) /初始化信息 Stringsender=“chenfengcn”; Stringpassword=“881213”; StringsmtpServer=“l(fā)ocalhost”; Stringrecipient=“chenfengcnlocalhost”; Stringsubject=“測(cè)試郵件主題”; StringfileAttachment=“”;/附件 Stringcontent

18、=“測(cè)試郵件內(nèi)容”; /配置服務(wù)器屬性 Propertiesproper=newProperties(); proper.put(“mail.smtp.host”,smtpServer);/smtp服務(wù)器 proper.put(“mail.smtp.auth”,“true”);/是否smtp認(rèn)證 proper.put(“mail.smtp.port”,“25”);/設(shè)置smtp端口 proper.put(“tocol”,“smtp”);/發(fā)郵件協(xié)議 proper.put(“tocol”,“pop3”);/收郵件協(xié)議 /配置郵件接收地址 InternetAddressreceiveAddress

19、=newInternetAddress1; try receiveAddress0=newInternetAddress(recipient); catch(AddressExceptione) /TODOAuto-generatedcatchblock e.printStackTrace(); /smtp認(rèn)證,獲取Session SmtpAuthsa=newSmtpAuth(); sa.setUserinfo(sender,password); Sessionsession=Session.getInstance(proper,sa); session.setPasswordAuthenti

20、cation(newURLName(smtpServer),sa .getPasswordAuthentication(); /構(gòu)建郵件體 MimeMessagesendMess=newMimeMessage(session); MimeBodyPartmbp=newMimeBodyPart(); MimeMultipartmmp=newMimeMultipart(); try /郵件文本內(nèi)容 mbp.setContent(content,“text/plain;charset=GBK”); mmp.addBodyPart(mbp); /附件處理 if(fileAttachment!=null

21、&fileAttachment!=”) DataSourcesource=newFileDataSource(fileAttachment); Stringname=source.getName(); mbp=newMimeBodyPart(); mbp.setDataHandler(newDataHandler(source); mbp.setFileName(name); mmp.addBodyPart(mbp); /郵件整體 sendMess.setSubject(subject); sendMess.setContent(mmp); /發(fā)送郵件 sendMess.setFrom(new

22、InternetAddress(sender); sendMess.setRecipients(Message.RecipientType.TO,receiveAddress); Transport.send(sendMess); System.out.println(“發(fā)送成功”); catch(MessagingExceptionex) ex.printStackTrace(); 值得一提的是,本程序已經(jīng)實(shí)現(xiàn)了帶附件郵件的發(fā)送功能,如果要發(fā)送帶附件的郵件,則只需要將附件的路徑傳到fileAttachment變量中就可以了。郵件發(fā)送成功后,程序?qū)⒃诤笈_(tái)打印出“發(fā)送成功”,這樣我們就完成了郵件

23、發(fā)送功能。那么,我們應(yīng)該如何檢驗(yàn)服務(wù)器是否確實(shí)收到我們發(fā)送的測(cè)試郵件呢?Javamail可以發(fā)送郵件,當(dāng)然也能接收郵件啦,下面讓我們一起使用Javamail編寫郵件接收功能來檢驗(yàn)吧。 3.2使用Javamail接收郵件 3.2.1業(yè)務(wù)描述 在上一節(jié),我們已經(jīng)向James的chenfengcn用戶發(fā)送了一封測(cè)試郵件,我們應(yīng)該如何使用Javamail來收取這封郵件呢? 為讀取郵件,必須首先設(shè)置服務(wù)器屬性(Properties),獲取一個(gè)會(huì)話(Session),然后獲取并連接郵箱所在的存儲(chǔ)器(Store對(duì)象),打開該用戶的郵箱(Folder),獲取所希望閱讀的消息,最后關(guān)閉目錄和連接。 下面的程序?qū)?/p>

24、現(xiàn)了接收chenfengcnlocalhost郵箱中所有郵件,并將發(fā)送人和主題打印出來。 3.2.2編碼實(shí)現(xiàn) Java代碼 packagecom.newland.javamail.sample1; importjava.util.Properties; importjavax.mail.Folder; importjavax.mail.Message; importjavax.mail.MessagingException; importjavax.mail.NoSuchProviderException; importjavax.mail.Session; importjavax.mail.

25、Store; /* *使用Javamail實(shí)現(xiàn)郵件接收功能 *authorChen.Feng(Kevin) *mail:chenfengcn *qq:67758633 * */ publicclassReceiveMail publicReceiveMail() publicstaticvoidmain(Stringargs) /初始化主機(jī) Stringhost=“l(fā)ocalhost”; Stringusername=“chenfengcn”; Stringpassword=“881213”; /配置服務(wù)器屬性 Propertiesprops=newProperties(); props.pu

26、t(“mail.smtp.host”,“l(fā)ocalhost”);/smtp服務(wù)器 props.put(“mail.smtp.auth”,“true”);/是否smtp認(rèn)證 props.put(“mail.smtp.port”,“25”);/設(shè)置smtp端口 props.put(“tocol”,“smtp”);/發(fā)郵件協(xié)議 props.put(“tocol”,“pop3”);/收郵件協(xié)議 /獲取會(huì)話 Sessionsession=Session.getDefaultInstance(props,null); /獲取Store對(duì)象,使用POP3協(xié)議,也可能使用IMAP協(xié)議 try Storesto

27、re=session.getStore(“pop3”); /連接到郵件服務(wù)器 store.connect(host,username,password); /獲取該用戶Folder對(duì)象,并以只讀方式打開 Folderfolder=store.getFolder(“inbox”); folder.open(Folder.READ_ONLY); /檢索所有郵件,按需填充 Messagemessage=folder.getMessages(); for(inti=0;imessage.length;i+) /打印出每個(gè)郵件的發(fā)件人和主題 System.out.println(i+“:”+messag

28、ei.getFrom()0+“t” +messagei.getSubject(); folder.close(false); store.close(); catch(NoSuchProviderExceptione) /TODOAuto-generatedcatchblock e.printStackTrace(); catch(MessagingExceptione) /TODOAuto-generatedcatchblock e.printStackTrace(); 程序運(yùn)行成功后,將會(huì)把chenfengcn用戶的郵件從James服務(wù)器中取出,并將此郵箱中所有郵件的發(fā)件人、主題打印在后臺(tái)

29、。若要打印該郵件的內(nèi)容等信息,則只要將messagei對(duì)象中的郵件內(nèi)容等信息讀取出來就可以了。 注:鑒于郵件的存儲(chǔ)結(jié)構(gòu)(將在第五章介紹),讀取郵件附件是一個(gè)比較復(fù)雜的過程,因?yàn)猷]件的文本內(nèi)容和附件信息都是保存在BodyPart對(duì)象中的,BodyPart用于標(biāo)識(shí)類型的標(biāo)記不明確,造成對(duì)附件的判斷較為復(fù)雜。對(duì)于附件的操作本人將在今后的改進(jìn)版本中加以介紹。James+Javamail構(gòu)建郵件服務(wù)(三) HYPERLINK /blog/#m=0&t=1&c=fks_087069083086088066086083083095085085082069083081087070084 l m=0&t=1&c

30、=fks_087069083086088066086083083095085085082069083081087070084 電子郵件開發(fā) 2009-11-30 10:17:09 閱讀30 評(píng)論0 字號(hào):大中小 4 Mailet快速入門 Mailet API是一個(gè)用來創(chuàng)建郵件處理程序的簡(jiǎn)單的API,它被配置在郵件服務(wù)器端執(zhí)行,分匹配器Matcher和Mailet的接口兩種,匹配器根據(jù)特定的條件匹配郵件消息,并觸發(fā)相應(yīng)的Mailet. Mailet這個(gè)詞是跟Servlet相似,功能也相似,他們的共同之處都是在服務(wù)器端觸發(fā)并執(zhí)行,只是Servlet的Matcher通常是url的pattern,跟S

31、ervlet的接口一樣,Mailet也有init()方法,service()方法和destroy()方法.即他們都有類似的生命周期. Mailet的簡(jiǎn)單可編程接口可以用來做一些郵件處理,比如反垃圾郵件,檢查郵件病毒以及郵件博客等等,利用移動(dòng)設(shè)備可發(fā)送email的功能,可以做到手機(jī)通過mail發(fā)送信息到郵件服務(wù)器交給Mailet處理,形成移動(dòng)博客的模型. Mailet的運(yùn)行需要mailet-2.3.jar和mailet-api-2.3.jar兩個(gè)包的支持,James本身就有這兩個(gè)包,可不作修改,但在開發(fā)的時(shí)候還是需要開發(fā)者自己將這兩個(gè)包導(dǎo)入到工程的Build path中或配置到系統(tǒng)環(huán)境變量中。

32、4.1 用Mailet做一個(gè)Hello的例子 4.1.1 業(yè)務(wù)描述 我們要實(shí)現(xiàn)當(dāng)外部發(fā)送給James服務(wù)器中名字含hello的郵箱時(shí),服務(wù)器在這封郵件的主題前加入“Hello”,并在服務(wù)器后臺(tái)輸出“Received a piece of Email”。如前所述,Mailet包括匹配器Matcher和Mailet兩種接口,現(xiàn)在就讓我們用MailetAPI實(shí)現(xiàn)這兩個(gè)接口吧。 4.1.2 編碼實(shí)現(xiàn) 匹配器BizMatcher.java Java代碼 packagecom.newland.james.mailet.sample1; importorg.apache.mailet.GenericReci

33、pientMatcher; importorg.apache.mailet.MailAddress; /* *Mailet匹配器 *authorChen.Feng(Kevin) *mail:chenfengcn *qq:67758633 * */ publicclassBizMatcherextendsGenericRecipientMatcher publicbooleanmatchRecipient(MailAddressrecipient) /郵件地址必須包含hello的 if(recipient.getUser().indexOf(hello)!=-1) returntrue; ret

34、urnfalse; BizMaillet.javaJava代碼 packagecom.newland.james.mailet.sample1; importjava.io.IOException; importjavax.mail.MessagingException; importernet.MimeMessage; importorg.apache.mailet.GenericMailet; importorg.apache.mailet.Mail; /* *Mailet處理程序 *authorChen.Feng(Kevin) *mail:chenfengcn *qq:67758633

35、* */ publicclassBizMailletextendsGenericMailet publicvoidinit()throwsMessagingException publicvoidservice(Mailmail)throwsMessagingException MimeMessagemmp; mmp=(MimeMessage)mail.getMessage(); mmp.setSubject(Hello+mmp.getSubject(); System.out.println(ReceivedapieceofEmail); 4.1.3 配置部署 Mailet跟Servlet一

36、樣,是服務(wù)器端程序,是不能直接在客戶端運(yùn)行的,必須要部署到服務(wù)器端方可生效。部署具體步驟如下: 1、 將我們編寫的Matcher和Mailet打包成jar文件; 2、 在james-2.3.1appsjamesSAR-INF目錄下新建一個(gè)lib文件夾; 3、 將打包好的jar文件復(fù)制到剛剛新建的lib文件夾下; 4、 打開config.xml配置文件,找到以下這段代碼:Xml代碼 org.apache.james.transport.mailets org.apache.james.transport.mailets.smime org.apache.james.transport.match

37、ers org.apache.james.transport.matchers.smime前半部分是用于配置Mailet包所在位置,后半部分是用于配置Matcher包所在位置,我們把我們剛編寫的Mailet和Matcher所在位置配置進(jìn)去就可以了。配置后的結(jié)果如下:Xml代碼 com.newland.james.mailet.sample1 org.apache.james.transport.mailets org.apache.james.transport.mailets.smime com.newland.james.mailet.sample1 org.apache.james.tr

38、ansport.matchers org.apache.james.transport.matchers.smime 這樣就完成了包的配置。我們都知道,Mailet的工作過程是:首先由Matcher來匹配所接收到的郵件,然后提交給相應(yīng)的Mailet處理,但是哪個(gè)匹配器對(duì)應(yīng)哪個(gè)Mailet呢?我們還需要配置Mailet的對(duì)應(yīng)關(guān)系。同樣在config.xml中找到下面的代碼:Xml代碼 在這段代碼下面加入我們自己的Mailet:Xml代碼 Xml代碼 這樣就完成了我們自定義的Mailet的配置部署工作了。重啟James服務(wù)器,則此Mailet即可生效。 4.1.4 測(cè)試Mailet 前面我們已經(jīng)完

39、成了Mailet的編碼和部署工作,現(xiàn)在就讓我們來測(cè)試一下我們的Mailet是否生效吧。首先,需要在James服務(wù)器上新建一個(gè)名稱含Hello的用戶。前面已介紹過新建用戶的方法了,在此就不重復(fù)敘述了。 使用adduser helloworld 881213命令新建一個(gè)helloworld用戶。 使用第三章所談及的“使用Javamail向James的郵箱帳戶發(fā)送郵件”來向helloworldlocalhost發(fā)送一封郵件(當(dāng)然,你同樣可以使用Foxmail或Outlook向此地址發(fā)送郵件),郵件發(fā)送成功后,James服務(wù)器后臺(tái)將輸出“Receive a piece of email”。運(yùn)行效果如下

40、圖所示: 這就說明我們的Mailet已經(jīng)部署成功了.James+Javamail構(gòu)建郵件服務(wù)(四) HYPERLINK /blog/#m=0&t=1&c=fks_087069083086088066086083083095085085082069083081087070084 l m=0&t=1&c=fks_087069083086088066086083083095085085082069083081087070084 電子郵件開發(fā) 2009-11-30 10:17:55 閱讀53 評(píng)論0 字號(hào):大中小 關(guān)鍵字: james javamail mailet java 郵件5 Javamail

41、郵件存儲(chǔ)邏輯簡(jiǎn)介 5.1 Message存儲(chǔ)結(jié)構(gòu)示意圖 Message是郵件發(fā)送的最終對(duì)象,我們一般使用他的子類對(duì)象MimeMessage,其子類對(duì)象里包含有郵件的MessageID、Subject、Flag、From、Sender、Content等信息,Content是郵件的內(nèi)容體,其一般是一個(gè)Multipart對(duì)象(或其子類對(duì)象MimeMultipart),所有的郵件內(nèi)容都存在于Multipart中的。一個(gè)Multipart包含有一個(gè)或多個(gè)BodyPart對(duì)象(或其子類對(duì)象MimeBodyPart),BodyPart對(duì)象用于存儲(chǔ)郵件的內(nèi)容,可以是文本形式,也可以是附件形式。 6 常用Jav

42、amail API簡(jiǎn)介 核心JavaMail API可以分為兩部分,一部分由七個(gè)類組成:Session、Message、Address、Authenticator、Transport、Store及Folder,它們都來自Javamail API頂級(jí)包(但開發(fā)者需要使用的具體子類可能在ernet包內(nèi))。可以用這些類完成大量常見的電子郵件任務(wù),包括發(fā)送消息、檢索消息、刪除消息、認(rèn)證、回復(fù)消息、轉(zhuǎn)發(fā)消息、管理附件、處理基于HTML文件格式的消息以及搜索或過濾郵件列表,這類任務(wù)主要屬于MTA范疇。下圖描繪了Javamail郵件收發(fā)過程。 下面給出這七個(gè)核心類的簡(jiǎn)單介紹,以使讀者能對(duì)Javamail框架

43、有一個(gè)大體了解: 6.1 javax.mail.Session Session類定義了一個(gè)基本郵件會(huì)話,它是Javamail API最高層入口類,所有其它類都必須經(jīng)由Session對(duì)象才得以生效。Session對(duì)象管理配置選項(xiàng)和用于與郵件系統(tǒng)交互的用戶認(rèn)證信息,它使用java.util.Properties對(duì)象獲取信息,如郵件服務(wù)器、用戶名、密碼及整個(gè)應(yīng)用程序中共享的其它信息。 Session類的構(gòu)造器是私有的,它不能被繼承,也不能使用new語句來創(chuàng)建實(shí)例,但它提供了兩個(gè)表態(tài)方法getInstance和getDefaultInstance來獲取Session實(shí)例,前者創(chuàng)建一個(gè)獨(dú)立的會(huì)話,否則獲

44、取缺省的共享會(huì)話。 API明細(xì):/javamail-1.4.1/docs/javadocs/javax/mail/Session.html 6.2 javax.mail.Message 獲得Session對(duì)象后,可以開始繼續(xù)創(chuàng)建要發(fā)送的郵件消息,這由Message類來完成,Message實(shí)現(xiàn)了Part接口,它表示一個(gè)郵件消息,包含一系列屬性(attribute)和一個(gè)消息內(nèi)容(content)。消息屬性標(biāo)識(shí)了消息地址信息,定義了消息內(nèi)容的結(jié)構(gòu)(包括內(nèi)容類型);消息內(nèi)容使用DataHandler對(duì)象包裝實(shí)際數(shù)據(jù)。當(dāng)郵件消息位于目錄(folder)中時(shí),系統(tǒng)還使用一個(gè)標(biāo)志位集合來描述它的狀態(tài)。 M

45、essage是抽象類,實(shí)際使用時(shí)必需用一個(gè)子類代替以表示具體的郵件格式。比如說,Javamail API提供了MimeMessage(位于ernet.MimeMessage包)類,該類擴(kuò)展自Message,實(shí)現(xiàn)了RFC822和MIME標(biāo)準(zhǔn)。Message的子類通常通過字節(jié)流構(gòu)建其實(shí)例,相應(yīng)的,它們也可以生成字節(jié)流來傳輸自身。 API明細(xì):/javamail-1.4.1/docs/javadocs/javax/mail/Message.html 6.3 javax.mail.Address Address類表示電子郵件地址,它是一個(gè)抽象類。其子類(最經(jīng)常使用的子類是ernet.InternetA

46、ddress)提供具體實(shí)現(xiàn),且通常可串行化。 在創(chuàng)建了Session和Message,并設(shè)置了消息內(nèi)容后,可以用Address確定郵件消息的發(fā)送者和接收者地址。 API明細(xì):/javamail-1.4.1/docs/javadocs/javax/mail/Address.html 6.4 javax.mail.Authenticator Authenticator代表一個(gè)可以為網(wǎng)絡(luò)連接獲取認(rèn)證信息的對(duì)象,它通常通過提示用戶輸入用戶名和密碼來收集認(rèn)證信息,使連接可以訪問受保護(hù)的資源。對(duì)于Javamail API來說,這些資源就是郵件服務(wù)器。Javamail Authenticator在javax

47、.mail包中,它和中同名的類Authenticator不同。 要使用Authenticator,必須先創(chuàng)建一個(gè)它的子類實(shí)例,并且在會(huì)話對(duì)象創(chuàng)建時(shí)為會(huì)話注冊(cè)該Authenticator對(duì)象。在需要認(rèn)證的時(shí)候,就會(huì)通知Authenticator。程序可以彈出窗口,也可以從配置文件中(雖然沒有加密是不安全的)讀取用戶名和密碼,并使用它們作為構(gòu)造函數(shù)參數(shù)創(chuàng)建一個(gè)PasswordAuthentication對(duì)象返回給調(diào)用程序。 API明細(xì):/javamail-1.4.1/docs/javadocs/javax/mail/Authenticator.html 6.5 javax.mail.Transpo

48、rt 消息發(fā)送的最后步驟是使用Transport類。該類使用指定協(xié)議發(fā)送消息(通常是SMTP)。Transport是抽象類,它的工作方式與Session有些類似,可以通過靜態(tài)方法或?qū)嵗椒òl(fā)送消息。Transport繼承自Service類,而后者提供了很多通用方法,如命名傳輸、連接服務(wù)器、監(jiān)聽傳輸事件等等。 API明細(xì):/javamail-1.4.1/docs/javadocs/javax/mail/Transport.html 6.6 javax.mail.Store Store是一個(gè)抽象類,它模擬了消息存儲(chǔ)器及其內(nèi)部目錄(Folder)訪問協(xié)議,以存儲(chǔ)和讀取消息,其子類提供具體實(shí)現(xiàn)。 St

49、ore定義的存儲(chǔ)器包括一個(gè)分層的目錄體系,消息存儲(chǔ)在目錄內(nèi),。客戶程序可以通過獲取一個(gè)實(shí)現(xiàn)了數(shù)據(jù)庫(kù)訪問協(xié)議的Store對(duì)象來訪問消息存儲(chǔ)器,絕大多數(shù)存儲(chǔ)器要求用戶在訪問前提供認(rèn)證信息,connect方法執(zhí)行了該認(rèn)證過程。 Store store = session.getStore(pop3);/指定協(xié)議 store.connect(host,usename,password);/ API明細(xì):/javamail-1.4.1/docs/javadocs/javax/mail/Store.html 6.7 javax.mail.Folder Folder是一個(gè)抽象類,用于分級(jí)組織郵件,其子類提供

50、針對(duì)具體協(xié)議的實(shí)現(xiàn)。Folder代表的目錄可以容納消息或子目錄,存儲(chǔ)在目錄內(nèi)的消息被順序計(jì)數(shù)(從1開始到消息總數(shù)),該順序被稱為“郵箱順序”,通?;卩]件消息到達(dá)目錄的順序。郵件順序的變動(dòng)將改變消息的序列號(hào),這種情況僅發(fā)生在客戶程序調(diào)用Expunge方法擦除目錄內(nèi)設(shè)置了Flags.Flag.DELETED標(biāo)志位的消息時(shí)。執(zhí)行擦除操作后,目錄內(nèi)消息將重新編號(hào)。 客戶程序可以通過消息序列號(hào)或直接通過相應(yīng)的Message對(duì)象應(yīng)用目錄中的消息,由于消息序列號(hào)在會(huì)話中很可能改變,因此應(yīng)盡可能保存Message對(duì)象而非序列號(hào)來反復(fù)引用對(duì)象。 連接到Store之后,接下來可以獲取一個(gè)文件夾(Folder)。

51、該文件夾必須先使用open()方法打開,然后才能讀取里面的消息: Folder folder = store.getDefaultFolder(); /或 : Folder folder = store.getFolder(inbox); folder.open(Folder.READ_WRITE); Message message = folder.getMessage(); open()方法指定了要打開的文件夾及打開方式(如Folder.READ_WRITE)。 inbox是POP3唯一可以使用的文件夾。如果使用IMAP,還可以用其它的文件夾。獲得Message之后,就可以用getCont

52、ent()獲得其內(nèi)容,或者用writeTo()將內(nèi)容寫入輸出流。getContent()方法之能得到消息內(nèi)容,而writeTo()的輸出卻包含消息頭.讀完郵件之后要關(guān)閉與Folder和Store的連接: folder.close(aBoolean); store.close(); API明細(xì):/javamail-1.4.1/docs/javadocs/javax/mail/Folder.html 7 常用Mailet API簡(jiǎn)介 Mailet主要包含兩個(gè)包:org.apache.mailet和org.apache.mailet.dates 7.1 org.apache.mailet 此包主要用

53、于匹配器和Mailet的編寫。自定義的Mailet類需要繼承org.apache.mailet.GenericMailet,自定義的Matcher類需要繼承org.apache.mailet.GenericMatcher或org.apache.mailet.GenericRecipientMatcher。例子詳見第四章Mailet快速入門。 API明細(xì):/MailetSDK/javadocs/org/apache/mailet/package-summary.html 7.2 org.apache.mailet.dates 此包主要用于郵件中的日期格式的轉(zhuǎn)換。 API明細(xì):/MailetSDK

54、/javadocs/org/apache/mailet/dates/package-summary.html James+Javamail構(gòu)建郵件服務(wù)(五) HYPERLINK /blog/#m=0&t=1&c=fks_087069083086088066086083083095085085082069083081087070084 l m=0&t=1&c=fks_087069083086088066086083083095085085082069083081087070084 電子郵件開發(fā) 2009-11-30 10:18:50 閱讀33 評(píng)論0 字號(hào):大中小 關(guān)鍵字: james java

55、mail mailet java 郵件8 Javamail的高級(jí)應(yīng)用 8.1 用Javamail實(shí)現(xiàn)對(duì)郵件的查找 在郵件的高級(jí)應(yīng)用中,當(dāng)遇到某個(gè)帳戶中的郵件數(shù)非常多的時(shí)候,而用戶往往只需要對(duì)其中的某幾封郵件進(jìn)行處理。倘若要把所有的郵件都取出來,再進(jìn)行對(duì)應(yīng)信息的判斷提取,這無疑將大大加重郵件服務(wù)器的負(fù)擔(dān)。為了改善這種狀況,Javamail內(nèi)部提供了一個(gè)專門用于郵件查找的包:javax.mail.search。這個(gè)包將通過對(duì)SearchTerm對(duì)象進(jìn)行設(shè)置,而后提交給服務(wù)器,服務(wù)器端有相應(yīng)的過濾器,根據(jù)SearchTerm對(duì)象的設(shè)置將郵件過濾的結(jié)果傳回給客戶端。以提高工作效率,減輕服務(wù)器端負(fù)擔(dān)。下

56、面就讓我們一起來做一個(gè)例子說明一下我們應(yīng)該如何使用search這個(gè)包吧。 8.1.1 業(yè)務(wù)描述 編寫一個(gè)類,實(shí)現(xiàn)對(duì)helloworldlocalhost郵件中郵件的條件搜索功能。在本例中實(shí)現(xiàn)對(duì)主題中包含“測(cè)試”,發(fā)件人是chenfengcnlocalhost,的郵件的搜索。 8.1.2 編碼實(shí)現(xiàn) Java代碼 packagecom.newland.javamail.sample1; importjava.util.ArrayList; importjava.util.Properties; importjavax.mail.Folder; importjavax.mail.Message; i

57、mportjavax.mail.MessagingException; importjavax.mail.NoSuchProviderException; importjavax.mail.Session; importjavax.mail.Store; importernet.InternetAddress; importjavax.mail.search.AndTerm; importjavax.mail.search.FromTerm; importjavax.mail.search.SearchTerm; importjavax.mail.search.SubjectTerm; /*

58、*使用Javamail的Search包實(shí)現(xiàn)對(duì)郵件的搜索功能 *authorChen.Feng(Kevin) *mail:chenfengcn *qq:67758633 * */ publicclassSearchMail privatestaticArrayListlist=newArrayList(); publicstaticvoidmain(Stringargs) /用戶信息 Stringuser=helloworld; Stringpassword=881213; /配置服務(wù)器屬性 Propertiesprops=newProperties(); props.put(mail.smtp

59、.host,localhost);/smtp服務(wù)器 props.put(mail.smtp.auth,true);/是否smtp認(rèn)證 props.put(mail.smtp.port,25);/設(shè)置smtp端口 props.put(tocol,smtp);/發(fā)郵件協(xié)議 props.put(tocol,pop3);/收郵件協(xié)議 /創(chuàng)建會(huì)話 Sessionsession=Session.getInstance(props,null); Storestore=null; try /連接Store store=session.getStore(pop3); store.connect(localhos

60、t,user,password); /打開Folder Folderfolder=store.getFolder(inbox); folder.open(Folder.READ_ONLY); /構(gòu)造搜索規(guī)則 SearchTermsubterm=newSubjectTerm(測(cè)試); SearchTermfterm=newFromTerm(newInternetAddress(chenfengcnlocalhost); SearchTermst=newAndTerm(subterm,fterm); Messagemessage=folder.search(st); /輸出搜索到的郵件的主題 fo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論