4JavaMail和Servlet.docx
- 文档编号:11750227
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:13
- 大小:39.80KB
4JavaMail和Servlet.docx
《4JavaMail和Servlet.docx》由会员分享,可在线阅读,更多相关《4JavaMail和Servlet.docx(13页珍藏版)》请在冰豆网上搜索。
4JavaMail和Servlet
《JavaWeb应用开发》教案
第4章JavaMail和Servlet
授课教师:
李赞红
课时:
2小时
●本章主要目的
⏹配置邮件服务器
⏹掌握JavaMailAPI
⏹发送邮件、接收邮件、管理邮件
●本章重点
⏹发送邮件、接收邮件、管理邮件
●本章难点
⏹掌握JavaMailAPI
1.回顾上一章:
[10分钟]
2.课程知识点讲解:
2.1.具体知识点1:
JAVAMAIL简介
1、JavaMailAPI是Sun公司开发的邮件API。
2、JavaMailAPI的结构本身证明了它的开发者的基本目标之一--软件开发的工作量应该取决于应用程序本身的复杂程度以及开发者所要求的控制程度。
换句话说,JavaMailAPI尽可能地保持简单。
乍看起来,JavaMailAPI所拥有的类总数以及类之间的关系可能让人误解为要花费漫长的学习时间。
实际上,一旦正式开始使用,你就会发现该API不失为在应用程序中加入健壮的邮件/通讯支持的简单工具。
2.2.具体知识点2:
ApacheJames服务器简介
1、JavaApache邮件服务器一般是指Apache组织开发的James,它是一个轻便的、安全的100%纯Java实现的邮件服务器。
2、James的设计目标:
a)James被设计为实现几个确定的目标。
比如它完全使用Java开发以便试映最大的轻便行;它提供了很多安全特性用于保护服务器的运行环境安全还提供了安全服务。
James是多线程的,它使用了很多Avalon架构提供的功能。
b)James提供了完善的服务,包括一个完全可以运行的Email服务器。
这些服务主要是有Macther和MailetAPI实现的,这两个API提供了Email检查和处理功能。
James支持标准的email协议(SMTP,POP3,IMAP),另外还提供了一些附加功能,它使用了松散耦合的插件设计方式使消息框架从协议中抽象出来。
这种设计方式非常有用,你可以把James当作一个通常的消息服务器或者为即时消息传输提供支持。
2.3.具体知识点3:
开发工具介绍
1、JavaJDK1.3以上版本,1.5最佳;
2、ApacheJames-2.1.2;
3、JavaMail-1.3;
4、jaf-1_0_2;
2.4.具体知识点3:
JavaMailAPI
1、JavaMail使用SMTP协议发送邮件,使用POP3和IMAP协议接收邮件;
2、JavaMail定义了一组接口、类和抽象类,用于支持邮件的接收和发送,主要的接口、类和抽象类如下:
a)javax.mail.Session:
Session类是JavaMailAPI最高层入口类,它最常用的方法用于为不同邮件协议控制和装载SPI(即ServiceProviderImplementation,译为服务提供接口),如Store类(代表邮箱)是通过Session类获得的。
b)javax.mail.Store:
Store类实现特定邮件协议上的读、写、监视、查找等操作(代表了邮箱)。
通过Store类可以访问Folder类(代表邮箱文件夹)。
c)javax.mail.Transport:
Transport类也是由服务提供者提供的类,实现用特定协议发送消息/邮件。
d)javax.mail.Folder:
Folder类用于分级组织邮件并提供访问email的能力,这个能力是通过获取Message类(代表邮件)的实例而实现的。
e)javax.mail.Message:
Message类模型化实际email消息的所有细节,如标题发送/接收地址、发送日期等等。
3、发送邮件的步骤:
a)获取Session的一个实例,该实例将作为构造Message对象的参数;
b)定义代表邮件的Message类的对象,设置好发件人、收件人、主题、内容、发送时间等信息;
c)通过Transport.send(Messagemsg)静态方法发送邮件。
4、接收邮件的步骤:
a)获取Session类的一个实例;
b)通过Storestore=Session.getStore(协议)方法获取代表邮件的Store对象;
c)调用store.connect(邮件主机,用户名,密码)方法连接邮件服务器;
d)通过Folderfolder=Store.getFolder(“INBOX”)获取邮件文件夹对象;
e)调用folder.open(Folder.READ_ONLY)打开邮件文件夹;
f)通过Messagemessage[]=folder.getMessages();获取邮件文件夹中的所有邮件。
2.5.具体知识点5:
Session类
1、过Session类是一个十分重要的类,Session类映射了客户端与Mail、Server之间的会话过程,利用Session类我们就可以在客户端与MailServer之间建立会话过程,并进而访问邮箱文件夹邮件;或者是利用SMTPServer发送邮件,可以说Session类就是邮件系统的访问入口;
2、主要方法:
a)publicvoidsetDebug(booleandebug):
如果debug为true,则在控制台输出DEBUG信息;
b)publicstaticSessiongetDefaultInstance(java.util.Propertiesprops):
该方法可以利用缺省的系统属性建立一个缺省的会话过程该方法的,返回值是Session对象;参数Properties用于设置与MailServer相关的属性,如:
i.mail.transport.protocol:
指定协议;
ii.mail.smtp.host:
指定发送服务器;
iii.mail.smtp.port:
指定发送服务器端口;
c)StoregetStore(java.lang.Stringprotocol):
获取代表邮箱的Store对象,参数protocol一般为“pop3”
2.6.具体知识点6:
Message类
1、Message类映射了邮件的结构,利用Message类我们可以读取邮件的详细信息,也可以设定邮件的状态,还可以对邮件进行各种各样的操作,Message类实现了Part接口的方法;
2、主要方法:
a)publicabstractvoidsetFrom(Addressaddress)throwsMessagingException:
这个方法可以设定当前邮件邮件的发信人地址;
b)publicvoidsetRecipient(Message.RecipientTypetype,Addressaddress)throwsMessagingException:
设置收信人地址。
参数type用于收件人类型,可用的值如下:
Message.RecipientType.BCC:
指blindcarboncopy类型的目标邮箱地址
Message.RecipientType.CC:
抄送的邮箱地址
Message.RecipientType.TO:
直接投递的目标邮箱地址
c)publicabstractvoidsetSubject(Stringsubject)throwsMessagingException:
设定邮件的主题;
d)publicabstractvoidsetSentDate(java.util.Datedate)throwsMessagingException:
设定发送此邮件的时间;
e)publicvoidsetText(Stringtext)throwsMessagingException:
这个方法的作用是把一些文本数据写入到邮件的正文中,并把邮件的类型设为text/plain。
f)publicvoidsetFlag(Flags.Flagflagbooleanset)throwsMessagingException:
这个方法是给邮件打上某个标记,如:
g)另外,上面的setXXX()方法也有对象的getXXX()方法。
2.7.具体知识点7:
Transport类
1、Transport类主要用于承担发送邮件的服务;
2、主要方法:
a)publicstaticvoidsend(Messagemsg)throwsMessagingException:
该方法将发送邮件,邮件的信息如主题、收信人、地址、发信人地址、等都被封装到Message对象中去了。
2.8.具体知识点8:
发送邮件案例
1、案例1:
发送普通邮件
Servlet名称:
SendNormalEmail
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws
ServletException,IOException{
response.setContentType(CONTENT_TYPE);
PrintWriterout=response.getWriter();
Propertiesprop=System.getProperties();
prop.put("mail.transport.protocol","smtp");//指定发送协议
prop.put("mail.smtp.host","lzh");//指定邮件服务器名称
prop.put("mail.smtp.port","25");//指定发送端口
Sessionsession=Session.getDefaultInstance(prop);
session.setDebug(true);//打印调试信息
Messagemsg=newMimeMessage(session);
try{
msg.setFrom(newInternetAddress("admin@lzh"));//发信人
msg.setRecipient(Message.RecipientType.TO,newInternetAddress("lzh@lzh"));//收信人
msg.setSubject("Hello");//主题
msg.setText("Thisisamyfirstemail!
");//邮件正文
msg.setSentDate(newDate());//发送日期
Transport.send(msg);
out.println("恭喜,邮件发送成功");
}
2、案例2:
发送HTML邮件
Servlet名称:
sendHTMLEmail
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws
ServletException,IOException{
response.setContentType(CONTENT_TYPE);
request.setCharacterEncoding("GBK");
PrintWriterout=response.getWriter();
Propertiesprop=System.getProperties();
prop.put("mail.transport.protocol","smtp");
prop.put("mail.smtp.host","lzh");
prop.put("mail.smtp.port","25");
Sessionsession=Session.getDefaultInstance(prop);
session.setDebug(true);
Messagemsg=newMimeMessage(session);
StringBuildersb=newStringBuilder();
sb.append("");
sb.append("
sb.append("
");sb.append("
sb.append("");
sb.append("");
try{
msg.setFrom(newInternetAddress("love@lzh"));
msg.setRecipient(Message.RecipientType.TO,newInternetAddress("lzh@lzh"));
msg.setSubject("HTML邮件测试");
msg.setText(sb.toString());
//msg.setDataHandler(newDataHandler(sb.toString(),"text/html"));
msg.setSentDate(newDate());
Transport.send(msg);
out.print("恭喜您,HTML邮件发送成功");
}
catch(MessagingExceptionex){
ex.printStackTrace();
}
out.close();
}
2.9.具体知识点9:
Store类
1、Store类映射了MailServer上面的邮箱系统,利用Store类我们就可以访问用户邮箱中的文件夹,进而访问邮件的信息了,Store类继承自Service。
2、常用方法:
a)publicabstractFoldergetFolder(Stringname)throwsMessagingException:
获取邮箱中的文件夹,例如POP3(PostOfficeProtocol-Version3)邮箱的INBOX文件夹。
根据JavaMailAPI的说明,POP3邮箱只支持INBOX收件夹,参数name指定了收件夹的名字(即为INBOX),该方法的返回值是Folder对象;
b)publicvoidconnect(java.lang.Stringhost,java.lang.Stringuser,java.lang.Stringpassword)throwsMessagingException:
连接邮件服务器,该方法还有另外两个版本;
2.10.具体知识点10:
Folder类
1、Folder类也是十分重要的类,它映射了邮箱中的文件夹系统,例如POP3邮箱中的INBOX文件夹。
Folder可以包含Message,亦即邮件;也可以包含Folder;也可以被Folder包含,这样就形成了一个树状结构,利用Folder类可以处理上下级的文件夹,也可以处理邮件。
Folder类尤以处理邮件的功能特别强大。
2、常用方法:
a)publicabstractvoidopen(intmode)throwsMessagingException:
打开当前文件夹,使得它处于Open状态。
文件夹只有处于Open状态才能够从中读取邮件信息。
参数mode为打开文件夹的模式,有两种可能的取值:
READ_ONLY——此文件夹是只读的,不能够执行删除邮件、转移邮件等操作;READ_WRITE——此文件夹是读写的,能够执行删除邮件、转移邮件等操作;
b)publicMessage[]getMessages()throwsMessagingException:
获取邮件文件夹中的所有邮件,并放到Message数组中;
2.11.具体知识点11:
收取邮件案例
1、案例3:
接收所有邮件
Servlet名称:
AcceptEmails
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws
ServletException,IOException{
response.setContentType(CONTENT_TYPE);
PrintWriterout=response.getWriter();
//接收lzh的邮件
Propertiesprop=System.getProperties();
Sessionsession=Session.getDefaultInstance(prop);//获取和邮件服务器的会话对象
Message[]msg=null;//邮件数组,用于存储所有的邮件
try{
Storestore=session.getStore("pop3");//获取邮箱对象
store.connect("lzh","lzh","lzh");//连接邮件服务器,参数分别为:
pop3服务器,用户名,密码
Folderfolder=store.getFolder("INBOX");//获取收件箱对象
folder.open(Folder.READ_ONLY);//以只读方式打开收件箱
msg=folder.getMessages();//获取所有的邮件,放到邮件数组中
}
catch(NoSuchProviderExceptionex){
ex.printStackTrace();
}
catch(MessagingExceptionex){
ex.printStackTrace();
}
out.println("");
out.println("
out.println("
out.println(" out.println(" //以下读取邮件内容 StringBuildersb=newStringBuilder(); for(inti=0;i try{ out.println(" out.println(" out.println(" Address[]addr=msg[i].getFrom();//获取发件人地址列表 for(Addressa: addr){//java1.5才可以这样用 sb.append(a.toString()).append(""); } out.println(" Dated=msg[i].getSentDate();//获取发送日期,下面转化成我们习惯的日期格式 DateFormatdf=newSimpleDateFormat("yyyy-MM-ddhh: mm: ss"); StringstrDate=df.format(d); out.println(" out.println(" sb.delete(0,sb.length()-1);//删除所有地址数据,以便下一轮使用 strDate=null; } catch(MessagingExceptionex1){ ex1.printStackTrace(); } } out.println(""); out.println(""); out.println("邮件主题 邮件正文 发件人 发信时间 "); "); ");"+msg[i].getSubject()+" ");//获取主题"+msg[i].getContent()+" ");//获取正文"+sb.toString()+" ");"+strDate+" ");