仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 425|回复: 9
打印 上一主题 下一主题

[学习教程] JAVA网页设计JavaMail API简介

[复制链接]
透明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:25:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。JavaMailAPI简介
JavaMailAPI是一种可选的、能用于读取、编写和发送电子动静的包(尺度扩大)。您可以使用这类包创立邮件用户代办署理(MailUserAgent,MUA)范例的程序,它相似于Eudora、Pine及MicrosoftOutlook这些邮件程序。其次要目标不是像发送邮件或其他邮件传输代办署理(MailTransferAgent,MTA)范例的程序那样用于传输、发送和转发动静。换句话说,用户能够与MUA范例的程序交互,以浏览和撰写电子邮件。MUA依托MTA处置实践的发送义务。
JavaMailAPI的计划是,为收发信息供应与协定有关的会见。体例是把该API分别成两个部分:
・该API的第一个部分是本课程的重点。基础上是怎样发送和吸收自力于供应程序/协定的动静。
・第二个部分则利用特定的协定言语,如:SMTP、POP、IMAP和NNTP。假如要让JavaMailAPI与服务器通讯,就必要为之供应协定。因为Sun公司对特定协定供应程序有充实的先容,用户能够收费猎取,以是本课程没有先容创立特定协定供应程序的内容。
温习相干协定
在进修JavaMailAPI的深层常识之前,让我们回过火来看一看在该API中利用的协定,实质上有4种人们经常使用的协定:
・SMTP
・POP
・IMAP
・MIME
您还必要懂得NNTP及其他一些协定。了解这些协定的基础道理有助于您了解怎样利用JavaMailAPI。而该API的计划要与协定有关,以是不克不及克制这些基本协定的限定。假如选用的协定不撑持某种功效,那末JavaMailAPI也没法在其上增加这类功效。(正如您一会儿就会看到的,在操纵POP协定时,经常会碰着这类成绩)。
SMTP
复杂邮件传输协定(SMTP)是用于传送电子邮件的机制。在JavaMailAPI情况中,您的基于JavaMail的程序将与您公司或Internet服务供应商(ISP)的SMTP服务器通讯。该SMTP服务器将会把动静转发给用作吸收动静的SMTP服务器,最初用户可经由过程POP或IMAP协定猎取该动静。因为撑持身份考证,以是不必要SMTP服务器是一种开放的转发器,但必要确保SMTP服务器设置准确。JavaMailAPI中没有集成用于处置诸如设置服务器以转发动静或增加/删除电子邮件帐户这一类义务的功效。
POP
POP的寄义是邮局协定,以后的版本为3,也称作POP3,该协定是在RFC1939中界说的。POP是Internet上的年夜多半人用来吸收邮件的机制。它为每一个用户的每一个邮箱界说撑持,这是它所做的全体事情,也是年夜多半成绩的本源。在利用POP协定时,人们熟习的良多功效,如检察收到了几新邮件动静的功效,POP基本不撑持。这些功效都内置到诸如Eudora或MicrosoftOutlook之类的邮件程序中,能为您记着吸收的上一封邮件,和盘算有几新邮件这类信息。因而,利用JavaMailAPI时,假如想猎取这类信息,将必要由本人举行盘算。
IMAP
IMAP是用于吸收动静的加倍初级的协定,它是在RFC2060中界说的。IMAP的寄义是“Internet动静会见协定”,以后版本是第4版,也称作IMAP4。利用IMAP时,您的邮件服务器必需撑持该协定。您不克不及只是复杂地把程序变化为撑持IMAP,而不是撑持POP,就期望能撑持IMAP中的统统。假定您的邮件服务器撑持IMAP,那末基于JavaMail的程序便可使用在服务器上具有多个文件夹的用户,而且这些文件夹能够被多个用户共享的功效。
因为IMAP协定具有更初级的功效,您大概会想IMAP应当被每个人利用,但现实不是如许。由于IMAP会减轻邮件服务器的负荷,它必要服务器吸收新动静,发送动静给哀求的用户,并在多个文件夹中为每一个用户保护这些动静。而这要会合备份,因此临时下往用户的文件夹会变得愈来愈年夜,当磁盘空间用光了时,每一个人城市蒙受丧失。而利用POP协定时,已保留动静能够排除服务器的重负。
MIME
MIME的寄义是“多用处的网际邮件扩大协定”。它不是一种邮件传输协定,相反,它界说传输的内容:动静的格局、附件等。很多文档都界说了MIME协定,包括:RFC822、RFC2045、RFC2046和RFC2047。作为JavaMailAPI的用户,一样平常不必要忧虑这些格局。可是,这些格局的确存在,并为您的程序所用。
NNP和其他协定
因为JavaMailAPI分隔了供应程序和其他部分,以是您能够轻松地为附加协定增加撑持。Sun公司供应第3方供应程序清单,这些供应程序要使用Sun公司不撑持的少见的协定。在这份清单中,您将会看到对NNTP(收集旧事传输协定)[旧事组]、S/MIME(平安多用处的网际邮件扩大协定)及其他协定的供应撑持的第3方供应程序。
安装
今朝有两种版本的JavaMailAPI最经常使用:1.2和1.1.3。本课程中的一切例子都合用于这两种版本。个中JavaMailAPI1.2是最新的,而JavaMailAPI1.1.3中包括了Java2企业版(J2EE)平台1.2.1版,以是它仍旧很经常使用。利用JavaMailAPI的版本会对您的下载和安装发生一些影响。这两种版本的JavaMailAPI都能与JDK1.1.6、Java2尺度版(J2SE)平台1.2.x和1.3.x协同事情。
注重:在安装了Sun公司的JavaMail工具后,会在演示目次下看到很多示例程序。
安装JavaMail1.2
要利用JavaMail1.2API,能够下载JavaMail1.2工具,然后解紧缩javamail-1_2.zip文件,并把mail.jar文件增加到典范安装路径下。JavaMail1.2工具带有SMTP、IMAP4和POP3供应程序和中心类。
安装完JavaMail1.2后,再安装JavaBeansActivationFramework。
安装JavaMail1.1.3
要利用JavaMail1.1.3API,能够下载JavaMail1.1.3工具,然后解紧缩javamail1_1_3.zip文件,并把mail.jar文件增加到典范安装路径下。JavaMail1.1.3工具带有SMTP和IMAP4供应程序和中心类。
假如您想用JavaMail1.1.3会见POP服务器,必要下载并安装POP3供应程序。Sun公司具有一个自力于JavaMail工具的供应程序。鄙人载并解紧缩pop31_1_1.zip文件后,也还必要把pop3.jar增加到典范安装路径下。
安装完JavaMail1.1.3后,再安装JavaBeansActivationFramework。
安装JavaBeansActivationFramework
JavaMailAPI的一切版本都必要JavaBeansActivationFramework(JavaBeans激活框架),这类框架供应了对输出恣意数据块的撑持,并能响应地对其举行处置。看上往效果仿佛不太好,但该框架是在现今的很多扫瞄器和邮件工具中能够找到的基础MIME范例撑持。下载该框架后,解紧缩jaf1_0_1.zip文件,并将activation.jar文件增加到典范安装路径下。
关于JavaMail1.2用户,如今应当把mail.jar和activation.jar文件增加到典范安装路径下。
关于JavaMail1.1.3用户,如今应当把mail.jar、pop3.jar和activation.jar增加到典范安装路径下。假如您不盘算利用POP3,就不必要把pop3.jar文件增加到典范安装路径下。
假如您不想变动安装路径情况变量,能够把JAR文件复制到Java运转时情况(JRE)目次下的lib/ext目次下。比方,关于J2SE1.3版本,Windows平台上的默许目次应当是C:jdk1.3jrelibext。
利用Java2企业版
假如您利用的是J2EE,则在利用基础JavaMailAPI时,不必要做甚么特别的事情;JavaMailAPI带有J2EE类。只需确保j2ee.jar文件位于典范安装路径下,并完成了一切的设置事情。
关于J2EE1.2.1,POP3供应程序是独自供应的,因而必要下载该供应程序,并按安装JavaMail1.1.3的步骤,在J2EE1.2.1中包括POP3供应程序。J2EE1.3的用户会取得J2EE和POP3供应程序,因此不必要对POP3供应程序实行自力安装。利用这两种版本的J2EE用户,都不必要安装JavaBeansActivationFramework。
实习
设置您的JavaMail情况。
温习中心类
在入手下手深切研讨JavaMail类之前,起首让用户扫瞄一下组成API的中心类:会话、动静、地点、考证程序、传输,存储和文件夹。一切这些类都能够在JavaMailAPI即javax.mail的顶层包中找到,只管您将频仍地发明您本人利用的子类是在javax.mail.internet包中找到的。
Session类
Session类界说了一个基础的邮件会话。经由过程该会话可以让其余事情顺遂实行。Session对象使用java.util.Properties对象猎取诸如邮件服务器、用户名、暗码等信息,和其他可在全部使用程序中共享的信息。
Session类的机关器是公有的。您能够取得一个可被getDefaultInstance()办法共享的单一的默许会话:
Propertiesprops=newProperties();
//fillpropswithanyinformation
Sessionsession=Session.getDefaultInstance(props,null);
大概,您能够用getInstance()办法创立一个共同的会话:
Propertiesprops=newProperties();
//fillpropswithanyinformation
Sessionsession=Session.getInstance(props,null);
这两种情况下的null参数都是一种Authenticator对象,它不是在此时利用的。具体信息请参阅厥后的“Autherticator”一节。
在年夜多半情形下,利用共享会话就充足了,即便为多个用户邮箱处置邮件会话也是云云。您能够在通讯历程的前面一步增加上用户名和暗码的组合,并坚持一切的统统是自力的。
Message类
一旦创立了本人的Session对象,就是该往创立要发送的动静的时分了。这时候就要用到动静范例。作为一个笼统类,您必需操纵一个子类,在年夜多半情形下,该子类是javax.mail.internet.MimeMessage。一个MimeMessage是一种了解MIME范例和报头(在分歧的RFC文档中均有界说)的动静。动静的报头被严厉限定成只能利用US-ASCII字符,只管非ASCII字符能够被编码到某些报头字段中。
能够经由过程将Session对象传送给MimeMessage机关器的办法来创立动静:
MimeMessagemessage=newMimeMessage(session);
注重:另有其他的机关器,像用于创立动静的源于RFC822格局化的输出流的机关器。
一旦创立了动静,就能够设置其各个部分,如Message(动静)完成Part(部分)接口(以MimeMessage完成MimePart)。设置内容的基础机制是setContent()办法,它带有暗示内容和MIME范例的参数:
message.setContent("Hello","text/plain");
可是,假如正在利用MimeMessage,而且您的动静是纯文本,那末您就能够利用setText()办法。该办法只必要一个暗示实践内容的参数,默许的MIME范例为纯文本:
message.setText("Hello");
关于纯文本动静,setText()办法更经常被用来设置内容。要发送其他范例的动静,如HTML动静,就要利用setContent办法()。如今用的更多的是HTML动静。
要设置主题,可使用setSubject()办法:
message.setSubject("First");
Address类
一旦创立了会话和动静,并为动静添补了内容,就必要用Address类为您的函件标上地点了。同Message类一样,Address类也是一种笼统类。您可使用javax.mail.internet.InternetAddress类。
要创立只带有电子邮件地点的地点,能够把电子邮件地点传送给Address类的机关器:
Addressaddress=newInternetAddress("president@whitehouse.gov");
假如想让一个名字呈现在电子邮件地点后,也能够将其传送给机关器:
Addressaddress=newInternetAddress("president@whitehouse.gov","GeorgeBush");
您要为动静的from(发送者)字段和to(吸收者)字段创立地点对象。除非您的邮件服务器制止如许做,不然要在发送的动静中说明该动静的发送者。
一旦创立好了地点,有两种办法可以让您将地点与动静毗连起来。为了判别发送者,您可使用setFrom()和setReplyTo()办法。
message.setFrom(address)
假如您的动静必要显现多个地点来历,则可使用addFrom()办法:
Addressaddress[]=...;
message.addFrom(address);
为了判别动静吸收者,您可使用addRecipient()办法。该办法除必要一个地点参数外,还必要一个Message.RecipientType属性(动静的吸收范例)。
message.addRecipient(type,address)
地点的3种预界说范例以下:
・Message.RecipientType.TO
・Message.RecipientType.CC
・Message.RecipientType.BCC
因而,假如一条动静将发送给副总统,同时还将发送该动静的正本给第一夫人,则接纳上面的代码:
AddresstoAddress=newInternetAddress("vice.president@whitehouse.gov");
AddressccAddress=newInternetAddress("first.lady@whitehouse.gov");
message.addRecipient(Message.RecipientType.TO,toAddress);
message.addRecipient(Message.RecipientType.CC,ccAddress);
JavaMailAPI没有供应反省电子邮件地点无效性的机制。您能够本人编写撑持扫描无效字符(在RFC822文档中所界说的)的程序或查验MX(邮件互换)纪录,这些都超出了JavaMailAPI的局限。
Authenticator类
与java.net类一样,JavaMailAPI能够使用Authenticator(考证程序)类经由过程用户名和暗码来会见受回护的资本。关于JavaMailAPI来讲,这类受回护的资本是指邮件服务器。JavaMail的Authenticator类能够在javax.mail包中找到,并有别于同名的java.net类。当JavaMailAPI在Java1.1下事情时,JavaMail和java.net不会共享统一个Authenticator类称号,这是由于Java1.1中不含有java.net。
要利用Authenticator类,您可使用该笼统类的子类,并经由过程getPasswordAuthentication()办法前往一个PasswordAuthentication实例。在创立时,您必需用会话纪录Authentication类。厥后,当必要举行身份考证时,会关照您的Authenticator。会弹出一个窗口,或从一个设置文件(只管不加密就不平安)中读取用户名和暗码,并把它们作为一个PasswordAuthentication对象前往给挪用程序。
Propertiesprops=newProperties();
//fillpropswithanyinformation
Authenticatorauth=newMyAuthenticator();
Sessionsession=Session.getDefaultInstance(props,auth);
Transport类
发送动静的最初一步操纵是利用Transport类。该类利用特定于协定(一般是SMTP)的言语来发送动静。它是一个笼统类,其操纵与Session类有些类似。您能够经由过程只挪用静态的send()办法来利用该类的默许版本:
Transport.send(message);
大概,您能够从用于您的协定的会话中猎取一个特定的实例,然后传送用户名和暗码(不用要时能够为空)并发送动静,最初封闭毗连:
message.saveChanges();//implicitwithsend()
Transporttransport=session.getTransport("smtp");
transport.connect(host,username,password);
transport.sendMessage(message,message.getAllRecipients());
transport.close();
当您必要发送多个动静时,倡议接纳后一种办法,由于它将坚持动静间举动服务器的毗连。而基础的send()机制会为每个办法挪用都创建一条自力的毗连。
注重:要检察经由邮件服务器邮件命令,能够用session.setDebug(true)办法设置调试标记。
Store和Folder类
利用Session类来猎取动静,入手下手时与发送动静很类似。可是,在猎取会话后,很有大概利用用户名和暗码或Authenticator类来毗连Store类。与Transport类一样,您要告知Store类将利用甚么协定:
//Storestore=session.getStore("imap");
Storestore=session.getStore("pop3");
store.connect(host,username,password);
在毗连Store类后,就能够猎取一个Folder类,在读取个中的动静前必需先翻开该类。
Folderfolder=store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Messagemessage[]=folder.getMessages();
关于POP3协定,唯一可用的文件夹是INBOX。假如利用的是IMAP协定,则可使用其他的文件夹。
注重:Sun公司的供应程序原本想供应便利。而Messagemessage[]=folder.getMessages();这条语句倒是一种从服务器逐条读作废息的迟缓操纵,以是仅当您的确必要猎取动静部分(该内容是所检索动静的内容)时可使用这条语句。
一旦读作废息,就能够利用getContent()办法猎取其内容,或利用writeTo()办法将其内容写到一个流中。getContent()办法只猎取动静内容,而writeTo()办法则还会输入报头。
System.out.println(((MimeMessage)message).getContent());
一旦您浏览完邮件,就能够封闭对文件夹和存储的毗连。
folder.close(aBoolean);
store.close();
传送给文件夹的close()办法的布尔变量指定了是不是经由过程扫除已删除的动静来更新文件夹。
持续行进
实践上,了解利用这7个类的体例,是利用JavaMailAPI处置几近一切事变所必要的全体内容。用这7个类之外的体例构建的JavaMailAPI,其年夜多半功效都是以几近完整不异或特定的体例来实行义务的,就仿佛内容是附件。特定的义务,如:搜刮、断绝等将在前面举行先容。
利用JavaMailAPI
您已看到了怎样操纵JavaMailAPI的中心部分。鄙人面几节中,您将进修怎样毗连几个部分以实行特定的义务。
发送动静
发送电子邮件动静触及到猎取会话、创立和添补动静并发送动静这些操纵。您能够在猎取Session时,经由过程为要传送的Properties对象设置mail.smtp.host属性来指定您的SMTP服务器。
Stringhost=...;
Stringfrom=...;
Stringto=...;
//Getsystemproperties
Propertiesprops=System.getProperties();
//Setupmailserver
props.put("mail.smtp.host",host);
//Getsession
Sessionsession=Session.getDefaultInstance(props,null);
//Definemessage
MimeMessagemessage=newMimeMessage(session);
message.setFrom(newInternetAddress(from));
message.addRecipient(Message.RecipientType.TO,
newInternetAddress(to));
message.setSubject("HelloJavaMail");
message.setText("WelcometoJavaMail");
//Sendmessage
Transport.send(message);
您应当在try-catch块中编写代码,以在创立动静并发送它时能够抛出一个非常。
实习
发送您的第一个动静
猎取动静
关于浏览邮件来讲,起首您要猎取一个会话,然后猎取并毗连到一个响应的用于您的收件箱的存储上,接着翻开响应的文件夹,再猎取动静。同时,不要健忘了操纵完成后封闭毗连。
Stringhost=...;
Stringusername=...;
Stringpassword=...;
//Createemptyproperties
Propertiesprops=newProperties();
//Getsession
Sessionsession=Session.getDefaultInstance(props,null);
//Getthestore
Storestore=session.getStore("pop3");
store.connect(host,username,password);
//Getfolder
Folderfolder=store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
//Getdirectory
Messagemessage[]=folder.getMessages();
for(inti=0,n=message.length;i<n;i++){
System.out.println(i+":"+message[i].getFrom()[0]
+"        "+message[i].getSubject());
}
//Closeconnection
folder.close(false);
store.close();
每条动静实行何种操纵取决于本人决意。下面的代码块只是显现了动静的发送者和主题。从手艺上讲,发送者地点列表能够为空,此时getFrom()[0]挪用会抛出一个非常。
为了显现整条动静,您能够提醒用户在看完动静的发送者和主题字段后,假如想看到动静的内容,能够再挪用动静的writeTo()办法。
BufferedReaderreader=newBufferedReader(
newInputStreamReader(System.in));
//Getdirectory
Messagemessage[]=folder.getMessages();
for(inti=0,n=message.length;i<n;i++){
System.out.println(i+":"+message[i].getFrom()[0]
+"        "+message[i].getSubject());
System.out.println("Doyouwanttoreadmessage?"+
"[YEStoread/QUITtoend]");
Stringline=reader.readLine();
if("YES".equals(line)){
message[i].writeTo(System.out);
}elseif("QUIT".equals(line)){
break;
}
}
实习
反省邮件
删除动静和标记
删除动静触及到操纵与动静联系关系的标记。对分歧的形态有分歧的标记,有些标记是体系界说的,有些则是由用户界说的。预界说的标记都是在外部类Flags.Flag中界说的,以下所示:
・Flags.Flag.ANSWERED
・Flags.Flag.DELETED
・Flags.Flag.DRAFT
・Flags.Flag.FLAGGED
・Flags.Flag.RECENT
・Flags.Flag.SEEN
・Flags.Flag.USER
仅仅由于标记存在,其实不暗示标记为一切的邮件服务器/供应程序所撑持。比方,除删除动静外,POP协定对它们都不撑持。反省新邮件不是POP的义务,但它已内置到邮件客户程序中。要弄分明甚么标记遭到撑持,可使用getPermanentFlags()办法来扣问文件夹。
要删除动静,必要为动静设置DELETE标记:
message.setFlag(Flags.Flag.DELETED,true);
第一次以READ_WRITE(读-写)形式翻开文件夹:
folder.open(Folder.READ_WRITE);
然后,处置完了一切的动静,请封闭文件夹,并传送true值以擦往删除的动静。
folder.close(true);
用户可以使用Folder类的expunge()办法来删除动静。可是,该办法对Sun公司的POP3供应程序不起感化。其他供应程序也许能也也许不克不及完成其功效。它更有大概合用于IMAP供应程序。因为POP只撑持对收件箱的复杂会见,利用Sun公司的供应程序时,您将不能不封闭文件夹以删除动静。
要移往标记,只需传送一个false值给setFlag()办法。要看看是不是设置了某个标记,可使用isSet()举行反省。
自我考证
先前学到的是利用Authenticator类,以在必要时提醒输出用户名和暗码,而不是以字符串的情势传进它们。这里,您将真正看到怎样加倍充实地利用考证。
不需利用主机、用户名和暗码毗连到Store,您能够设置Properties带有主机,并告知Session关于您自界说的Authenticator实例,以下所示:
//Setupproperties
Propertiesprops=System.getProperties();
props.put("mail.pop3.host",host);
//Setupauthentication,getsession
Authenticatorauth=newPopupAuthenticator();
Sessionsession=Session.getDefaultInstance(props,auth);
//Getthestore
Storestore=session.getStore("pop3");
store.connect();
然后您可使用Authenticator类的子类,并经由过程getPasswordAuthentication()办法前往一个PasswordAuthentication对象。上面是这类完成的一个例子,个中一个字段同时合用于两部份内容。它不是一个ProjectSwing指南,只是在一个字段中输出了两部份内容,它们是用逗号离隔的。
importjavax.mail.*;
importjavax.swing.*;
importjava.util.*;
publicclassPopupAuthenticatorextendsAuthenticator{
publicPasswordAuthenticationgetPasswordAuthentication(){
Stringusername,password;
Stringresult=JOptionPane.showInputDialog(
"Enterusername,password");
StringTokenizerst=newStringTokenizer(result,",");
username=st.nextToken();
password=st.nextToken();
returnnewPasswordAuthentication(username,password);
}
}
因为PopupAuthenticator依附于Swing,因此将会启动用于AWT的事务处置线程。这在实质上请求您在代码中增加一个对System.exit()的挪用,以停止程序的实行。
复兴动静
Message类包括一个reply()办法,以用准确的吸收者和主题(增加“Re::”,假如没有的话)设置一条新动静。该办法不会为动静增加任何内容,只是为新的吸收者复制发送者或复兴到的报头。该办法利用一个布尔型参数,提醒是不是只复兴给发送者(false)或复兴给一切人(true)。
MimeMessagereply=(MimeMessage)message.reply(false);
reply.setFrom(newInternetAddress("president@whitehouse.gov"));
reply.setText("Thanks");
Transport.send(reply);
在发送动静时要设置复兴到地点,可以使用setReplyTo()办法。
实习
复兴邮件
转发动静
转发动静触及的内容要略微多一点,没有一个专门用于转发动静的办法,您能够经由过程处置构成动静的各个部分来创立要转发的动静。
一条邮件动静可由多个部分构成,每部分是一个BodyPart(报文部分),或更特别一点,在操纵MIME动静时则是MimeBodyPart。分歧的报文部分组合到一个称为Multipart的容器中,大概又更特别一点,是一个MimeMultipart容器。要转发动静,您要创立一个用于动静文本的部分,和用于要转发的动静的第二个部分,并将这两个部分组分解一个multipart(多个部分)。然后您能够把这个multipart增加到一个符合的说明地点的动静中并发送它。
这就是转发动静的实质。要把一条动静的内容复制给另外一条动静,只需经由过程它的DataHandler类复制便可,它是出自于JavaBeansActivationFramework的一个类。
//Createthemessagetoforward
Messageforward=newMimeMessage(session);
//Fillinheader
forward.setSubject("Fwd:"+message.getSubject());
forward.setFrom(newInternetAddress(from));
forward.addRecipient(Message.RecipientType.TO,
newInternetAddress(to));
//Createyournewmessagepart
BodyPartmessageBodyPart=newMimeBodyPart();
messageBodyPart.setText(
"Hereyougowiththeoriginalmessage:

");
//Createamulti-parttocombinetheparts
Multipartmultipart=newMimeMultipart();
multipart.addBodyPart(messageBodyPart);
//Createandfillpartfortheforwardedcontent
messageBodyPart=newMimeBodyPart();
messageBodyPart.setDataHandler(message.getDataHandler());
//Addparttomultipart
multipart.addBodyPart(messageBodyPart);
//Associatemulti-partwithmessage
forward.setContent(multipart);
//Sendmessage
Transport.send(forward);
操纵附件
附件是与邮件动静联系关系的资本,一般保留在动静以外,如:一个文本文件,电子表格或图片。关于像Eudora和Pine之类的经常使用邮件程序,您能够经由过程JavaMailAPI把资本附加到邮件动静上,并在您吸收动静时猎取附件。
发送附件
发送附件与转发动静十分类似,您要创立构成完全动静的各个部分。在创立好第一个部分即动静文本以后,您增加的用DataHandler类处置的其他部分就是您的附件,而不是转发动静中的共享处置程序。当您从一个文件读取附件时,附件的数据资本是FileDataSource;从URL读取时,则是URLDataSource。一旦您有了本人的DataSource,在将其经由过程setDataHandler()办法终极附加到BodyPart上之前,只需将其传送给DataHandler类的机关器便可。假定您想保存附件的原始文件名,要做的最初一件事就是用BodyPart类的setFileName()办法设置与附件联系关系的文件名。一切这些操纵以下所示:
//Definemessage
Messagemessage=newMimeMessage(session);
message.setFrom(newInternetAddress(from));
message.addRecipient(Message.RecipientType.TO,
newInternetAddress(to));
message.setSubject("HelloJavaMailAttachment");
//Createthemessagepart
BodyPartmessageBodyPart=newMimeBodyPart();
//Fillthemessage
messageBodyPart.setText("PardonIdeas");
Multipartmultipart=newMimeMultipart();
multipart.addBodyPart(messageBodyPart);
//Parttwoisattachment
messageBodyPart=newMimeBodyPart();
DataSourcesource=newFileDataSource(filename);
messageBodyPart.setDataHandler(newDataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
//Putpartsinmessage
message.setContent(multipart);
//Sendthemessage
Transport.send(message);
在动静中包括附件时,假如您的程序是一个servlet,您的用户就必需上传附件,并告知您要把动静发送到甚么地位。上传的每个文件都能够用一个表单来处置,该表单是以multipart/表双数据(form-data)来编码的。
<FORMENCTYPE="multipart/form-data"
method=postaction="/myservlet">
<INPUTTYPE="file"NAME="thefile">
<INPUTTYPE="submit"VALUE="Upload">
</FORM>
注重:动静的巨细要遭到您的SMTP服务器的限定,而不是由JavaMailAPI限定的。假如呈现了成绩,能够经由过程设置ms和mx参数来思索增添Java堆区的空间尺寸。
实习
发送附件
猎取附件
从动静中掏出附件比发送附件触及的操纵要略微多一点,而MIME没有复杂的附件观点。当动静带有附件时,动静的内容就是一个Multipart对象。然后必要处置各个部分,以猎取次要内容和附件。经由过程part.getDisposition()办法标志上Part.ATTACHMENT设置的部分明显就是附件。同时,附件也能够不带有设置(和非文本MIME范例)或Part.INLINE设置。当设置是Part.ATTACHMENT或Part.INLINE时,您能够离开该动静部分的内容将其保留起来。只需经由过程getFileName()办法猎取原始文件名,并经由过程getInputStream()办法猎取输出流便可。
Multipartmp=(Multipart)message.getContent();
for(inti=0,n=multipart.getCount();i<n;i++){
Partpart=multipart.getBodyPart(i));
Stringdisposition=part.getDisposition();
if((disposition!=null)&&
((disposition.equals(Part.ATTACHMENT)||
(disposition.equals(Part.INLINE))){
saveFile(part.getFileName(),part.getInputStream());
}
}
saveFile()办法只用于依据文件名创立一个文件,从输出流中读取字节,并将它们写进一个文件中往。假如文件已存在,将在文件名后增加一个编号,直到找到一个不存在的文件为止。
//fromsaveFile()
Filefile=newFile(filename);
for(inti=0;file.exists();i++){
file=newFile(filename+i);
}
下面的代码先容了动静的各个部分被标上响应的标记的一个最复杂的例子。要想包括一切的情形,还要对disposition值为null及动静部分为MIME范例的情形作响应处置。
if(disposition==null){
//Checkifplain
MimeBodyPartmbp=(MimeBodyPart)part;
if(mbp.isMimeType("text/plain")){
//Handleplain
}else{
//Specialnon-attachmentcaseshereofimage/gif,text/html,...
}
...
}
处置HTML动静
发送基于HTML的动静比发送纯文本动静要略微庞大一点,只管它不必要做大批的事情。它全体取决于您特定的需求。
发送HTML动静
假如您所要做的全体事情是发送一个等价的HTML文件作为动静,并让邮件浏览者忧心于掏出任何嵌进的图片或相干片断,那末就能够利用动静的setContent()办法,以字符串情势传送动静内容,并把内容范例设置为text/html。
StringhtmlText="<H1>Hello</H1>"+
"";
messageBodyPart.setContent(htmlText,"text/html");
//Createarelatedmulti-parttocombinetheparts
MimeMultipartmultipart=newMimeMultipart("related");
multipart.addBodyPart(messageBodyPart);
//Createpartfortheimage
messageBodyPart=newMimeBodyPart();
//Fetchtheimageandassociatetopart
DataSourcefds=newFileDataSource(file);
messageBodyPart.setDataHandler(newDataHandler(fds));
messageBodyPart.setHeader("Content-ID","memememe");
//Addparttomulti-part
multipart.addBodyPart(messageBodyPart);
//Associatemulti-partwithmessage
message.setContent(multipart);
实习
发送带有图片的HTML动静
用SearchTerm搜刮
JavaMailAPI包括一种可用于创立SearchTerm(搜刮前提)的选择机制,它能够在javax.mail.search包中找到。一旦创立了SearchTerm,您就能够扣问某个文件夹婚配的动静,并检索出动静对象数组:
SearchTermst=...;
Message[]msgs=folder.search(st);
有22种分歧的类可用于匡助创立搜刮前提。
・AND前提(AndTerm类)
・OR前提(OrTerm类)
・NOT前提(NotTerm类)
・SENTDATE前提(SentDateTerm类)
・CONTENT前提(BodyTerm类)
・HEADER前提(FromTerm/FromStringTerm,RecipientTerm/RecipientStringTerm,SubjectTerm,etc.)
实质上,您能够为婚配的动静创立一个逻辑表达式,然落后行搜刮。比方,上面显现了一条动静的前提搜刮示例,该动静带有(部分带有)一个ADV主题字符串,其发送者字段为friend@public.com。您大概思索按期运转该查询,并主动删除任何前往的动静。
SearchTermst=
newOrTerm(
newSubjectTerm("ADV:"),
newFromStringTerm("friend@public.com"));
Message[]msgs=folder.search(st);

j2EE和asp比较,其实也没什么比的,原因和我上面说那些比较差不了多少,也是稳定性,安全性,J2EE比asp高,速度上比不过asp,asp也是延续着它的拖拽控件的方法,提高速度。
小妖女 该用户已被删除
沙发
发表于 2015-1-21 06:08:03 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
admin 该用户已被删除
板凳
发表于 2015-1-30 09:17:13 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
爱飞 该用户已被删除
地板
发表于 2015-2-6 09:29:46 | 只看该作者
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
谁可相欹 该用户已被删除
5#
发表于 2015-2-13 05:36:21 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
变相怪杰 该用户已被删除
6#
发表于 2015-3-3 14:51:17 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
老尸 该用户已被删除
7#
发表于 2015-3-6 04:19:51 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
精灵巫婆 该用户已被删除
8#
发表于 2015-3-12 07:49:58 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
透明 该用户已被删除
9#
 楼主| 发表于 2015-3-19 18:52:37 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
因胸联盟 该用户已被删除
10#
发表于 2015-4-1 07:46:01 | 只看该作者
是一种使用者不需花费很多时间学习的语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-7-1 04:09

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表