《网络编程技术第十二周.ppt》由会员分享,可在线阅读,更多相关《网络编程技术第十二周.ppt(72页珍藏版)》请在三一办公上搜索。
1、第六次课 用Java收发E-Mail(2),用java收发E-Mail,一、复习,二、JavaMail API核心类简介,六、思考和作业,三、应用举例,五、Authenticator类的用法及其应用举例,四、问题解答,一、因特网电子邮件系统的组成,一、复习,1.用户代理user agent,又称为邮件阅读器,允许用户阅读、回复、转发、保存和撰写报文。俗称电子邮件客户端软件。常用的电子邮件客户端软件Foxmail,Outlook,Dreammail,KooMail,IncrediMail,Becky!,PocoMail,Thunderbird,The Bat!,Eudora,二、JavaMail
2、 API介绍,1、JavaMail API简介,JavaMail API是一个用于阅读、编写和发送电子邮件的可选包。功能:1.JavaMail API为Java程序开发者提供了一个访问邮件服务器的通用接口。2.用来创建邮件用户代理(Mail User Agent,MUA)类型程序,MUA类型的程序能让用户阅读和书写邮件。3.用JavaMail API编写的MUA程序依赖邮件传输代理(Mail Transfer Agent,MTA)处理实际消息传输。MTA:即通常的邮件服务器。,二、JavaMail API介绍,2、JavaMail API 分层体系,整个JavaMail体系可分为3层:抽象层I
3、nternet邮件实现层协议实现层JavaMail API包括:抽象层Internet邮件实现层,二、JavaMail API介绍,JavaMail API包含很多类和方法。其中核心类主要有SessionStoreFolderMessageAddressAuthenticator Transport可用这些类可以完成大量常见的电子邮件任务。这些类均位于javax.mail顶级包中。,3、JavaMail 核心类层次结构,邮件会话,存储空间,邮件夹,邮件详细信息,构造邮件地址,邮件身份验证,邮件发送出去,二、JavaMail API介绍,3、JavaMail 核心类层次结构,Sessionget
4、Store()getTransport(),Storeconnect()getFolder(),Transportsend()getFolder(),Folderopen()create()Deleteclose,Message,Address,邮件会话,存储空间,邮件夹,邮件详细信息,构造邮件地址,邮件发送出去,二、JavaMail API介绍,1.Session类Session类是JavaMail API的最高层入口类,它定义了一个基本邮件会话,是邮件系统的访问入口。所有其他类都是经由这个会话才得以生效。利用Session类可以在客户端与邮件服务器之间建立会话过程,进而访问邮箱、文件夹、邮
5、件;或者是利用SMTP Server发送邮件。,4、JavaMail 核心类功能介绍,二、JavaMail API介绍,1.Session类Session类的构造方法是私有的,不能被继承,也不能使用new语句来创建实例。但它提供了两个静态方法:getInstance()和getDefaultInstance()方法来获取Session实例。如:,4、JavaMail 核心类功能介绍,EmaiAuthenticator auth=new EmaiAuthenticator(“wangyexjzy,“126126);Properties props=System.getProperties();p
6、rops.put(mail.smtp.host,smtp);props.put(mail.smtp.auth,true);Session session=Session.getInstance(props,(Authenticator)auth);,二、JavaMail API介绍,2.Store类Store类表示接收邮件服务器上注册用户的存储空间,可以实现特定邮件协议上的读、写、监视、查找等操作。通过Store类可以访问Folder类(代表邮箱文件夹)。在使用类方法getFolder()获取一个Folder对象时,如果使用的是POP3协议,那么只能使用INBOX收件夹。如果使用的是IMAP协
7、议,则可使用自己定义的收件夹。,4、JavaMail 核心类功能介绍,二、JavaMail API介绍,3.Folder类Folder类实现邮箱中的文件管理。POP3邮箱中的INBOX收件夹。Folder可以容纳消息(Message)或子目录。这样就形成了一个树状分层体系。利用Folder类,可以处理上下级的文件夹,也可以处理邮件。Folder类处理邮件的功能特别强大。,4、JavaMail 核心类功能介绍,二、JavaMail API介绍,4.Message类Message类实现了邮件管理,利用Message类可读取邮件的详细信息,还可以设定邮件的状态,以及对邮件进行各种操作。Message
8、是一个抽象类,必须用其子类,如javax.mail.internet.MimeMessage。Message类对象是根据获得的Session对象来创建的,主要内容是要发送的消息。MimeMessage msg=new MimeMessage(session);MimeMessage是一个携带MIME类型和头的电子邮件消息。,4、JavaMail 核心类功能介绍,二、JavaMail API介绍,4.Message类MimeMessage msg=new MimeMessage(session);/创建Message对象msg.setFrom(new InternetAddress(from);
9、/设置发件人地址msg.addRecipient(Message.RecipientType.TO,new InternetAddress(to);/设置收件人地址msg.setSubject(“SendMail Test”);/设置邮件主题String s=Test Text;msg.setText(s);/创建邮件正文,4、JavaMail 核心类功能介绍,二、JavaMail API介绍,5.Transport类由服务者提供的类,实现用特定的协议发送消息或邮件。它是抽象类,工作与Session类相似,仅调用静态send()方法即可完成消息或邮件的发送。例如:Transport.send(
10、msg);也可以从针对自己的协议会话中获取一个特定的实例,传递用户名和密码,发送消息,关闭连接。Transport transport=session.getTransport(smtp);transport.connect(smtp,“,“126126);transport.sendMessage(msg,msg.getAllRecipients();transport.close();,4、JavaMail 核心类功能介绍,二、JavaMail API介绍,6.Address类Address主要用来确定邮件的地址。Address类也是一个抽象类,实际编程中经常使用的是类。Address有两
11、种常用的构造方法:Address address=new InternetAddress(“”);/用电子邮件地址创建Address adderss=new InternetAddress(“”,”Tom”);/用电子邮件地址和用户设置的名字创建,4、JavaMail 核心类功能介绍,二、JavaMail API介绍,7.Authenticator类JavaMail API利用Authenticator通过用户名和密码访问受保护的资源。Authenticator 为抽象类。要使用Authenticator,需先创建抽象类的子类,并从getPasswordAuthentication()方法中返
12、回PasswordAuthentication实例。创建完成后,还必须向Session类注册Authenticator。然后,在需要认证的时候,就会通知Authenticator。,4、JavaMail 核心类功能介绍,三、应用举例,设置mail.host属性,指向本地服务器 利用session.getInstance()启动邮件会话创建MimeMessage邮件对象设置收件人、发件人、邮件主题、邮件内容利用Transport.send()方法发送邮件,1、JavaMail 编程基本步骤,三、应用举例,例题-1安装一个本地邮件服务器,利用JavaMail API编程从邮箱发送email到邮箱。
13、准备工作配置本地邮件服务器merak,,安装过程按照默认的步骤安装即可安装到最后的步骤时,需要Hostname,Domain,Username和Password,填入如下信息:,2、例题,三、应用举例,例题-1:设计思路,2、例题,数据成员,init()方法,sendMessage()方法,createSimpleMessage()方法,main()方法,protected Session session;/邮件会话private String sendHost=localhost;/邮件服务器主机名private String sendProtocol=smtp;/发送邮件协议private
14、 String toAddr=;/收件人地址private String fromAddr=;/发件人地址,数据成员,三、应用举例,例题-1设计思路,2、例题,数据成员,init()方法,sendMessage()方法,createSimpleMessage()方法,main()方法,public void init()throws Exception/根据配置的JavaMail属性生成邮件会话session对象Properties props=new Properties();/配置JavaMail属性props.put(,sendProtocol);/指定邮件发送协议props.put(,
15、com.sun.mail.smtp.SMTPTransport);/指定支持SMTP协议的Transport具体类,由第三方支持props.put(,sendHost);/指定采用SMTP协议的邮件发送服务器的IP地址或者主机名session=Session.getDefaultInstance(props);/创建Session实例session.setDebug(true);/输出日志。,init()方法,三、应用举例,例题-1设计思路:需要设置的JavaMail属性:指定邮件发送协议:指定邮件接收协议:指定支持SMTP协议的Transport具体类,允许由第三方提供:指定支持IMAP协议
16、的Store具体类,允许由第三方提供:指定采用SMTP协议的邮件发送服务器的IP地址或者主机名,2、例题,三、应用举例,例题-1设计思路,2、例题,数据成员,init()方法,sendMessage()方法,createSimpleMessage()方法,main()方法,public Message createSimpleMessage(String fromAddr,String toAddr)throws ExceptionMessage msg=new MimeMessage(session);/根据session对象创建Message对象InternetAddress toAddr
17、s=InternetAddress.parse(toAddr,false);msg.setRecipients(Message.RecipientType.TO,toAddrs);/邮件接收者地址msg.setSentDate(new Date();/日期msg.setSubject(“Hello!”);/主题msg.setFrom(new InternetAddress(fromAddr);/设置发件人地址msg.setText(How are you?!);/正文return msg;,createSimpleMessage()方法,三、应用举例,例题-1设计思路,2、例题,数据成员,in
18、it()方法,sendMessage()方法,createSimpleMessage()方法,main()方法,public void sendMessage(String fromAddr,String toAddr)throws Exception/发送邮件方法Message msg=createSimpleMessage(fromAddr,toAddr);Transport.send(msg);,sendMessage()方法,三、应用举例,例题-1设计思路,2、例题,数据成员,init()方法,sendMessage()方法,createSimpleMessage()方法,main()
19、方法,public static void main(String args)throws ExceptionMailSendClientToMyDomain client=new MailSendClientToMyDomain();client.init();client.sendMessage(client.fromAddr,client.toAddr);,main()方法,三、应用举例,例题-1控制台输出的debug信息,二、例题,三、应用举例,例题-2利用JavaMail API编制程序,读取邮箱收件箱中的所有邮件。,二、例题,三、应用举例,例题-2利用JavaMail API编制程
20、序,读取邮箱收件箱中的所有邮件。,2、例题,三、应用举例,例题-2:设计思路,2、例题,数据成员,init()方法,receiveMessage(),main()方法,browseMessagesFromFolder(String folderName),browseMessagesFromFolder(Folder folder),数据成员,protected Session session;/邮件会话protected Store store;/store对象private String receiveHost=localhost;/接收邮件服务器的主机名private String re
21、ceiveProtocol=imap;/接收邮件协议private String username=admin;/邮件用户名private String password=1234;/邮件密码private String toAddr=;/邮件地址,三、应用举例,例题-2:设计思路,2、例题,数据成员,init()方法,receiveMessage(),main()方法,browseMessagesFromFolder(String folderName),browseMessagesFromFolder(Folder folder),public void init()throws Exce
22、ption/设置JavaMail属性,并创建sessionProperties props=new Properties();props.put(,receiveProtocol);props.put(mail.imap.class,com.sun.mail.imap.IMAPStore);session=Session.getDefaultInstance(props);store=session.getStore(receiveProtocol);/接收邮件服务器上注册用户的存储空间,参数为接收邮件协议imapstore.connect(receiveHost,username,passw
23、ord);/连接到接收邮件服务器,init()方法,三、应用举例,例题-2:设计思路,2、例题,数据成员,init()方法,receiveMessage(),main()方法,browseMessagesFromFolder(String folderName),browseMessagesFromFolder(Folder folder),public void browseMessagesFromFolder(Folder folder)throws Exception folder.open(Folder.READ_ONLY);/打开邮件夹System.out.println(folde
24、r.getMessageCount()+messages in inbox!);/获得邮件数目System.out.println(folder.getUnreadMessageCount()+unread messages in inbox!);/未读邮件数目Message messages=folder.getMessages();/从邮件夹中取出邮件存于数组messages中for(int i=1;i=messages.length;i+)System.out.println(-第+i+封邮件);folder.getMessage(i).writeTo(System.out);Syste
25、m.out.println();folder.close(false);,browseMessagesFromFolder(Folder folder),三、应用举例,例题-2:设计思路,2、例题,数据成员,init()方法,receiveMessage(),main()方法,browseMessagesFromFolder(String folderName),browseMessagesFromFolder(Folder folder),public void browseMessagesFromFolder(Folder folder)throws Exception folder.op
26、en(Folder.READ_ONLY);/打开邮件夹for(int i=1;i=messages.length;i+)System.out.println(From:+messagesi.getFrom()0);System.out.println(Subject:+messagesi.getSubject();System.out.println(Text:+messagesi.getContent();System.out.println();folder.close(false);,browseMessagesFromFolder(Folder folder),三、应用举例,例题-2:
27、设计思路,2、例题,三、应用举例,例题-2:设计思路,2、例题,数据成员,init()方法,receiveMessage(),main()方法,browseMessagesFromFolder(String folderName),public void browseMessagesFromFolder(String folderName)throws Exception Folder folder=store.getFolder(folderName);/根据folderName,返回store中指定的邮件夹if(folder=null)throw new Exception(folderN
28、ame+“邮件夹不存在!);browseMessagesFromFolder(folder);/调用重载方法/browseMessagesFromFolder(Folder folder)输/出邮件夹中的信息,browseMessagesFromFolder(Folder folder),browseMessagesFromFolder(String folderName),三、应用举例,例题-2:设计思路,2、例题,数据成员,init()方法,receiveMessage(),main()方法,browseMessagesFromFolder(String folderName),brows
29、eMessagesFromFolder(Folder folder),public static void main(String args)throws Exception MailReceiveClientFromMydomain client=new MailReceiveClientFromMydomain();client.init();client.receiveMessage();client.close();,receiveMessage(),public void receiveMessage()throws Exception browseMessagesFromFolde
30、r(inbox);,三、应用举例,例题-2:设计思路,2、例题,数据成员,init()方法,receiveMessage(),main()方法,browseMessagesFromFolder(String folderName),browseMessagesFromFolder(Folder folder),public static void main(String args)throws Exception MailReceiveClientFromMydomain client=new MailReceiveClientFromMydomain();client.init();clie
31、nt.receiveMessage();client.close();,receiveMessage(),public void receiveMessage()throws Exception browseMessagesFromFolder(inbox);,main()方法,什么叫MX记录(邮件交换记录)?在自己编写的程序中,以下邮件发送过程能否成功?126-126126-企业常用的邮件服务器有哪些?通常情况下邮件是如何发送和接收的?,思考题,三、应用举例,三、应用举例,例题-1运行界面,2、例题,三、应用举例,2、例题,protected Session session;/邮件会话pri
32、vate String sendHost=localhost;/邮件服务器主机名private String sendProtocol=smtp;/发送邮件协议/这里toAddr可以换成你自己的邮箱地址private String toAddr=;private String fromAddr=;,例题-1代码,三、应用举例,将本次课所讲的两个例子移植到图形操作界面下如果要读取你自己126或者其他邮箱的邮件,应该如何改写例题?如何只读取某个人给你发送的所有邮件?如何通过程序从126邮箱向其他用户邮箱发送一封邮件?应如何改写例题?,练习题,在自己编写的程序中,以下邮件发送过程能否成功?126-1
33、26126-,四、问题解答,1、问题之一:MX记录,Mail Exchanger是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。当Internet上的某用户要发一封信给 时该用户的邮件系统通过DNS查找这个域名的MX记录如果MX记录存在,用户计算机就将邮件发送到MX记录所指定的邮件服务器上。,四、问题解答,1、问题之二:常用的邮件服务器地址,:POP3服务器地址:POP3服务器地址:SMTP服务器地址:POP3服务器地址:SMTP服务器地址,:POP3服务器地址:SMTP服务器地址:POP3服务器地址:SMTP服务器地址:POP3服务器地址:
34、SMTP服务器地址,四、问题解答,1、问题之三:检查邮件系统的MX记录的方法,nslookup:使用它来查询DNS中的各种数据。可以在Windows的命令行下直接运行nslookup进入一个交互模式,在这里能查询各种类型的DNS数据C:nslookupDefault Server:202.106.184.166 set type=mx,四、问题解答,1、问题之三:检查邮件系统的MX记录的方法,nslookup,Default Server:202.106.184.166Non-authoritative answer:internet address=202.108.44.55,四、问题解答,
35、1、问题之三:检查邮件系统的MX记录的方法,nslookup,Default Server:202.106.184.166Non-authoritative answer:internet address=202.108.44.55,用java收发E-Mail,一、复习,二、JavaMail API核心类简介,六、思考和作业,三、应用举例,五、Authenticator类的用法及其应用举例,四、问题解答,五、Authenticator类,1、Authenticator类简介,JavaMail API利用Authenticator类通过用户名和密码访问受保护的资源,实现E-mail身份验证。验证
36、对象需要通过Session传递给服务器。用法 1.Authenticator是抽象类,首先定义一个继承了该抽象类的具体子类。2.然后通过实现Authentication类中的getPasswordAuthentication()方法中返回PasswordAuthentication对象。PasswordAuthentication对象中包含了通过SMTP服务器验证所需的用户名和密码。public PasswordAuthentication getPasswordAuthentication()return new PasswordAuthentication(m_username,m_use
37、rpass);,五、Authenticator类,1、Authenticator类简介,用法 3.最后将PasswordAuthentication对象在邮件会话Session中注册,以便验证用户名和密码。然后,在需要认证的时候,就会通知Authenticator。EmaiAuthenticator auth=new EmaiAuthenticator(“wangyexjzy,“126126);Session session=Session.getInstance(props,(Authenticator)auth);Store store=session.getStore(pop3);sto
38、re.connect(pop3,null,null);,五、Authenticator类,2、Authenticator类应用举例,例题-1 读取中所有发件人是的邮件。要求:在程序中提供身份验证。思路:MailReceiveClientFromMydomain.java中在连接中读取所有的邮件信息时,也提供了身份验证private String username=admin;/邮件用户名private String password=“1234”;/邮件密码store.connect(receiveHost,username,password);/连接到接收邮件服务器这种做法有什么缺点吗?,五
39、、Authenticator类,2、Authenticator类应用举例,例题-1 思路但是上述代码是将用户名和口令作为硬代码写在程序中,但是在实际应用中,往往是希望连接邮件服务器时,能弹出一个对话框,提示用户输入用户名和密码。要达到这个效果,需要创建一个创建继承了Authenticator的子类,在这个子类中实现getPasswordAuthentication()方法,由这个方法返回一个PasswordAuthentication实例。,五、Authenticator类,2、Authenticator类应用举例,例题-1:思路class EmaiAuthenticator extends
40、Authenticatorprivate String m_username;private String m_userpass;EmaiAuthenticator(String username,String userpass)super();m_username=username;m_userpass=userpass;public PasswordAuthentication getPasswordAuthentication()return new PasswordAuthentication(m_username,m_userpass);观察程序在实现上与MailReceiveCli
41、entFromMydomain.java有何不同?,五、Authenticator类,2、Authenticator类应用举例,例题-1:程序流程,数据成员,init()方法,receiveMessage(),main()方法,browseMessagesFromFolder(String folderName),browseMessagesFromFolder(Folder folder),数据成员,EmaiAuthenticator ma;/验证类EmaiAuthenticator对象protected Session session;/邮件会话protected Store store;
42、private String receiveHost=localhost;/接收邮件服务器主机名private String receiveProtocol=imap;/接收邮件协议private String username=admin;/邮箱用户名private String password=1234;/邮箱密码,五、Authenticator类,2、Authenticator类应用举例,例题-1:程序流程,数据成员,init()方法,receiveMessage(),main()方法,browseMessagesFromFolder(String folderName),browse
43、MessagesFromFolder(Folder folder),Properties props=new Properties();props.put(mail.store.protocol,receiveProtocol);props.put(mail.imap.class,com.sun.mail.imap.IMAPStore);props.put(mail.smtp.auth,true);/设置需要身份验证的JavaMail属性ma=new EmaiAuthenticator(username,password);/实例化身份验证类对象session=Session.getDefau
44、ltInstance(props,(Authenticator)ma);/在session对象中注册PasswordAuthentication对象mastore=session.getStore(receiveProtocol);store.connect(receiveHost,null,null);/连接邮件服务器时,将用户名和口令设置为null。,init()方法,五、Authenticator类,2、Authenticator类应用举例,例题-1:程序流程问题:身份验证在什么时候发生?,ma=new EmaiAuthenticator(username,password);/实例化身
45、份验证类对象session=Session.getDefaultInstance(props,(Authenticator)ma);/以身份验证类对象ma为参数返回session对象store=session.getStore(receiveProtocol);store.connect(receiveHost,null,null);/连接邮件服务器,Store.connect(receiveHost,null,null),调用MailAuthenticator的getPasswordAuthentication()方法。,返回一个PasswordAuthentication对象,这个对象中包
46、含了用户名和口令信息,进行验证,注册:session=Session.getDefaultInstance(props,(Authenticator)ma);,五、Authenticator类,2、Authenticator类应用举例,例题-1:程序流程问题:如果程序中提供的用户名或密码错误的话,会抛出哪种异常?Exception in thread main:AUTHENTICATE Unknown user or incorrect passwordat com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:566)at ja
47、vax.mail.Service.connect(Service.java:310)at javax.mail.Service.connect(Service.java:169)(MailClientAuthFromMydomain.java:52)(MailClientAuthFromMydomain.java:91),store.connect(receiveHost,null,null);,client.init();,五、Authenticator类,2、Authenticator类应用举例,例题-2:在读取中的邮件时候,首先弹出一个对话框,在用户输入用户名和密码单击“确定”按钮后,系
48、统先根据用户输入的信息进行身份验证,通过后才完成用户收发邮件的要求。,和刚才的例题有什么区别?刚才的例题将用户名和密码显式地定义在程序的变量中。这里要求用户在图形界面下输入用户名和密码。,五、Authenticator类,2、Authenticator类应用举例,例题-2:设计思路一、信息验证类MailAuthenticatorDialog.java的设计创建一个Authenticator的子类,对EmaiAuthenticator.java改造。将其中的成员变量username,password直接通过变量参数进行传递,改为用户通过对话框进行输入。所以需要设计一个弹出式对话框,用来在合适的时
49、候弹出,让用户输入用户名和密码。二、邮件读取或发送过程,同其他程序,五、Authenticator类,2、Authenticator类应用举例,例题-2:设计思路-MailAuthenticatorDialog.java:设计弹出式对话框JDialog在Java中,对话框是有边框、有标题的独立存在的容器,并且不能被其他容器包容JDialog不能作为程序的最外层容器,也不能包含菜单条JDialog一般有固定的布局,且不能随便改变对话框的大小JDialog必须隶属于一个JFrame,并且由这个JFrame负责弹出,创建JDialogJDialog(JFrameowner,Stringtitle,b
50、ooleanmodal)创建一个隶属于某个JFrame、指定的标题和有模式或无模式对话框的对话框。,五、Authenticator类,2、Authenticator类应用举例,例题-2:设计思路-MailAuthenticatorDialog.java:设计弹出式对话框第一步:创建JDialog,passwordDg=new JDialog(new JFrame(),输入用户名和密码,true);Container container=passwordDg.getContentPane();/取得对话框隶属的那个JFrame的顶级容器container.setLayout(new GridLa