- 浏览: 151495 次
文章分类
最新评论
-
Alors:
Quartz这个类没有,报错
spring3.1和quatz2实现数据库持久化和动态加载 -
flyingcatjj:
...
Java中的break Label 和continue Label -
hehebaiy:
...
Maven安装、配置、使用
JAVAMAIL example
所有的邮件服务器,对附件大小都有规定.
办法一:既然自己开发发邮件程序,也是自己的邮件服务器,不妨修改一下附件大小设置
办法二:拆分附件,分多个邮件发送
办法三:发送HTML格式邮件,原本作为附件的文件,通过网站发布,在邮件中做上超链接
办法四:只针对exchange,可利用公用文件夹发布文件
JavaMail
在Java EE应用程序中,经常需要发送E-mail。Java EE框架为应用提供了JavaMail接口,通过JavaMail相关的接口可以读取邮件服务器的邮件,并且可以完成邮件的发送过程。
本章的主要内容包括:
E-mail体系结构
JavaMail API
如何使用JavaMail API发送邮件
如何使用JavaMail API接收邮件
1.1 E-mail体系结构
1.1.1 什么是E-mailE-mail是用户间或应用程序间交换信息的Internet标准。每个用户都有自己的网上邮箱,发送方把信息发送到自己的网上信箱,并声明信息的接收方;该信箱所在的“邮局”会把信息发送到接收方的“邮局”,接收方从接收方的“邮局”中自己的信箱获取信息。这样就完成了信息从发送方到接收方的传递。所以,要发送或者接收邮件首先应该有自己的邮箱。
E-mail消息可以包含普通文本,也可以包含更为复杂的多媒体数据类型和图像声音等。这样,用户就可以交换各种各样的信息。
每个E-mail消息的头信息中都包含消息的发出者、发送的目的地和其他相关信息。
1.1.2 E-mail体系结构
要完成消息的交互,需要几方面的支持:邮件发送客户端程序、邮件接收客户端程序、邮件发送服务器和邮件接收服务器,此外,还需要相关的通信协议。
邮件发送客户端程序和邮件接收客户端程序可以是相同的,例如经常使用的微软的Outlook既可以发送邮件,也可以接收邮件。
邮件发送服务器和邮件接收服务器也可以是相同的服务器。在与邮件服务器交互的过程中,主要完成两个动作,把邮件发送到邮件服务器,以及从邮件服务器读取邮件。所以,主要使用两类协议,分别进行邮件的发送和接收。
邮件从发送方到接收方的传递过程(参见图1.1)如下:
(1)邮件发送方通过邮件发送客户端把邮件发送到发送方的邮件服务器,在发送的过程中需要用到SMTP协议。
(2)发送方的邮件服务器把邮件发送到接收方的邮件服务器,使用的协议也是SMTP。
(3)邮件接收方从接收方邮件服务器接收邮件,使用POP3协议或者IMAP协议。
邮件
发送方
发送方邮件
服务器
接收方邮件
服务器
邮件
接收方
SMTP
SMTP
IMAP
POP3
图1.1 邮件从发送方到接收方的传递过程
1.1.3 E-mail相关的协议
简单邮件传输协议(SMTP)
在邮件发送方把邮件发送到发送方邮件服务器的时候,需要用到简单邮件传输协议(Simple Mail Transport Protocol,简称SMTP),发送方邮件服务器把邮件发送到接收方邮件服务器的时候,也要用到SMTP。SMTP是应用程序与邮件服务器通信并发送邮件的Internet标准,SMTP通信基于TCP协议端口25之上。
邮箱协议(POP3)
邮件接收方从接收方邮件服务器接收邮件的时候,需要使用检索协议,可以使用POP3或者IMAP。POP3是Post Office Protocol的简称,是用于接收方从邮件服务器上检索E-mail消息的协议,工作在TCP协议端口110之上。
Internet消息访问协议(IMAP)
IMAP是Internet Message Access Protocol的简称,与POP3基本相同。完成的主要功能是从邮件服务器接收邮件,使用的端口是293。
1.1.4 什么是Java Mail在Java EE应用中,经常需要通过E-mail与用户进行交互,主要是与邮件服务器的交互,例如向邮件服务器发送邮件,或者从邮件服务器接收邮件。如果是用户之间直接进行交互可以使用邮件客户端程序,例如微软的Outlook。如果想在应用程序中发送邮件,就不能直接使用通用的客户端了,需要编写自己专门的邮件发送和接收代码,并且需要与邮件服务器进行交互。可以通过Socket编程,使用相关的协议完成,但是这个过程非常复杂。而Java Mail提供了比较便利的解决方案。
JavaMail是Java EE中的标准API,是对邮件服务器访问过程的封装。使用JavaMail API则不需要编写与邮件服务器交互的详细过程,只需要调用相关接口即可。在接口中封装了与邮件服务器交互的详细过程。
本章的主要内容是介绍如何通过JavaMail API完成邮件的发送和接收。
1.2 JavaMail API JavaMail API主要包括四个部分:Session,Message,Transport和InternetAddress。下面分别进行介绍。
1.2.1 SessionSession定义了全局的和每个用户的与邮件相关的属性,这些属性详细说明了客户机和服务器如何交流信息。Session中定义的属性如下:
mail.store.protocol:确定检索邮件所使用的协议。可以是IMAP(接收),也可以是POP3。
mail.transport.protocol:确定发送邮件所使用的协议,可以是SMTP(发送)。
mail.host:确定邮件服务器的主机名。
mail.user:确定检索邮件或者发送邮件的用户名。
mail.protocol.host:确定具体的发送邮件服务器或者接收邮件服务器。有时候发送邮件服务器和接收邮件服务器使用的主机不同,这时候需要详细指定各个协议使用的主机,如果不指定,则使用mail.host所确定的主机。
mail.protocol.user:为登录特定邮件服务器所使用的用户名,如果没有指定,使用mail.user所指定的用户。
mail.from:为邮件指定默认的回复地址,如果没有指定,使用mail.user所指定的用户。
1.2.2 MessageMessage表示单个邮件消息,其属性包括消息类型、地址信息和所定义的目录结构。但是Message类是一个抽象类,必须实现它的一个子类。通常使用MimeMessage,它是Message类的一个派生类。
Message类的主要方法有两部分,第一部分主要在发送邮件的时候使用,用于设置邮件的相关信息,包括邮件的发送者、接收者、主题和发送时间等。这些方法如下:
setFrom(),用于设置邮件的发送者,值从“mail.user”属性中获取,如果这个值是默认的,则使用系统属性“user.name”。
setFrom(Address address),与上一个方法的作用相同,值是通过参数确定的,是Address的对象,通常使用其实现者InternetAddress的对象作为参数。
addFrom(Address[] addresses),在已有的邮件发送者中添加其他的邮件发送者,参数是要添加的邮件发送者的地址。
setSubject(String subject),用于设置邮件的标题。
setContent(String contentType),用于设置邮件的内容类型。
setSentDate(java.util.Date date),用于设置邮件发送的时间。
setRecipient(Message.RecipientType type, Address address),用于设置邮件的接收者。有两个参数,第一个参数是接收者的类型,第二个参数是接收者。接收者类型可以是Message.RecipientType.TO,Message.RecipientType.CC和Message.RecipientType.BCC,TO表示主要接收人,CC表示抄送人,BCC表示秘密抄送人。接收者与发送者一样,通常使用InternetAddress的对象。
addRecipient(Message.RecipientType type, Address address),用于添加邮件的接收者,其参数与setRecipient方法的基本相同。
setRecipients(Message.RecipientType type, Address[] addresses),作用和setRecipient基本相同,区别在于该方法可以同时设置多个邮件的接收者。
addRecipients(Message.RecipientType type, Address[] addresses),用于添加邮件接收者,可以同时添加多个接收者。
setReplyTo(Address[] addresses),设置邮件的回复地址,参数用于确定要回复的地址。
setText(String text),用于设置邮件的文本,同时还将邮件的内容类型设置为text/plain。如果邮件的内容类型不是文本的,则需要通过setContent方法来设置内容类型。
第二部分用于获取邮件的相关信息,在接收邮件的时候使用:
Flags getFlags(),用于获取与邮件相关的标记属性。
Folder getFolder(),用于获取该邮件所在的文件夹。
Address getFrom(),用于获取邮件的发送者。
int getMessageNumber(),用于获取邮件的编号,该编号是邮件系统设置的。
Address[] getAllRecipients(),获取邮件的所有接收者。
java.util.Date getReceivedDate(),用于获取邮件的接收时间。
Address[] getRecipients(Message.RecipientType type),用于获取指定接收类型的接收者,参数用于确定接收者的类型。
Address[] getReplyTo(),用于获取邮件的回复者,也就是邮件要给哪些人回复。
java.util.Date getSentDate(),用于获取邮件的发送时间。
java.lang.String getSubject(),用于获取邮件的主题。
1.2.3 TransportTransport是一个抽象类,用于邮件的发送,主要的方法有:
public static void send(Message msg) throws MessagingException,用于发送邮件,参数就是要发送的邮件本身,该方法是一个静态方法,不需要实例化对象,可以直接使用。
public static void send(Message msg, Address[] addresses) throws MessagingException,也是用于发送邮件,有两个参数,第一个参数是要发送的邮件本身,第二个参数是邮件发送的目的地。该方法会忽略在邮件中设置的接收者。
1.2.4 InternetAddressInternetAddress把用户的E-mail地址映射为Internet地址。得到的邮件发送者和接收者通常都是字符串,但是在Message中确定邮件的接收者和发送者,以及在发送邮件时候使用的都是Address的对象。InternetAddress是Address的派生类,可以把字符串转换成InternetAddress类的对象。
构造函数如下:
InternetAddress( ),无参数的默认构造函数。
InternetAddress(java.lang.String address),把一个字符串构造成一个InternetAddress,用得比较多。
InternetAddress(java.lang.String address, java.lang.String personal),使用字符串和个人姓名构造一个InternetAddress。
InternetAddress(java.lang.String address, java.lang.String personal, java.lang.String charset),使用字符串和个人姓名构造一个InternetAddress对象,名字的编码方式是第三个参数确定的。
要设置该对象所表示的Internet地址,可以通过下面的方法:
void setAddress(java.lang.String address),参数确定了地址。
如果想把Internet地址转换成字符串,则使用下面的方法:
java.lang.String toString()
1.3 WebLogic中邮件会话的配置
在介绍邮件发送和邮件接收程序之前,需要在WebLogic中配置邮件会话的相关信息。需要配置所使用的发送邮件服务器和接收邮件服务器。在WebLogic中的配置过程如下:
(1)进入到WebLogic Server的控制台;
(2)在控制台的左下方选择【Domain Structure】→【Service】→【Mail Sessions】;
(3)在控制台的左上方点击【Lock & Edit】;
(3)在界面的右边点击【New】;
(4)在接下来的过程中需要分别输入下面的信息:
会话的名字(Name):MailSession。
会话的JNDI名字(JNDIName):MailSession;会话的JNDI名字可以和会话的名字相同。
会话相关的属性:
mail.pop3.host = 218.25.154.4 (应该写你所使用的邮件服务器的IP地址)
mail.transport.protocol = smtp (发送)
mail.user = lixucheng
mail.smtp.host = 218.25.154.6
mail.store.protocol = pop3(接收)
其中mail.pop3.host是所使用的接收邮件服务器,mail.transport.protocol是发送邮件所使用的协议,mail.user是发送邮件和接收邮件时候的用户名,mail.smtp.host是所使用的发送邮件服务器,mail.store.protocol是检索邮件所使用的协议。
输入完这些信息之后,点击【Save】,创建该邮件会话。
(5)把邮件会话部署到相应的服务器上:选择【Targets】页面,从服务器列表中选择相应的服务器,然后点击【Save】,就完成邮件会话的配置了。要让之前的配置起作用,需要点击左上角的【Activate Changes】(参见图1.2和图1.3)。
1.4 邮件发送示例程序
发送邮件的基本过程如下:
(1)得到会话对象
(2)构造邮件对象
(3)发送邮件
图1.2 邮件会话的配置
图1.3 把会话部署到相应的服务器上
1.4.1 得到会话对象
这里使用前面在WebLogic中配置好的邮件会话,所以首先要获取这个会话。下面的代码完成获取邮件会话的功能:
//获取上下文环境
Context ctx = new InitialContext();
//从JNDI中查找会话MailSession
Session mailSession = (Session) ctx.lookup("MailSession");
其中,MailSession是我们在前面配置的邮件会话中的JNDI名字。
如果不使用配置好的邮件会话,可以通过创建Properties对象设置相关会话属性,然后,通过Session.getInstance(propoties, null)创建会话对象。
1.4.2 构造邮件对象
发送一封邮件通常需要确定邮件发送者、邮件接收者、邮件的主题和邮件的内容,有时候还需要发送附件。这里先不考虑附件。其他的条件通过JSP界面接收,下面是构造邮件的代码:
//获取相关参数
String to = request.getParameter("to");
String subject = request.getParameter("subject");
String from = request.getParameter("from");
String message = request.getParameter("message");
to = new String(to.getBytes("8859_1"));
subject = new String(subject.getBytes("8859_1"));
from = new String(from.getBytes("8859_1"));
//创建消息对象
Message msg = new MimeMessage(mailSession);
//把邮件地址映射到Internet地址上
InternetAddress dest = new InternetAddress(to);
//设置消息内容
msg.setFrom(new InternetAddress(from));
msg.setSubject(subject);
msg.setRecipient(Message.RecipientType.TO, dest);
msg.setContent(message, "text/plain");
首先,通过request对象的getParameter方法获取邮件接收者、邮件发送者、邮件主题和邮件内容。然后,创建Message的对象。最后,通过Message的setXXX方法设置邮件的相关信息。
1.4.3 发送邮件
通过Transport的send(Message msg)方法发送构建好的消息。
Transport.send(msg);
1.4.4 完整的代码
该实例的代码分为两部分,第一部分是发送邮件的界面,第二部分是发送邮件的处理代码。完整的代码如下:
1.4.5 程序的运行结果
直接访问mailsender.jsp文件时候的结果,这时候使用的请求方式是get,所以显示邮件发送的界面,参见图1.4。
图1.4 邮件发送的界面
图1.5显示了邮件发送成功的界面。填写完邮件的信息之后,提交给服务器,这时候的请求方式是Post。首先获取用户输入的与邮件相关的信息,然后把邮件发送出去。
图1.5 邮件发送成功的界面
1.4.6 发送HTML格式的邮件
HTML格式的邮件发送过程与前面文本类型邮件的发送过程基本相同,不同的是需要读取邮件的HTML文件,同时,需要设置邮件内容的格式。
先获取邮件的内容:
String content = "";
String file = "source.htm";
//要发送的html文件
String line = "";
FileReader f = new FileReader(file);
BufferedReader b = new BufferedReader(f);
While((line = b.readline()) != null)
content += line;
然后设置邮件的内容,把邮件的内容添加到邮件对象中:
message.setContent(content, "text/html");
1.4.7 发送带附件的邮件
我们经常需要发送带附件的邮件。带附件的邮件发送过程与前面介绍的普通邮件发送过程基本相同,不同的是邮件本身的构造比较麻烦。下面我们介绍如何发送带附件的邮件,有些代码和前面是相同的,所以这里只介绍与前面不同的代码。
创建一个带附件的邮件的过程如下:
创建BodyPart对象,该对象表示邮件的主体或者邮件的附件。
把所有的BodyPart对象添加到MimeMultipart对象中。
把MimeMultipart对象添加到MimeMessage对象中。
(1)BodyPart对象的创建
BodyPart是抽象类,具体使用的是MimeBodyPart类的对象,而MimeBodyPart是BodyPart类的派生类。组成邮件的各部分都是MimeBodyPart的对象。
首先,创建邮件的主体部分:
BodyPart messagebody = new MimeBodyPart();
//创建BodyPart类的对象
messagebody.setText("带附件的邮件,注意查看附件!");
//设置邮件的内容
这样就创建了邮件的第一部分,也就是邮件的主体部分,下面创建邮件的附件部分。其中filename表示附件的名字。
BodyPart attachment = new MimeBodyPart();
//创建BodyPart对象,用于表示邮件的附件
String filename = "filename";
//要发送的邮件附件的名字
DataSource ds = new FileDataSource(filename);
//创建数据源,数据源指向附件文件
attachment.setDataHandler(new DataHandler(ds));
//把附件BodyPart对象指向ds
attachment.setFileName(filename);
//设置附件的文件名
这样把邮件的主体部分和邮件的附件部分全部创建完了。
(2)把Body对象添加到MimeMultipart对象中
邮件的各个组成部分不能独立添加到MimeMessage对象中,可以添加到其中的只能是Multipart的对象,而组成邮件的各个部分可以分别添加到Multipart对象中。下列代码完成的功能是把前面创建好的邮件的两部分添加到Multipart对象中。
Multipart multipart = new MimeMultipart();
//创建MimeMultipart对象
multipart.addBodyPart(messagebody);
//把messagebody添加到multipart对象中
multipart.addBodyPart(attachment);
//把附件添加到multipart中
(3)把MimeMultipart对象添加到MimeMessage中
把MimeMultipart对象添加到MimeMessage对象中的方法非常简单,与前面介绍的基本相同。
message.setContent(multipart);
把MimeMultipart对象添加到message中之后,邮件的构造就完成了。邮件的发送过程与前面介绍的简单邮件的发送过程相同。
1.5 邮件接收示例程序
邮件接收的基本过程如下:
获得邮件会话;
创建Store对象;
连接到邮件服务器;
得到默认的文件夹;
得到所要操作的文件夹;
打开文件夹,可以获取与文件夹相关的信息;
获取文件夹中的所有邮件;
获取邮件相关的信息。
1.5.1 获得邮件会话
与发送邮件相同,接收邮件也需要获取相关的邮件会话。可以使用在WebLogic中配置好的邮件会话,也可以通过Properties对象保存邮件会话相关的信息,然后通过该Properties对象创建邮件会话。下面的代码使用的是WebLogic中配置好的邮件会话。在运行程序之前,需要保证配置好邮件会话。
Context ctx = new InitialContext();
//创建上下文环
Session mailsession = (Session)ctx.lookup("MailSession");
//得到邮件会话
1.5.2 创建Store对象
要检索邮件服务器上的邮件,需要连接到邮件服务器,与邮件服务器的连接可以通过Store对象来完成。Store对象是通过Session的getStore方法创建的。
Store store = mailsession.getStore();
//创建存储对象
1.5.3 连接到邮件服务器
连接到邮件服务器,需要知道邮件服务器的地址、连接邮件服务器的用户名以及该用户的口令。连接过程是通过Store对象的connect方法完成的。该方法需要三个参数,第一个参数为邮件服务器的地址、域名或者IP地址,第二个参数是用户名,第三个参数是口令。
store.connect("218.25.154.4","lixucheng","123456");
//连接到邮件服务器
1.5.4 得到默认的文件夹
连接到邮件服务器之后,可以得到一个默认的文件夹,通过它可以获得其他的文件夹。默认文件夹是通过Store对象的getDefaultFolder方法得到的。文件夹是邮件的存储地方。
Folder defaultFolder = store.getDefaultFolder();
//得到默认的文件夹
1.5.5 得到所要操作的文件夹
要访问邮件,需要得到邮件所在的文件夹,可以通过默认文件夹得到该文件夹,defaultFolder的list方法可以得到所有的文件夹。
Folder[] allfolder = defaultFolder.list();
也可以通过Store对象的getFolder方法得到想要的文件夹。该方法需要一个参数,用于指定要打开的文件夹的名字。如果想得到INBOX文件夹,可以通过下面的方法。
Folder folder = store.getFolder("INBOX");
1.5.6 打开文件夹,可以获取与文件夹相关的信息
可以通过Folder对象的open方法打开文件夹。该方法需要一个参数,指定了文件夹的打开方式。文件夹的打开方式有两种:READ_ONLY和READ_WRITE。如果只是检索邮件信息而不改变其状态或内容,则应该使用READ_ONLY打开方式。下面的代码是分别打开邮箱中的文件夹,并获得文件夹的相关信息。
for(int i = 0;i<allfolder.length;i++)
{
allfolder[i].open(Folder.READ_ONLY);
out.println(allfolder[i].getName());
out.println("/t"+allfolder[i].getMessageCount());
out.println("/t"+allfolder[i].getNewMessageCount());
out.println("/t"+allfolder[i].getUnreadMessageCount());
out.println("<br>");
allfolder[i].close(false);
}
其中,getName( )方法用于获取文件夹的名字,getMessageCount得到文件夹中邮件的数量,getNewMessageCount得到文件夹中新邮件的数量,getUnreadMessageCount得到文件夹中未读邮件的数量。读取文件夹的信息之后,需要关闭文件夹。
1.5.7 获取文件夹中的所有邮件
要获取文件夹中的邮件,首先要打开文件夹。获取邮件是通过文件夹的getMessages方法来完成的。
defaultFolder = allfolder[0];
defaultFolder.open(Folder.READ_ONLY);
//打开该文件夹
Message[] messages = defaultFolder.getMessages();
//得到邮件信息
1.5.8 获取邮件相关的信息
得到邮件对象Message之后,就可以获取邮件相关的信息以及邮件的内容了。下面的代码输出了邮件的相关信息:
Message message = messages[j];
out.println("<tr><td>"+message.getFrom()[0].toString()+"</td>");
out.println("<td>"+message.getSubject()+"</td>");
out.println("<td>"+message.getSentDate().toLocaleString()+"</td>");
out.println("<td>"+message.getSize()+"</td></tr>");
out.println("<td>"+(String)message.getContent()+"</td></tr>");
其中,getFrom( )得到邮件的发送者,getSubject得到邮件的主题,getSentDate得到邮件的发送时间,getSize得到邮件的大小,getContent得到邮件的内容。
1.5.9 邮件的状态
邮件可以处于不同的状态,使用系统标记来标识邮件的状态,可以用Flags.Flag类中的静态成员变量来标记。共有七种:ANSWERED,DELETED,DRAFT,FLAGGED,RECENT,SEEN和USER。
ANSWERED表示该邮件已经被回复,当客户端对该信息回复后可以把该邮件标记为ANSWERED。
DELETED表示该邮件已经被删除,对某个文件夹的删除操作将删除该文件夹中所有标记为DELETED的邮件。
DRAFT表示该邮件是草稿,这样就不会被发送。
FLAGGED标记没有定义明确的语义,客户端可以根据自己的需要来使用该标记。
RECENT表示该邮件是最近一段时间的,是上次文件夹打开之后到达的邮件。
SEEN表示该邮件被查看过,当该邮件的内容以某种方式被用户得到后该邮件标记为SEEN,一般情况下调用Message的getInputStream和getContent方法会使得该标识得到设置。
USER是一个特殊的标志,表示文件夹支持用户自定义的标志。
getFlags( )可以得到邮件的标记,该方法返回的是Flags对象,要获得所有的标记,通过Flags对象的getSystemFlags方法获得具体标记的集合,而具体标记是Flags.Flag的对象。
isSet方法用于判断该邮件是否被设置了某个标记,而参数是某个给定的标志。如果邮件被设置了该标记,返回值是true;如果邮件没有被设置该标记,返回值为false。该方法通常用于判断邮件的状态。
setFlag用于设置邮件的状态,共有两个参数。第一个参数是所设置的标识的类型,第二个参数是值,取值为true或者false。
setFlags方法与setFlag方法的作用大致相同,不同之处在于可以同时设置多个标识。
1.5.10 接收邮件的完整代码
接收邮件的完整代码如下:
<%@ page import = "java.util.*,
javax.mail.*,
javax.mail.internet.*,
javax.naming.*"
%>
<%@ page contentType = "text/html;charset = gb2312"%>
<!doctype html public "-//w3c/dtd HTML 4.0//en">
<html>
<head>
<title>Mail Sender JSP</title>
</head>
<body>
<%
try
{
Context ctx = new InitialContext();
//创建上下文环
Session mailsession = (Session)ctx.lookup("MailSession");
//得到邮件会话
Store store = mailsession.getStore();
//创建存储对象
store.connect("218.25.154.4","lixucheng","123456");
//连接到邮件服务器
Folder defaultFolder = store.getDefaultFolder();
//得到默认的文件夹
Folder[] allfolder = defaultFolder.list();
for(int i = 0;i<allfolder.length;i++)
{
allfolder[i].open(Folder.READ_ONLY);
out.println(allfolder[i].getName());
out.println("/t"+allfolder[i].getMessageCount());
out.println("/t"+allfolder[i].getNewMessageCount());
out.println("/t"+allfolder[i].getUnreadMessageCount());
out.println("<br>");
allfolder[i].close(false);
}
defaultFolder = allfolder[0];
defaultFolder.open(Folder.READ_ONLY);
//打开默认文件夹
Message[] messages = defaultFolder.getMessages();
//得到邮件信息
out.println("邮件的数量:"+messages.length);
if(messages.length>0)
{
out.println("<table>");
out.println("<tr><td>发送者</td><td>主题</td><td>接收时间</td><td>大小</td><td>内容</td></hr>");
for(int j = 0;j<messages.length;j++)
{
Message message = messages[j];
out.println("<tr><td>"+message.getFrom()[0].toString()+"</td>");
out.println("<td>"+message.getSubject()+"</td>");
out.println("<td>"+message.getSentDate().toLocaleString()+"</td>");
out.println("<td>"+message.getSize()+"</td></tr>");
out.println("<td>"+(String)message.getContent()+"</td></tr>");
}
out.println("</table>");
}
defaultFolder.close(false);
store.close();
}catch(Exception e)
{
out.println(e.toString());
e.printStackTrace();
}
%>
</body>
</html>
1.6 实验
1.6.1 实验目的
掌握JavaMail API中的主要接口和类,能够实现邮件的发送和接收。
1.6.2 实验内容
编写两个JSP文件,分别用于邮件的发送和接收。
1.6.3 实验过程
(1)先配置邮件会话,把邮件服务器的相关信息配置到邮件会话中。
(2)编写发送邮件的文件。
(3)编写接收邮件的文件。
(4)部署到WebLogic上运行。
办法一:既然自己开发发邮件程序,也是自己的邮件服务器,不妨修改一下附件大小设置
办法二:拆分附件,分多个邮件发送
办法三:发送HTML格式邮件,原本作为附件的文件,通过网站发布,在邮件中做上超链接
办法四:只针对exchange,可利用公用文件夹发布文件
JavaMail
在Java EE应用程序中,经常需要发送E-mail。Java EE框架为应用提供了JavaMail接口,通过JavaMail相关的接口可以读取邮件服务器的邮件,并且可以完成邮件的发送过程。
本章的主要内容包括:
E-mail体系结构
JavaMail API
如何使用JavaMail API发送邮件
如何使用JavaMail API接收邮件
1.1 E-mail体系结构
1.1.1 什么是E-mailE-mail是用户间或应用程序间交换信息的Internet标准。每个用户都有自己的网上邮箱,发送方把信息发送到自己的网上信箱,并声明信息的接收方;该信箱所在的“邮局”会把信息发送到接收方的“邮局”,接收方从接收方的“邮局”中自己的信箱获取信息。这样就完成了信息从发送方到接收方的传递。所以,要发送或者接收邮件首先应该有自己的邮箱。
E-mail消息可以包含普通文本,也可以包含更为复杂的多媒体数据类型和图像声音等。这样,用户就可以交换各种各样的信息。
每个E-mail消息的头信息中都包含消息的发出者、发送的目的地和其他相关信息。
1.1.2 E-mail体系结构
要完成消息的交互,需要几方面的支持:邮件发送客户端程序、邮件接收客户端程序、邮件发送服务器和邮件接收服务器,此外,还需要相关的通信协议。
邮件发送客户端程序和邮件接收客户端程序可以是相同的,例如经常使用的微软的Outlook既可以发送邮件,也可以接收邮件。
邮件发送服务器和邮件接收服务器也可以是相同的服务器。在与邮件服务器交互的过程中,主要完成两个动作,把邮件发送到邮件服务器,以及从邮件服务器读取邮件。所以,主要使用两类协议,分别进行邮件的发送和接收。
邮件从发送方到接收方的传递过程(参见图1.1)如下:
(1)邮件发送方通过邮件发送客户端把邮件发送到发送方的邮件服务器,在发送的过程中需要用到SMTP协议。
(2)发送方的邮件服务器把邮件发送到接收方的邮件服务器,使用的协议也是SMTP。
(3)邮件接收方从接收方邮件服务器接收邮件,使用POP3协议或者IMAP协议。
邮件
发送方
发送方邮件
服务器
接收方邮件
服务器
邮件
接收方
SMTP
SMTP
IMAP
POP3
图1.1 邮件从发送方到接收方的传递过程
1.1.3 E-mail相关的协议
简单邮件传输协议(SMTP)
在邮件发送方把邮件发送到发送方邮件服务器的时候,需要用到简单邮件传输协议(Simple Mail Transport Protocol,简称SMTP),发送方邮件服务器把邮件发送到接收方邮件服务器的时候,也要用到SMTP。SMTP是应用程序与邮件服务器通信并发送邮件的Internet标准,SMTP通信基于TCP协议端口25之上。
邮箱协议(POP3)
邮件接收方从接收方邮件服务器接收邮件的时候,需要使用检索协议,可以使用POP3或者IMAP。POP3是Post Office Protocol的简称,是用于接收方从邮件服务器上检索E-mail消息的协议,工作在TCP协议端口110之上。
Internet消息访问协议(IMAP)
IMAP是Internet Message Access Protocol的简称,与POP3基本相同。完成的主要功能是从邮件服务器接收邮件,使用的端口是293。
1.1.4 什么是Java Mail在Java EE应用中,经常需要通过E-mail与用户进行交互,主要是与邮件服务器的交互,例如向邮件服务器发送邮件,或者从邮件服务器接收邮件。如果是用户之间直接进行交互可以使用邮件客户端程序,例如微软的Outlook。如果想在应用程序中发送邮件,就不能直接使用通用的客户端了,需要编写自己专门的邮件发送和接收代码,并且需要与邮件服务器进行交互。可以通过Socket编程,使用相关的协议完成,但是这个过程非常复杂。而Java Mail提供了比较便利的解决方案。
JavaMail是Java EE中的标准API,是对邮件服务器访问过程的封装。使用JavaMail API则不需要编写与邮件服务器交互的详细过程,只需要调用相关接口即可。在接口中封装了与邮件服务器交互的详细过程。
本章的主要内容是介绍如何通过JavaMail API完成邮件的发送和接收。
1.2 JavaMail API JavaMail API主要包括四个部分:Session,Message,Transport和InternetAddress。下面分别进行介绍。
1.2.1 SessionSession定义了全局的和每个用户的与邮件相关的属性,这些属性详细说明了客户机和服务器如何交流信息。Session中定义的属性如下:
mail.store.protocol:确定检索邮件所使用的协议。可以是IMAP(接收),也可以是POP3。
mail.transport.protocol:确定发送邮件所使用的协议,可以是SMTP(发送)。
mail.host:确定邮件服务器的主机名。
mail.user:确定检索邮件或者发送邮件的用户名。
mail.protocol.host:确定具体的发送邮件服务器或者接收邮件服务器。有时候发送邮件服务器和接收邮件服务器使用的主机不同,这时候需要详细指定各个协议使用的主机,如果不指定,则使用mail.host所确定的主机。
mail.protocol.user:为登录特定邮件服务器所使用的用户名,如果没有指定,使用mail.user所指定的用户。
mail.from:为邮件指定默认的回复地址,如果没有指定,使用mail.user所指定的用户。
1.2.2 MessageMessage表示单个邮件消息,其属性包括消息类型、地址信息和所定义的目录结构。但是Message类是一个抽象类,必须实现它的一个子类。通常使用MimeMessage,它是Message类的一个派生类。
Message类的主要方法有两部分,第一部分主要在发送邮件的时候使用,用于设置邮件的相关信息,包括邮件的发送者、接收者、主题和发送时间等。这些方法如下:
setFrom(),用于设置邮件的发送者,值从“mail.user”属性中获取,如果这个值是默认的,则使用系统属性“user.name”。
setFrom(Address address),与上一个方法的作用相同,值是通过参数确定的,是Address的对象,通常使用其实现者InternetAddress的对象作为参数。
addFrom(Address[] addresses),在已有的邮件发送者中添加其他的邮件发送者,参数是要添加的邮件发送者的地址。
setSubject(String subject),用于设置邮件的标题。
setContent(String contentType),用于设置邮件的内容类型。
setSentDate(java.util.Date date),用于设置邮件发送的时间。
setRecipient(Message.RecipientType type, Address address),用于设置邮件的接收者。有两个参数,第一个参数是接收者的类型,第二个参数是接收者。接收者类型可以是Message.RecipientType.TO,Message.RecipientType.CC和Message.RecipientType.BCC,TO表示主要接收人,CC表示抄送人,BCC表示秘密抄送人。接收者与发送者一样,通常使用InternetAddress的对象。
addRecipient(Message.RecipientType type, Address address),用于添加邮件的接收者,其参数与setRecipient方法的基本相同。
setRecipients(Message.RecipientType type, Address[] addresses),作用和setRecipient基本相同,区别在于该方法可以同时设置多个邮件的接收者。
addRecipients(Message.RecipientType type, Address[] addresses),用于添加邮件接收者,可以同时添加多个接收者。
setReplyTo(Address[] addresses),设置邮件的回复地址,参数用于确定要回复的地址。
setText(String text),用于设置邮件的文本,同时还将邮件的内容类型设置为text/plain。如果邮件的内容类型不是文本的,则需要通过setContent方法来设置内容类型。
第二部分用于获取邮件的相关信息,在接收邮件的时候使用:
Flags getFlags(),用于获取与邮件相关的标记属性。
Folder getFolder(),用于获取该邮件所在的文件夹。
Address getFrom(),用于获取邮件的发送者。
int getMessageNumber(),用于获取邮件的编号,该编号是邮件系统设置的。
Address[] getAllRecipients(),获取邮件的所有接收者。
java.util.Date getReceivedDate(),用于获取邮件的接收时间。
Address[] getRecipients(Message.RecipientType type),用于获取指定接收类型的接收者,参数用于确定接收者的类型。
Address[] getReplyTo(),用于获取邮件的回复者,也就是邮件要给哪些人回复。
java.util.Date getSentDate(),用于获取邮件的发送时间。
java.lang.String getSubject(),用于获取邮件的主题。
1.2.3 TransportTransport是一个抽象类,用于邮件的发送,主要的方法有:
public static void send(Message msg) throws MessagingException,用于发送邮件,参数就是要发送的邮件本身,该方法是一个静态方法,不需要实例化对象,可以直接使用。
public static void send(Message msg, Address[] addresses) throws MessagingException,也是用于发送邮件,有两个参数,第一个参数是要发送的邮件本身,第二个参数是邮件发送的目的地。该方法会忽略在邮件中设置的接收者。
1.2.4 InternetAddressInternetAddress把用户的E-mail地址映射为Internet地址。得到的邮件发送者和接收者通常都是字符串,但是在Message中确定邮件的接收者和发送者,以及在发送邮件时候使用的都是Address的对象。InternetAddress是Address的派生类,可以把字符串转换成InternetAddress类的对象。
构造函数如下:
InternetAddress( ),无参数的默认构造函数。
InternetAddress(java.lang.String address),把一个字符串构造成一个InternetAddress,用得比较多。
InternetAddress(java.lang.String address, java.lang.String personal),使用字符串和个人姓名构造一个InternetAddress。
InternetAddress(java.lang.String address, java.lang.String personal, java.lang.String charset),使用字符串和个人姓名构造一个InternetAddress对象,名字的编码方式是第三个参数确定的。
要设置该对象所表示的Internet地址,可以通过下面的方法:
void setAddress(java.lang.String address),参数确定了地址。
如果想把Internet地址转换成字符串,则使用下面的方法:
java.lang.String toString()
1.3 WebLogic中邮件会话的配置
在介绍邮件发送和邮件接收程序之前,需要在WebLogic中配置邮件会话的相关信息。需要配置所使用的发送邮件服务器和接收邮件服务器。在WebLogic中的配置过程如下:
(1)进入到WebLogic Server的控制台;
(2)在控制台的左下方选择【Domain Structure】→【Service】→【Mail Sessions】;
(3)在控制台的左上方点击【Lock & Edit】;
(3)在界面的右边点击【New】;
(4)在接下来的过程中需要分别输入下面的信息:
会话的名字(Name):MailSession。
会话的JNDI名字(JNDIName):MailSession;会话的JNDI名字可以和会话的名字相同。
会话相关的属性:
mail.pop3.host = 218.25.154.4 (应该写你所使用的邮件服务器的IP地址)
mail.transport.protocol = smtp (发送)
mail.user = lixucheng
mail.smtp.host = 218.25.154.6
mail.store.protocol = pop3(接收)
其中mail.pop3.host是所使用的接收邮件服务器,mail.transport.protocol是发送邮件所使用的协议,mail.user是发送邮件和接收邮件时候的用户名,mail.smtp.host是所使用的发送邮件服务器,mail.store.protocol是检索邮件所使用的协议。
输入完这些信息之后,点击【Save】,创建该邮件会话。
(5)把邮件会话部署到相应的服务器上:选择【Targets】页面,从服务器列表中选择相应的服务器,然后点击【Save】,就完成邮件会话的配置了。要让之前的配置起作用,需要点击左上角的【Activate Changes】(参见图1.2和图1.3)。
1.4 邮件发送示例程序
发送邮件的基本过程如下:
(1)得到会话对象
(2)构造邮件对象
(3)发送邮件
图1.2 邮件会话的配置
图1.3 把会话部署到相应的服务器上
1.4.1 得到会话对象
这里使用前面在WebLogic中配置好的邮件会话,所以首先要获取这个会话。下面的代码完成获取邮件会话的功能:
//获取上下文环境
Context ctx = new InitialContext();
//从JNDI中查找会话MailSession
Session mailSession = (Session) ctx.lookup("MailSession");
其中,MailSession是我们在前面配置的邮件会话中的JNDI名字。
如果不使用配置好的邮件会话,可以通过创建Properties对象设置相关会话属性,然后,通过Session.getInstance(propoties, null)创建会话对象。
1.4.2 构造邮件对象
发送一封邮件通常需要确定邮件发送者、邮件接收者、邮件的主题和邮件的内容,有时候还需要发送附件。这里先不考虑附件。其他的条件通过JSP界面接收,下面是构造邮件的代码:
//获取相关参数
String to = request.getParameter("to");
String subject = request.getParameter("subject");
String from = request.getParameter("from");
String message = request.getParameter("message");
to = new String(to.getBytes("8859_1"));
subject = new String(subject.getBytes("8859_1"));
from = new String(from.getBytes("8859_1"));
//创建消息对象
Message msg = new MimeMessage(mailSession);
//把邮件地址映射到Internet地址上
InternetAddress dest = new InternetAddress(to);
//设置消息内容
msg.setFrom(new InternetAddress(from));
msg.setSubject(subject);
msg.setRecipient(Message.RecipientType.TO, dest);
msg.setContent(message, "text/plain");
首先,通过request对象的getParameter方法获取邮件接收者、邮件发送者、邮件主题和邮件内容。然后,创建Message的对象。最后,通过Message的setXXX方法设置邮件的相关信息。
1.4.3 发送邮件
通过Transport的send(Message msg)方法发送构建好的消息。
Transport.send(msg);
1.4.4 完整的代码
该实例的代码分为两部分,第一部分是发送邮件的界面,第二部分是发送邮件的处理代码。完整的代码如下:
<%@ page import = "java.util.*, javax.mail.*, javax.mail.internet.*, javax.naming.*" %> <%@ page contentType = "text/html;charset = gb2312"%> <html> <head> <title>Mail Sender JSP</title> </head> <body> <% if (request.getMethod().equals("POST")) { try { //获取相关参数 String to = request.getParameter("to"); String subject = request.getParameter("subject"); String from = request.getParameter("from"); String message = request.getParameter("message"); to = new String(to.getBytes("8859_1")); subject = new String(subject.getBytes("8859_1")); from = new String(from.getBytes("8859_1")); message = new String(message.getBytes("8859_1")); //获取上下文环境 Context ctx = new InitialContext(); //从JNDI中查找会话MailSession Session mailSession = (Session) ctx.lookup("MailSession"); //创建消息对象 Message msg = new MimeMessage(mailSession); //把邮件地址映射到Internet地址上 InternetAddress dest = new InternetAddress(to); //设置消息内容 msg.setFrom(new InternetAddress(from)); msg.setSubject(subject); msg.setRecipient(Message.RecipientType.TO, dest); msg.setContent(message, "text/plain"); //通过Transport类发送消息 Transport.send(msg); out.println("<h2>到 " + to + "的邮件发送成功!<h2>"); } catch (Exception e) { out.println(e); } } else { %> <h1>发送邮件!</h1> <form method = "post" action = "mailsender.jsp"> To :<input type = "text" name = "to" size = 16><p> From :<input type = "text" name = "from" size = 16><p> Subject :<input type = "text" name = "subject" size = 16><p> Message :<input type = "text" name = "message" size = 16> <p> <input type = "submit" value = "Submit" name = "Command"> <% } %> </body> </html>
1.4.5 程序的运行结果
直接访问mailsender.jsp文件时候的结果,这时候使用的请求方式是get,所以显示邮件发送的界面,参见图1.4。
图1.4 邮件发送的界面
图1.5显示了邮件发送成功的界面。填写完邮件的信息之后,提交给服务器,这时候的请求方式是Post。首先获取用户输入的与邮件相关的信息,然后把邮件发送出去。
图1.5 邮件发送成功的界面
1.4.6 发送HTML格式的邮件
HTML格式的邮件发送过程与前面文本类型邮件的发送过程基本相同,不同的是需要读取邮件的HTML文件,同时,需要设置邮件内容的格式。
先获取邮件的内容:
String content = "";
String file = "source.htm";
//要发送的html文件
String line = "";
FileReader f = new FileReader(file);
BufferedReader b = new BufferedReader(f);
While((line = b.readline()) != null)
content += line;
然后设置邮件的内容,把邮件的内容添加到邮件对象中:
message.setContent(content, "text/html");
1.4.7 发送带附件的邮件
我们经常需要发送带附件的邮件。带附件的邮件发送过程与前面介绍的普通邮件发送过程基本相同,不同的是邮件本身的构造比较麻烦。下面我们介绍如何发送带附件的邮件,有些代码和前面是相同的,所以这里只介绍与前面不同的代码。
创建一个带附件的邮件的过程如下:
创建BodyPart对象,该对象表示邮件的主体或者邮件的附件。
把所有的BodyPart对象添加到MimeMultipart对象中。
把MimeMultipart对象添加到MimeMessage对象中。
(1)BodyPart对象的创建
BodyPart是抽象类,具体使用的是MimeBodyPart类的对象,而MimeBodyPart是BodyPart类的派生类。组成邮件的各部分都是MimeBodyPart的对象。
首先,创建邮件的主体部分:
BodyPart messagebody = new MimeBodyPart();
//创建BodyPart类的对象
messagebody.setText("带附件的邮件,注意查看附件!");
//设置邮件的内容
这样就创建了邮件的第一部分,也就是邮件的主体部分,下面创建邮件的附件部分。其中filename表示附件的名字。
BodyPart attachment = new MimeBodyPart();
//创建BodyPart对象,用于表示邮件的附件
String filename = "filename";
//要发送的邮件附件的名字
DataSource ds = new FileDataSource(filename);
//创建数据源,数据源指向附件文件
attachment.setDataHandler(new DataHandler(ds));
//把附件BodyPart对象指向ds
attachment.setFileName(filename);
//设置附件的文件名
这样把邮件的主体部分和邮件的附件部分全部创建完了。
(2)把Body对象添加到MimeMultipart对象中
邮件的各个组成部分不能独立添加到MimeMessage对象中,可以添加到其中的只能是Multipart的对象,而组成邮件的各个部分可以分别添加到Multipart对象中。下列代码完成的功能是把前面创建好的邮件的两部分添加到Multipart对象中。
Multipart multipart = new MimeMultipart();
//创建MimeMultipart对象
multipart.addBodyPart(messagebody);
//把messagebody添加到multipart对象中
multipart.addBodyPart(attachment);
//把附件添加到multipart中
(3)把MimeMultipart对象添加到MimeMessage中
把MimeMultipart对象添加到MimeMessage对象中的方法非常简单,与前面介绍的基本相同。
message.setContent(multipart);
把MimeMultipart对象添加到message中之后,邮件的构造就完成了。邮件的发送过程与前面介绍的简单邮件的发送过程相同。
1.5 邮件接收示例程序
邮件接收的基本过程如下:
获得邮件会话;
创建Store对象;
连接到邮件服务器;
得到默认的文件夹;
得到所要操作的文件夹;
打开文件夹,可以获取与文件夹相关的信息;
获取文件夹中的所有邮件;
获取邮件相关的信息。
1.5.1 获得邮件会话
与发送邮件相同,接收邮件也需要获取相关的邮件会话。可以使用在WebLogic中配置好的邮件会话,也可以通过Properties对象保存邮件会话相关的信息,然后通过该Properties对象创建邮件会话。下面的代码使用的是WebLogic中配置好的邮件会话。在运行程序之前,需要保证配置好邮件会话。
Context ctx = new InitialContext();
//创建上下文环
Session mailsession = (Session)ctx.lookup("MailSession");
//得到邮件会话
1.5.2 创建Store对象
要检索邮件服务器上的邮件,需要连接到邮件服务器,与邮件服务器的连接可以通过Store对象来完成。Store对象是通过Session的getStore方法创建的。
Store store = mailsession.getStore();
//创建存储对象
1.5.3 连接到邮件服务器
连接到邮件服务器,需要知道邮件服务器的地址、连接邮件服务器的用户名以及该用户的口令。连接过程是通过Store对象的connect方法完成的。该方法需要三个参数,第一个参数为邮件服务器的地址、域名或者IP地址,第二个参数是用户名,第三个参数是口令。
store.connect("218.25.154.4","lixucheng","123456");
//连接到邮件服务器
1.5.4 得到默认的文件夹
连接到邮件服务器之后,可以得到一个默认的文件夹,通过它可以获得其他的文件夹。默认文件夹是通过Store对象的getDefaultFolder方法得到的。文件夹是邮件的存储地方。
Folder defaultFolder = store.getDefaultFolder();
//得到默认的文件夹
1.5.5 得到所要操作的文件夹
要访问邮件,需要得到邮件所在的文件夹,可以通过默认文件夹得到该文件夹,defaultFolder的list方法可以得到所有的文件夹。
Folder[] allfolder = defaultFolder.list();
也可以通过Store对象的getFolder方法得到想要的文件夹。该方法需要一个参数,用于指定要打开的文件夹的名字。如果想得到INBOX文件夹,可以通过下面的方法。
Folder folder = store.getFolder("INBOX");
1.5.6 打开文件夹,可以获取与文件夹相关的信息
可以通过Folder对象的open方法打开文件夹。该方法需要一个参数,指定了文件夹的打开方式。文件夹的打开方式有两种:READ_ONLY和READ_WRITE。如果只是检索邮件信息而不改变其状态或内容,则应该使用READ_ONLY打开方式。下面的代码是分别打开邮箱中的文件夹,并获得文件夹的相关信息。
for(int i = 0;i<allfolder.length;i++)
{
allfolder[i].open(Folder.READ_ONLY);
out.println(allfolder[i].getName());
out.println("/t"+allfolder[i].getMessageCount());
out.println("/t"+allfolder[i].getNewMessageCount());
out.println("/t"+allfolder[i].getUnreadMessageCount());
out.println("<br>");
allfolder[i].close(false);
}
其中,getName( )方法用于获取文件夹的名字,getMessageCount得到文件夹中邮件的数量,getNewMessageCount得到文件夹中新邮件的数量,getUnreadMessageCount得到文件夹中未读邮件的数量。读取文件夹的信息之后,需要关闭文件夹。
1.5.7 获取文件夹中的所有邮件
要获取文件夹中的邮件,首先要打开文件夹。获取邮件是通过文件夹的getMessages方法来完成的。
defaultFolder = allfolder[0];
defaultFolder.open(Folder.READ_ONLY);
//打开该文件夹
Message[] messages = defaultFolder.getMessages();
//得到邮件信息
1.5.8 获取邮件相关的信息
得到邮件对象Message之后,就可以获取邮件相关的信息以及邮件的内容了。下面的代码输出了邮件的相关信息:
Message message = messages[j];
out.println("<tr><td>"+message.getFrom()[0].toString()+"</td>");
out.println("<td>"+message.getSubject()+"</td>");
out.println("<td>"+message.getSentDate().toLocaleString()+"</td>");
out.println("<td>"+message.getSize()+"</td></tr>");
out.println("<td>"+(String)message.getContent()+"</td></tr>");
其中,getFrom( )得到邮件的发送者,getSubject得到邮件的主题,getSentDate得到邮件的发送时间,getSize得到邮件的大小,getContent得到邮件的内容。
1.5.9 邮件的状态
邮件可以处于不同的状态,使用系统标记来标识邮件的状态,可以用Flags.Flag类中的静态成员变量来标记。共有七种:ANSWERED,DELETED,DRAFT,FLAGGED,RECENT,SEEN和USER。
ANSWERED表示该邮件已经被回复,当客户端对该信息回复后可以把该邮件标记为ANSWERED。
DELETED表示该邮件已经被删除,对某个文件夹的删除操作将删除该文件夹中所有标记为DELETED的邮件。
DRAFT表示该邮件是草稿,这样就不会被发送。
FLAGGED标记没有定义明确的语义,客户端可以根据自己的需要来使用该标记。
RECENT表示该邮件是最近一段时间的,是上次文件夹打开之后到达的邮件。
SEEN表示该邮件被查看过,当该邮件的内容以某种方式被用户得到后该邮件标记为SEEN,一般情况下调用Message的getInputStream和getContent方法会使得该标识得到设置。
USER是一个特殊的标志,表示文件夹支持用户自定义的标志。
getFlags( )可以得到邮件的标记,该方法返回的是Flags对象,要获得所有的标记,通过Flags对象的getSystemFlags方法获得具体标记的集合,而具体标记是Flags.Flag的对象。
isSet方法用于判断该邮件是否被设置了某个标记,而参数是某个给定的标志。如果邮件被设置了该标记,返回值是true;如果邮件没有被设置该标记,返回值为false。该方法通常用于判断邮件的状态。
setFlag用于设置邮件的状态,共有两个参数。第一个参数是所设置的标识的类型,第二个参数是值,取值为true或者false。
setFlags方法与setFlag方法的作用大致相同,不同之处在于可以同时设置多个标识。
1.5.10 接收邮件的完整代码
接收邮件的完整代码如下:
<%@ page import = "java.util.*,
javax.mail.*,
javax.mail.internet.*,
javax.naming.*"
%>
<%@ page contentType = "text/html;charset = gb2312"%>
<!doctype html public "-//w3c/dtd HTML 4.0//en">
<html>
<head>
<title>Mail Sender JSP</title>
</head>
<body>
<%
try
{
Context ctx = new InitialContext();
//创建上下文环
Session mailsession = (Session)ctx.lookup("MailSession");
//得到邮件会话
Store store = mailsession.getStore();
//创建存储对象
store.connect("218.25.154.4","lixucheng","123456");
//连接到邮件服务器
Folder defaultFolder = store.getDefaultFolder();
//得到默认的文件夹
Folder[] allfolder = defaultFolder.list();
for(int i = 0;i<allfolder.length;i++)
{
allfolder[i].open(Folder.READ_ONLY);
out.println(allfolder[i].getName());
out.println("/t"+allfolder[i].getMessageCount());
out.println("/t"+allfolder[i].getNewMessageCount());
out.println("/t"+allfolder[i].getUnreadMessageCount());
out.println("<br>");
allfolder[i].close(false);
}
defaultFolder = allfolder[0];
defaultFolder.open(Folder.READ_ONLY);
//打开默认文件夹
Message[] messages = defaultFolder.getMessages();
//得到邮件信息
out.println("邮件的数量:"+messages.length);
if(messages.length>0)
{
out.println("<table>");
out.println("<tr><td>发送者</td><td>主题</td><td>接收时间</td><td>大小</td><td>内容</td></hr>");
for(int j = 0;j<messages.length;j++)
{
Message message = messages[j];
out.println("<tr><td>"+message.getFrom()[0].toString()+"</td>");
out.println("<td>"+message.getSubject()+"</td>");
out.println("<td>"+message.getSentDate().toLocaleString()+"</td>");
out.println("<td>"+message.getSize()+"</td></tr>");
out.println("<td>"+(String)message.getContent()+"</td></tr>");
}
out.println("</table>");
}
defaultFolder.close(false);
store.close();
}catch(Exception e)
{
out.println(e.toString());
e.printStackTrace();
}
%>
</body>
</html>
1.6 实验
1.6.1 实验目的
掌握JavaMail API中的主要接口和类,能够实现邮件的发送和接收。
1.6.2 实验内容
编写两个JSP文件,分别用于邮件的发送和接收。
1.6.3 实验过程
(1)先配置邮件会话,把邮件服务器的相关信息配置到邮件会话中。
(2)编写发送邮件的文件。
(3)编写接收邮件的文件。
(4)部署到WebLogic上运行。
相关推荐
JavaMail是Java编程语言中用于处理电子邮件的API,它提供了丰富的功能,允许开发人员发送、接收和管理电子邮件。本篇文章将深入探讨JavaMail的核心概念、关键组件以及如何使用这两个特定的jar包——`jaf-1_1_1.zip`...
JavaMail 是一个开源库,它为Java程序员提供了一组API,用于处理电子邮件的发送和接收。这个"javamail使用demo示例"是JavaMail官方提供的一个实例集合,旨在帮助开发者更好地理解和应用JavaMail库。下面我们将深入...
很抱歉,根据您提供的信息,"javamail-lib"似乎与相声音频文件(例如郭德纲和于谦的表演)的列表相关,而不是与IT行业的JavaMail库直接关联。JavaMail是一个用于处理电子邮件的开源库,在Java编程环境中广泛使用,但...
JavaMail 是一个开源库,用于在Java应用程序中处理电子邮件。它提供了一组API,使得开发者可以方便地发送、接收和管理邮件。JavaMail API 支持SMTP、POP3、IMAP等多种邮件传输协议,同时也支持MIME标准,能处理复杂...
JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。这个库提供了一组API,使得开发者能够轻松地处理SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)等邮件服务。在...
JavaMail 是一个开源的 Java 库,用于在 Java 应用程序中实现电子邮件的发送和接收。这个库提供了丰富的 API,使得开发者可以方便地处理 SMTP、POP3 和 IMAP 协议,从而实现电子邮件的全面功能。在项目中集成 ...
JavaMail 是一个开源的Java库,它为Java程序员提供了处理电子邮件的能力。这个库允许开发者发送、接收、管理邮件,包括附件、HTML格式的邮件、多部分消息等。在JavaMail实例中,我们可以学习如何利用这个库来实现...
JavaMail是Java编程语言中用于处理电子邮件的API,它提供了丰富的功能,允许开发者发送、接收、存储和管理邮件。对于初学者来说,理解和掌握JavaMail组件的基本应用是至关重要的,因为这将帮助他们构建出能够处理...
props.put("mail.smtp.host", "smtp.example.com"); props.put("mail.smtp.port", "465"); // For SMTPS props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", ...
JavaMail邮件驱动是Java平台上的一个关键组件,用于在应用程序中发送和接收电子邮件。它是一个开源库,提供了与SMTP(简单邮件传输协议)、POP3(邮局协议版本3)和IMAP(因特网消息访问协议)等邮件服务器进行交互...
这个“简单javamail的实现(HelloWorld)”的教程将引导我们通过创建一个基础的JavaMail应用,这通常被称为“HelloWorld”示例,因为它标志着我们对JavaMail API的初步理解和使用。 JavaMail API 提供了广泛的类和...
JavaMail 是一个开源的 Java API,它允许 Java 程序员通过 SMTP、POP3 或 IMAP 协议发送和接收电子邮件。这个强大的库在企业级应用和服务器端编程中非常常见,因为它提供了处理邮件的强大功能,包括附件、HTML 内容...
JavaMail 是一个开源库,它提供了在 Java 应用程序中发送和接收电子邮件的功能。这个例子将探讨如何使用 JavaMail API 实现邮件的发送。在 IT 行业中,掌握 JavaMail 的使用对于构建需要电子邮件功能的应用至关重要...
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("recipient-email@example.com")); message.setSubject("Test Email"); message.setText("Hello, this is a test email sent using ...
JavaMail 是一个强大的开源库,用于在Java应用程序中处理电子邮件。它提供了丰富的API,使得开发者可以轻松地发送、接收和管理邮件。这个压缩包包含了JavaMail实现所需的所有关键jar文件,确保了邮件功能的完整性和...
JavaMail 是一个开源的 Java 库,用于处理电子邮件的发送和接收。它提供了与 SMTP、POP3 和 IMAP 协议交互的接口,是开发基于 Java 的电子邮件应用的基础。回执邮件是邮件服务中的一项功能,它允许发件人在发送邮件...
by (for example) casting a returned <code>Folder</code> object to a <code>com.sun.mail.imap.IMAPFolder</code> object. Similarly for <code>Store</code> and <code>Message</code> objects returned from ...
JavaMail 是一个开源的 Java API,它允许程序员通过编写 Java 代码来发送、接收和处理电子邮件。这个API 提供了广泛的邮件服务支持,包括 SMTP、POP3、IMAP 协议,以及 MIME 邮件格式。在JavaMail中,有两个核心的库...
JavaMail 是一个开源库,它允许Java开发者使用标准的SMTP(简单邮件传输协议)或ESMTP(扩展SMTP)协议发送邮件,同时也能通过IMAP(Internet消息访问协议)和POP3(邮局协议)接收邮件。这个示例将详细介绍如何在...