资源预览内容
第1页 / 共106页
第2页 / 共106页
第3页 / 共106页
第4页 / 共106页
第5页 / 共106页
第6页 / 共106页
第7页 / 共106页
第8页 / 共106页
第9页 / 共106页
第10页 / 共106页
亲,该文档总共106页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第13章章电子邮件的发送和接收电子邮件的发送和接收电子邮件(电子邮件(electronicmail,简称,简称e-mail)是因特网上使用最多的一种应用,它)是因特网上使用最多的一种应用,它为用户在因特网上设立了存放邮件的电子邮为用户在因特网上设立了存放邮件的电子邮箱,发信人可以随时将电子邮件发送到收信箱,发信人可以随时将电子邮件发送到收信人的电子邮箱,收信人也可以随时上网读取,人的电子邮箱,收信人也可以随时上网读取,发信人与收信人以异步的方式通信。发信人与收信人以异步的方式通信。Network Programming邮件的发送和接收邮件的发送和接收第第13章章电子邮件的发送和接收电子邮件的发送和接收邮件传输原理1、电子邮件系统的构成一个电子邮件系统包括三个主要的构件,即用户代理,邮件一个电子邮件系统包括三个主要的构件,即用户代理,邮件消息传输代理消息传输代理(邮件服务器),和电子邮件使用的协议。如,和电子邮件使用的协议。如图所示:图所示:Network Programming邮件的发送和接收邮件的发送和接收第第13章章电子邮件的发送和接收电子邮件的发送和接收2、电子邮件系统的实现电子邮件系统的实现Network Programming邮件的发送和接收邮件的发送和接收13.1E-mail协议简介协议简介邮件服务器按照提供的服务类型,可以分为发送邮件服务器(简称发送服务器)和接收邮件服务器(简称接收服务器)。n发送邮件服务器使用邮件发送协议,现在常用的是SMTP,所以通常发送邮件服务器也称为SMTP服务器;n接收邮件服务器使用接收邮件协议,常用的有POP3协议和IMAP协议,所以通常接收邮件服务器也称为POP3服务器或IMAP服务器。Network Programming邮件的发送和接收邮件的发送和接收13.1.1SMTP协议简介协议简介SMTP(SimpleMailTransferProtocol),即简单邮件传输协议,是Internet传送E-mail的基本协议,也是TCP/IP协议组的成员。nSMTP协议解决邮件系统如何通过一条链路,把邮件从一台机器传送到另一台机器上的问题。nSMTP协议的特点是具有良好的可伸缩性,这也是它成功的关键。它既适用于广域网,也适用于局域网。nSMTP协议由于非常简单,使得它得到了广泛的运用,在Internet上能够发送邮件的服务器几乎都支持SMTP协议。Network Programming邮件的发送和接收邮件的发送和接收13.1E-mail协议简介协议简介Network Programming客户机客户机A客户机客户机Bemail服务器服务器ASMTP服务器服务器email服务器服务器BPOP3/IMAP服务器服务器internet1、SMTP传输传输2、SMTP-传输邮件传输邮件3、pop3/IMAP协议协议-接收阅读接收阅读邮件的发送和接收邮件的发送和接收13.1.1SMTP协议简介协议简介SMTP协议采用C/S模式,专用于电子邮件的发送,规定了发信人把邮件发送到收信人的电子邮箱的全过程中,SMTP客户与SMTP服务器这两个相互通信的进程之间应如何交换信息。即规定了SMTP的会话过程。用户直接使用的是用于编写和发送的客户端软件,而通常的SMTP服务器运行在远程站点上。客户/服务器之间的通信是通过TCP/IP协议进行的。SMTP的命令和响应都是基于文本,以命令行为单位,换行符为CR/LF。响应信息一般只有一行,由一个3位数的代码开始,后面可附上很简短的文字说明。SMTP要经过建立连接、传送邮件和释放连接3个阶段。具体如下:Network Programming邮件的发送和接收邮件的发送和接收13.1.1SMTP协议简介协议简介具体为:(1)建立TCP连接。(2)客户端向服务器发送HELLO命令以标识发件人自己的身份,然后客户端发送MAIL命令。(3)服务器端以OK作为响应,表示准备接收。(4)客户端发送RCPT命令。(说明收信人的电子邮件地址)(5)服务器端表示是否愿意为收件人接收邮件。(6)协商结束,发送邮件,用命令DATA发送输入内容。(7)结束此次发送,用QUIT命令退出。电子邮件系统发邮件时是根据收信人的地址后缀来定位邮件服务器的。SMTP通过用户代理程序(UA)完成邮件的编辑、收取和阅读等功能;通过邮件传输代理程序(MTA)将邮件传送到目的地。Network Programming邮件的发送和接收邮件的发送和接收13.1.2POP3协议简介协议简介POP3(PostOfficeProtocol3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。POP3协议是TCP/IP协议族中的一员,,由RFC1939定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。Network Programming邮件的发送和接收邮件的发送和接收13.1.3IMAP协议简介协议简介InternetMailAccessProtocol互联网邮件访问协议。IMAP协议它的主要作用是邮件客户端(例如MSOutlookExpress)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。它与POP3协议的主要区别是主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。用户可以通过浏览信件头来决定是否收取、删除和检索邮件的特定部分,还可以在服务器上创建或更改文件夹或邮箱,它除了支持POP3协议的脱机操作模式外,还支持联机操作和断连接操作。它为用户提供了有选择的从邮件服务器接收邮件的功能、基于服务器的信息处理功能和共享信箱功能。Network Programming邮件的发送和接收邮件的发送和接收13.1.4MIME简介简介nMIME(MultipurposeInternetMailExtensions,多用途Internet邮件扩充标准)不是邮件传输协议,而是对邮件格式所作的规范。它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。nMIME规定了用于表示各种各样的数据类型的符号化方法。MIME是通过标准化电子邮件报文的头部的附加领域(fields)而实现的;这些头部的附加领域,描述新的报文类型的内容和组织形式。Network Programming邮件的发送和接收邮件的发送和接收13.1.4MIME简介简介Network Programming邮件的发送和接收邮件的发送和接收13.1.4MIME简介简介内容类型(Content-Type),这个头部领域用于指定消息的类型type有下面的形式。Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;Application:用于传输应用程序数据或者二进制数据;Message:用于包装一个E-mail消息;Image:用于传输静态图片数据;Audio:用于传输音频或者音声数据;Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。Network Programming邮件的发送和接收邮件的发送和接收13.2JavaMailAPI简介简介SUN公司制定了JavaMailAPI,它封装了按照各种邮件通信协议,如IMAP、POP3和SMTP,与邮件服务器通信的细节,为Java应用程序提供了收发电子邮件的公共接口,参见图Network Programming邮件的发送和接收邮件的发送和接收13.2JavaMailAPI简介简介JavaMailAPI主要位于javax.mail包和javax.mail.internet中,图为其中主要类的类框图。Network Programming邮件的发送和接收邮件的发送和接收13.2JavaMailAPI简介简介1.javax.mail.Session类:表示邮件会话,是JavaMailAPI的最高层入口类。nSession类定义了基本的邮件会话。就像Http会话那样,我们进行收发邮件的工作都是基于这个会话的。Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。nSession类的构造方法是私有的,所以我们可以使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的Session对象:Propertiesprops=newProperties();Sessionsession=Session.getDefaultInstance(props,null);Network Programming邮件的发送和接收邮件的发送和接收13.2JavaMailAPI简介简介2、javax.mail.Store类:表示接收邮件服务器上的注册用户的存储空间,通过Store类的getFolder()方法,可以访问用户的特定邮件夹。通过javax.mail.Store类可以访问javax.mail.Folder类。我们需要从Session中获取特定类型的Store,然后连接到Store,在连接Store的过程中,极有可能需要用到用户名、密码或者Authenticator。Storestore=session.getStore(imap);Storestore=session.getStore(pop3);store.connect(host,username,password);Network Programming邮件的发送和接收邮件的发送和接收13.2JavaMailAPI简介简介3、javax.mail.Folder类代表邮件夹,邮件都放在邮件夹中,Folder提供了管理邮件夹及邮件的各种方法在连接到Store后,一个Folder对象即目录对象将通过Store的getFolder()方法被返回,我们可从这个Folder中读取邮件信息:Folderfolder=store.getFolder(INBOX);folder.open(Folder.READ_ONLY);Network Programming邮件的发送和接收邮件的发送和接收13.2JavaMailAPI简介简介4、javax.mail.Message类代表电子邮件,封装了实际email消息的所有细节,如标题、发送/接收地址、发送日期等,提供了读取和设置邮件内容的方法。Message是一个抽象类,大多数情况下,我们使用javax.mail.internet.MimeMessage这个子类,该类是使用MIME类型、MIME信息头的邮箱信息。为了建立一个MimeMessage对象,我们必须将Session对象作为MimeMessage构造方法的参数传入:MimeMessagemessage=newMimeMessage(session);message.setFrom(newInternetAddress(from);message.addRecipient(Message.RecipientType.TO,newInternetAddress(to);message.setSubject(HelloJavaMail);message.setText(WelcometoJavaMail);Network Programming邮件的发送和接收邮件的发送和接收13.2JavaMailAPI简介简介5、javax.mail.Address类:邮件地址类,像Message一样,Address类也是一个抽象类,所以我们将使用javax.mail.internet.InternetAddress这个子类。通过传入代表邮件地址的字符串,我们可以建立一个邮件地址类:Addressaddress=newInternetAddress(presidentwhitehouse.gov);Network Programming邮件的发送和接收邮件的发送和接收13.2JavaMailAPI简介简介6、javax.mail.Transport类:在发送信息时,Transport类将被用到。这个类实现了发送信息的协议(通称为SMTP),此类是一个抽象类,我们可以使用这个类的静态方法send()来发送消息。Transporttransport=session.getTransport(smtp);transport.connect(host,username,password);transport.sendMessage(message,message.getAllRecipients();transport.close();Network Programming邮件的发送和接收邮件的发送和接收13.2JavaMailAPI简介简介7、javax.mail.Authenticator类:像java.net类那样,JavaMailAPI通过使用授权者类(Authenticator是一个抽象类)以用户名、密码的方式访问那些受到保护的资源,在这里“资源”就是指邮件服务器。下面代码片断中的MyAuthenticator就是一个Authenticator的子类。Propertiesprops=newProperties();Authenticatorauth=newMyAuthenticator();Sessionsession=Session.getDefaultInstance(props,auth);Network Programming邮件的发送和接收邮件的发送和接收13.3建立建立JavaMail应用程序的开发环境应用程序的开发环境JDK中并不包含JavaMailAPI。为了开发JavaMail应用程序,需要从SUN公司的网站下载JavaMailAPI及其实现的类库,该类库由两个JAR文件组成:mail.jar和activation.jar。Network Programming邮件的发送和接收邮件的发送和接收13.3建立建立JavaMail应用程序的开发环境应用程序的开发环境1安装JavaMail为了使用JavaMailAPI,需要从http:/java.sun.com/products/javamail/downloads/index.html下载文件名格式为javamail-version.zip的文件(这个文件中包括了JavaMail实现),并将其中的mail.jar文件添加到CLASSPATH中。这个实现提供了对SMTP、IMAP4、POP3的支持。注意:在安装JavaMail实现之后,我们将在demo目录中发现许多有趣的简单实例程序。在安装了JavaMail之后,我们还需要安装JavaBeansActivationFramework,因为这个框架是JavaMailAPI所需要的。如果我们使用J2EE的话,那么我们并无需单独下载JavaMail,因为它存在于J2EE.jar中,只需将J2EE.jar加入到CLASSPATH即可Network Programming邮件的发送和接收邮件的发送和接收13.3建立建立JavaMail应用程序的开发环境应用程序的开发环境2安装JavaBeansActivationFramework从http:/java.sun.com/products/javabeans/glasgow/jaf.html下载JavaBeansActivationFramework,并将其添加到CLASSPATH中。此框架增加了对任何数据块的分类、以及对它们的处理的特性。这些特性是JavaMailAPI需要的。虽然听起来这些特性非常模糊,但是它对于我们的JavaMailAPI来说只是提供了基本的MIME类型支持。到此为止,我们应当把mail.jar和activation.jar都添加到了CLASSPATH中。当然如果从方便的角度讲,直接把这两个Jar文件复制到JRE目录的lib/ext目录中也可以。Network Programming邮件的发送和接收邮件的发送和接收13.4创建创建JavaMail应用程序应用程序JavaMail应用程序在初始化过程中需要执行如下步骤。步骤(1)设置JavaMail属性:Propertiesprops=newProperties();props.put(“mail.transport.protocol”,“smtp”);/指定邮件发送协议props.put(mail.store.protocol,imap);/指定邮件接收协议props.put(mail.smtp.class,com.sun.mail.smtp.SMTPTransport);/指定支持SMTP协议的Transport具体类,允许由第三方提供。props.put(mail.imap.class,com.sun.mail.imap.IMAPStore);/指定支持IMAP协议的Store具体类,允许由第三方提供。props.put(mail.smtp.host,hostname);/指定采用SMTP协议的邮件发送服务器的IP地址或主机名。Network Programming邮件的发送和接收邮件的发送和接收13.4创建创建JavaMail应用程序应用程序n步骤(2)调用javax.mail.Session类的静态方法Session.getDefaultInstance()获得Session实例,该方法根据已经配置的JavaMail属性来创建Session实例:Sessionmailsession=Session.getDefaultInstance(props);n步骤(3)调用Session的getStore(Stringprotocol)方法来获得Store对象,参数protocol指定接收邮件协议:Storestore=mailsession.getStore(imap);步骤(1)把mail.imap.class属性设为com.sun.mail.imap.IMAPStore,因此以上getStore()方法返回com.sun.mail.imap.IMAPStore类的实例。Network Programming邮件的发送和接收邮件的发送和接收13.4创建创建JavaMail应用程序应用程序步骤(4)调用Store对象的connect()方法连接到接收邮件服务器。调用connect()方法时,应该指定接收邮件服务器的主机名或IP地址、用户名和口令。store.connect(hostname,username,password);Network Programming邮件的发送和接收邮件的发送和接收13.4创建创建JavaMail应用程序应用程序获得了Store对象后,就可以通过它来访问邮件服务器上的特定邮件用户了。通常会对邮件用户执行以下操作。操作(一)创建并发送邮件:/创建邮件msg=newMimeMessage(mailsession);InternetAddresstoAddrs=InternetAddress.parse(adminmydomain.com,false);/设置邮件接收者msg.setRecipients(Message.RecipientType.TO,toAddrs);/设置邮件的主题msg.setSubject(hello);Network Programming邮件的发送和接收邮件的发送和接收13.4创建创建JavaMail应用程序应用程序/设置邮件的发送者msg.setFrom(newInternetAddress(adminmydomain.com);/设置邮件的正文msg.setText(Howareyou);/发送邮件Transport.send(msg);Transport的静态方法send(Message)负责发送邮件服务器,邮件发送协议由mail.transport.protocol属性指定,邮件发送服务器由mail.smtp.host属性指定。Network Programming邮件的发送和接收邮件的发送和接收13.4创建创建JavaMail应用程序应用程序操作(二)打开inbox邮件夹收取邮件:/获得名为“inbox”的邮件夹Folderfolder=store.getFolder(inbox);/打开邮件夹folder.open(Folder.READ_ONLY);/获得邮件夹中的邮件数目System.out.println(Youhave+folder.getMessageCount()+messagesininbox.);/获得邮件夹中的未读邮件数目System.out.println(Youhave+folder.getUnreadMessageCount()+unreadmessagesininbox.);在IMAP协议中,inbox邮件夹是邮件用户的保留邮件夹,用户不允许删除该邮件夹,邮件服务器把所有接收到的新邮件都存在该邮件夹中。Network Programming邮件的发送和接收邮件的发送和接收13.4创建创建JavaMail应用程序应用程序操作(三)从邮件夹中读取邮件:/从邮件夹中读取第一封邮件Messagemsg=folder.getMessage(1);System.out.println(-thefirstmessageininbox-);/获得邮件的发送者、主题和正文System.out.println(From:+msg.getFrom()0);System.out.println(Subject:+msg.getSubject();System.out.println(Text:+msg.getText();Network Programming邮件的发送和接收邮件的发送和接收13.5身份验证身份验证n在实际应用中,往往希望在连接邮件服务器时,弹出一个对话框,提示用户输入用户名和口令。n为了达到这一效果,需要按照以下步骤创建和使用javax.mail.Authenticator类:n(1)创建一个javax.mail.Authenticator类的子类(假定名为MailAuthenticator),实现getPasswordAuthentication()方法。n(2)创建MailAuthenticator对象,并且把它作为参数传给Session的getDefaultInstance()方法:Authenticatorma=newMailAuthenticator();Sessionsession=Session.getDefaultInstance(props,ma);n(3)连接到接收邮件服务器时,把用户名和口令设为null:store.connect(receiveHost,null,null);Network Programming邮件的发送和接收邮件的发送和接收13.5身份验证身份验证Network Programming邮件的发送和接收邮件的发送和接收13.6URLName类类njavax.mail.URLName类表示URL的名字,URLName类与java.net.URL类的区别在于:nURLName类不尝试连接目标地址。构造URLName对象时,无需指定协议处理器。nURLName类可以表示非标准的URL地址。比如URLName对象可以表示接收邮件服务器上的特定邮件夹,形式为:协议名:/用户名:口令主机:端口/邮件夹Network Programming邮件的发送和接收邮件的发送和接收13.6URLName类类nURLName类中包括以下getXXX()方法:ngetProtocol():获得URL名字中的协议。ngetHost():获得URL名字中的主机。ngetUsername():获得URL名字中的用户名。ngetPassword():获得URL名字中的口令。ngetFile():获得URL名字中的文件名或者邮件夹名Network Programming邮件的发送和接收邮件的发送和接收13.6URLName类类nURLName类中包括以下getXXX()方法:ngetProtocol():获得URL名字中的协议。ngetHost():获得URL名字中的主机。ngetUsername():获得URL名字中的用户名。ngetPassword():获得URL名字中的口令。ngetFile():获得URL名字中的文件名或者邮件夹名。Network Programming邮件的发送和接收邮件的发送和接收13.6URLName类类n例程14-5的MailClientURLName类的init(URLNameurlName)方法从一个URLName对象中获取连接到接收邮件服务器的各种信息。这个URLName对象表示的URL名字为:imap:/admin:1234localhost/publicvoidinit(URLNameurlName)throwsExceptionreceiveProtocol=urlName.getProtocol();receiveHost=urlName.getHost();username=urlName.getUsername();password=urlName.getPassword();Network Programming邮件的发送和接收邮件的发送和接收13.6URLName类类/设置属性Propertiesprops=newProperties();props.put(mail.smtp.host,sendHost);/创建Session对象session=Session.getDefaultInstance(props);/创建Store对象store=session.getStore(receiveProtocol);/连接到邮件服务器store.connect(receiveHost,username,password);Network Programming邮件的发送和接收邮件的发送和接收13.7创建和读取复杂电子邮件创建和读取复杂电子邮件如图所示,按照MIME规范,电子邮件包括邮件头和正文两部分。邮件头中包括日期、发送者地址、接收者地址和主题等信息。正文部分可以包括普通文本内容,还可以包括一个或多个附件。Network Programming邮件的发送和接收邮件的发送和接收13.7创建和读取复杂电子邮件创建和读取复杂电子邮件njavax.mail.Message抽象类表示邮件,它的具体子类为javax.mail.MimeMessage类,它提供了读取和设置邮件中各个部分的getXXX()和setXXX()方法:nsetSubject(Stringsubject)方法设置邮件的主题。nsetHeader(Stringname,Stringvalue)方法设置邮件头部的某一项。nsetContent(Objecto,Stringtype)方法设置邮件的正文。Network Programming邮件的发送和接收邮件的发送和接收13.7.1邮件地址邮件地址njavax.mail.Address抽象类表示邮件地址,它的最常用的子类是javax.mail.InternetAddress类。nInternetAddress类表示Internet网上通用的邮件地址,形式为adminmydomain.com,或者“Admin”。nInternetAddress类提供了一系列get和set方法,用来读取和设置address、personal和charset等属性,例如:ngetAddress():读取address属性。ngetPersonal():读取personal属性。nsetAddress(Stringaddress):设置address属性。nsetPersonal(Stringpersonal):设置personal属性。Network Programming邮件的发送和接收邮件的发送和接收13.7.1邮件地址邮件地址n以下两段代码是等价的:InternetAddressaddr=newInternetAddress(adminmydomain.com,Admin);或者:InternetAddressaddr=newInternetAddress();addr.setAddress(adminmydomain.com);addr.setPersonal(Admin);Network Programming邮件的发送和接收邮件的发送和接收13.7.1邮件地址邮件地址nMimeMessage类的以下方法用于读取或设置邮件中的地址信息:nAddressgetFrom():读取发送者的邮件地址。nAddressgetRecipients(Message.RecipientTypetype):读取特定接收类型的邮件地址。nvoidsetFrom(Addressaddress):设置发送者的邮件地址。nvoidsetRecipients(Message.RecipientTypetype,Addressaddresses):设置特定接收类型的邮件地址,参数addresses指定多个接收地址。nvoidsetRecipients(Message.RecipientTypetype,Stringaddresses):设置特定接收类型的邮件地址,参数addresses指定一个接收地址。Network Programming邮件的发送和接收邮件的发送和接收13.7.1邮件地址邮件地址nMessage.RecipientType类型的静态常量表示地址类型,包括:nMessage.RecipientType.TO:主接收地址。nMessage.RecipientType.CC:抄送地址。nMessage.RecipientType.BCC:广播地址。Network Programming邮件的发送和接收邮件的发送和接收13.7.1邮件地址邮件地址n以下程序代码设置了邮件的各项邮件地址:MimeMessagemsg=newMimeMessage(session);InternetAddressfrom=newInternetAddress(adminmydomain.com);InternetAddressto=InternetAddress.parse(adminmydomain.com,java_mailcitiz.net);InternetAddresscc=newInternetAddress(linda_j2eeyahoo.com.cn);InternetAddressbcc=InternetAddress.parse(abcyahoo.com,xyzyahoo.com.cn);msg.setFrom(from);msg.setRecipients(Message.RecipientType.TO,to);msg.setRecipients(Message.RecipientType.CC,cc);msg.setRecipients(Message.RecipientType.BCC,bcc);Network Programming邮件的发送和接收邮件的发送和接收13.7.2邮件头部邮件头部nMimeMessage类的以下getXXX()和setXXX()方法用于读取和设置邮件头部的特定项:nStringgetHeader(Stringname)nvoidsetHeader(Stringname,Stringvalue)n以下两段代码的作用是等价的,它们的作用都是设置邮件的主题:msg.setHeader(subject,hello);或者:msg.setSubject(hello);Network Programming邮件的发送和接收邮件的发送和接收13.7.2邮件头部邮件头部nMimeMessage类的getAllHeaders()方法返回一个包含Header对象的Enumeration对象,每个Header对象表示邮件头部的一项。n以下程序代码遍历邮件头部的所有项:for(Enumeratione=msg.getAllHeaders();e.hasMoreElements();)Headerheader=e.nextElement();System.out.println(header.getName()+:“+header.getValue();Network Programming邮件的发送和接收邮件的发送和接收13.7.3邮件标记邮件标记n多数接收邮件服务器允许邮件包含特定的标记信息,这些标记可以使用户更方便的管理邮件。nJavaMailAPI用javax.mail.Flags类的Flags.Flag内部类的静态实例来表示标记:nFlags.Flag.ANSWERED:表示邮件已经回复。该标记由客户程序设置。nFlags.Flag.DELETED:表示邮件已经被删除。该标记由客户程序设置。nFlags.Flag.RECENT:表示刚刚被添加到邮件夹的邮件,即最近一次打开邮件夹时,被添加到邮件夹的邮件。该标记由Folder类的实现来设置,客户程序只能读取该标记。Network Programming邮件的发送和接收邮件的发送和接收13.7.3邮件标记邮件标记nFlags.Flag.FLAGGED:表示邮件已经作了某种标记。客户程序可以设置该标记。nFlags.Flag.SEEN:表示邮件已经被阅读。该标记由JavaMailAPI的实现来设置。当客户程序调用了邮件的getContent()方法时,该邮件被加上Flags.Flag.SEEN标记。客户程序可以修改这个标记。nFlags.Flag.DRAFT:表示邮件是草稿。该标记由客户程序设置。nFlags.Flag.USER:表示邮件所在的邮件夹支持用户自定义的标记。该标记由接收邮件服务器设置,客户程序只能读取该标记。客户程序可以通过folder.getPermanentFlags().contains(Flags.Flag.USER)方法判断邮件夹是否支持用户自定义的标记。Network Programming邮件的发送和接收邮件的发送和接收13.7.3邮件标记邮件标记nMimeMessage类提供了三个与标记有关的方法:nvoidsetFlags(Flagsflags,booleanset):设置或取消一组标记。nvoidsetFlags(Flags.Flag,booleanset):设置或取消特定标记。nbooleanisSet(Flags.Flagflag):察看是否设置了某个标记。Network Programming邮件的发送和接收邮件的发送和接收13.7.3邮件标记邮件标记n以下两段程序代码是等价的,它们的作用都是为一个邮件设置SEEN和ANSWERED标记:Flagsflags=newFlags();flags.add(Flags.Flag.SEEN);flags.add(Flags.Flag.ANSWERED);msg.setFlags(flags,true);或者:msg.setFlags(Flags.Flag.SEEN,true);msg.setFlags(Flags.Flag.ANSWERED,true);Network Programming邮件的发送和接收邮件的发送和接收13.7.3邮件标记邮件标记n如果邮件所在的邮件夹支持用户标记,还可以通过以下方式为邮件加上具有特殊含义的用户标记:Flagsflags=newFlags();flags.add(privateemail);flags.add(abouttravelling);msg.setFlags(flags,true);/表示这是一封关于旅游的私人信件Network ProgrammingNetwork Programming邮件的发送和接收邮件的发送和接收13.7.3邮件标记邮件标记n以下程序代码察看邮件的所有标记:if(msg.isSet(Flags.Flag.DELETED)System.out.println(DELETED);elseif(msg.isSet(Flags.Flag.SEEN)System.out.println(SEEN);elseif(msg.isSet(Flags.Flag.ANSWERED)System.out.println(ANSWERED);elseif(msg.isSet(Flags.Flag.RECENT)System.out.println(RECENT);Network Programming邮件的发送和接收邮件的发送和接收13.7.3邮件标记邮件标记elseif(msg.isSet(Flags.Flag.DRAFT)System.out.println(DRAFT);elseif(msg.isSet(Flags.Flag.FLAGGED)System.out.println(FLAGGED);elseif(msg.isSet(Flags.Flag.USER)/读取用户标记StringuserFlags=msg.getFlags().getUserFlags();for(inti=0;iuserFlags.length;i+)System.out.println(UserFlag:+userFlagsi);Network Programming邮件的发送和接收邮件的发送和接收13.7.4邮件正文邮件正文n邮件正文是邮件中最复杂的一部分,正文可以是纯文本,还可以包括若干附件。nJavaMailAPI把邮件正文的各个组成部分以及整个邮件都抽象为部件,部件用javax.mail.Part接口表示。n一个Part对象和一个DataHandler对象关联,DataHandler对象负责处理部件包含的数据。nPart接口有两个子接口:MimePart接口和BodyPart接口。nMimePart接口表示符合MIME规范的部件。nBodyPart接口表示可以作为邮件正文的组成部分的部件。Network Programming邮件的发送和接收邮件的发送和接收13.7.4邮件正文邮件正文Part接口及其相关类的类框图Network Programming邮件的发送和接收邮件的发送和接收13.7.4邮件正文邮件正文nMimeBodyPart类实现了MimePart接口和BodyPart接口,因此MimeBodyPart对象可以作为MimeMessage的正文的组成部分。nMimeMessag类的以下三个方法都用于设置正文:nvoidsetText(Strinttxt)nvoidsetContent(Objecto,Stringtype)nvoidsetContent(Multipartmp)Network Programming邮件的发送和接收邮件的发送和接收13.7.4邮件正文邮件正文n如果MimeMessage仅包含纯文本内容,可以通过以下两种方式设置邮件正文:msg.setText(Howareyou);或者msg.setContent(Howareyou,text/plain);n如果MimeMessage的正文包括多个组成部分,既有纯文本内容,还有若干附件,那就应该先创建一个包含正文的各个组成部分的MimeMultipart对象,然后调用msg.setContent(Multipartmp)方法,把MimeMultipart对象作为邮件的正文。Network Programming邮件的发送和接收邮件的发送和接收13.7.4邮件正文邮件正文n例程的MailClientSendAttach类创建了一个包括附件的邮件,然后发送该邮件。n这封邮件的正文包括三个组成部分,分别用三个MimeBodyPart对象来表示。第一个MimeBodyPart对象表示邮件的纯文本内容,其他两个MimeBodyPart对象分别表示两个附件。这些MimeBodyPart对象都加入到一个MimeMultipart对象中。Network ProgrammingNetwork Programming邮件的发送和接收邮件的发送和接收13.7.4邮件正文邮件正文例程MailClientSendAttach.javaimportjavax.mail.*;importjavax.mail.internet.*;importjavax.activation.*;importjava.util.*;publicclassMailClientSendAttachextendsMailClientForCitizprivateStringfromAddr=java_mailcitiz.net;/发送者地址privateStringtoAddr=java_mailcitiz.net;/接收者地址Network ProgrammingNetwork Programming邮件的发送和接收邮件的发送和接收13.7.4邮件正文邮件正文publicvoidsendMessage(StringfromAddr,StringtoAddr)throwsException/创建一个邮件Messagemsg=newMimeMessage(session);InternetAddresstoAddrs=InternetAddress.parse(toAddr,false);msg.setRecipients(Message.RecipientType.TO,toAddrs);msg.setSubject(hello);msg.setSentDate(newDate();msg.setFrom(newInternetAddress(fromAddr);Network Programming邮件的发送和接收邮件的发送和接收13.7.4邮件正文邮件正文Stringattch1=attch1.rar;Stringattch2=attch2.rar;Multipartmultipart=newMimeMultipart();/加入文本内容MimeBodyPartmimeBodyPart1=newMimeBodyPart();mimeBodyPart1.setText(Howareyou);multipart.addBodyPart(mimeBodyPart1);Network Programming邮件的发送和接收邮件的发送和接收13.7.4邮件正文邮件正文/加入第一个附件MimeBodyPartmimeBodyPart2=newMimeBodyPart();FileDataSourcefds=newFileDataSource(attch1);/得到数据源mimeBodyPart2.setDataHandler(newDataHandler(fds);mimeBodyPart2.setDisposition(Part.ATTACHMENT);/标识本部件为附件mimeBodyPart2.setFileName(fds.getName();/设置文件名(与原文件名同)multipart.addBodyPart(mimeBodyPart2);/将附件添加到正文对象Network Programming邮件的发送和接收邮件的发送和接收13.7.4邮件正文邮件正文/加入第二个附件MimeBodyPartmimeBodyPart3=newMimeBodyPart();fds=newFileDataSource(attch2);/得到数据源mimeBodyPart3.setDataHandler(newDataHandler(fds);mimeBodyPart3.setDisposition(Part.ATTACHMENT);mimeBodyPart3.setFileName(fds.getName();/设置文件名multipart.addBodyPart(mimeBodyPart3);msg.setContent(multipart);/设置邮件的正文Transport.send(msg);/发送邮件Network Programming邮件的发送和接收邮件的发送和接收13.7.4邮件正文邮件正文publicstaticvoidmain(Stringargs)throwsExceptionMailClientSendAttachclient=newMailClientSendAttach();client.init();client.sendMessage(client.fromAddr,client.toAddr);client.close();Network Programming邮件的发送和接收邮件的发送和接收13.7.5邮件接收邮件接收n例程的MailClientReadAttach类的processMessage(Messagemsg)方法演示如何解析并处理可能包括附件的邮件。publicstaticvoidprocessMessage(Messagemsg)throwsExceptionprocessMessageHeader(msg);/处理邮件头部Objectbody=msg.getContent();/获得邮件正文if(bodyinstanceofMultipart)processMultipart(Multipart)body);elseprocessPart(msg);Network Programming邮件的发送和接收邮件的发送和接收13.7.5邮件接收(邮件接收(处理邮件头部处理邮件头部)publicstaticvoidprocessMessageHeader(Messagemsg)throwsExceptionfor(Enumeratione=msg.getAllHeaders();e.hasMoreElements();)Headerheader=e.nextElement();System.out.println(header.getName()+:+header.getValue();Network Programming邮件的发送和接收邮件的发送和接收13.7.5邮件接收(邮件正文)邮件接收(邮件正文)附件的获取:从消息中获取附件比发送它们棘手些,因为MIME没有简单的关于附件的概念。当消息包含附件时,消息的内容是个Multipart对象。接着,您需要处理每个Part,获取主要内容和附件。标有从part.getDisposition()获得的Part.ATTACHMENT配置(disposition)的部件(Part)无疑就是附件。但是,没有配置(以及一个非文本MIME类型)和带Part.INLINE配置的部件也可能是附件。当配置要么是Part.ATTACHMENT,要么是Part.INLINE时,这个消息部件的内容就能被保存。只要用getFileName()和getInputStream()就能分别得到原始文件名和输入流。Network Programming邮件的发送和接收邮件的发送和接收13.7.5邮件接收(邮件正文)邮件接收(邮件正文)publicstaticvoidprocessMultipart(Multipartmp)throwsExceptionfor(inti=0;imp.getCount();i+)();/Miltipart的数量,比如多个附件processPart(mp.getBodyPart(i);publicstaticvoidprocessPart(Partpart)throwsExceptionStringfileName=part.getFileName();Stringdisposition=part.getDisposition();StringcontentType=part.getContentType();System.out.println(fileName=+fileName);System.out.println(disposition=+disposition);System.out.println(contentType=+contentType);Network Programming邮件的发送和接收邮件的发送和接收13.7.5邮件接收(邮件正文)邮件接收(邮件正文)if(disposition!=null)&(disposition.equals(Part.ATTACHMENT)|(disposition.equals(Part.INLINE)fileName=File.createTempFile(attachment,.data).getName();Network Programming邮件的发送和接收邮件的发送和接收13.7.5邮件接收(邮件正文)邮件接收(邮件正文)if(fileName=null)/如果不是附件,打印到控制台part.writeTo(System.out);System.out.println();elseFilefile=newFile(fileName);/创建一个在文件系统中不存在的文件for(inti=1;file.exists();i+)StringnewName=i+_+fileName;file=newFile(newName);Network Programming邮件的发送和接收邮件的发送和接收13.7.5邮件接收(邮件正文)邮件接收(邮件正文)/把附件保存到一个文件中OutputStreamout=newBufferedOutputStream(newFileOutputStream(file);InputStreamin=newBufferedInputStream(part.getInputStream();intb;while(b=in.read()!=-1)out.write(b);out.close();in.close();Network Programming邮件的发送和接收邮件的发送和接收小结小结n邮件服务器:要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。这些服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。n电子邮箱:电子邮箱(E-mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个帐户。用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个帐号分配一定的空间,用户从而可以使用这个帐号以及空间,发送电子邮件和保存别人发送过来的电子邮件。Network Programming邮件的发送和接收邮件的发送和接收小结小结nSMTP协议(画图演示)n用户连上邮件服务器后,要想给它发送一封电子邮件,需要遵循一定的通迅规则,SMTP协议就是用于定义这种通讯规则的。n因而,通常我们也把处理用户smtp请求(邮件发送请求)的邮件服务器称之为SMTP服务器。(25)nPOP3协议n同样,用户若想从邮件服务器管理的电子邮箱中接收一封电子邮件的话,他连上邮件服务器后,也需要遵循一定的通迅格式,POP3协议用于定义这种通讯格式。n因而,通常我们也把处理用户pop3请求(邮件接收请求)的邮件服务器称之为POP3服务器。(110)Network Programming邮件的发送和接收邮件的发送和接收小结小结nIMAP协议它的主要作用是邮件客户端(例如MSOutlookExpress)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。用户可以通过浏览信件头来决定是否收取、删除和检索邮件的特定部分,还可以在服务器上创建或更改文件夹或邮箱,它除了支持POP3协议的脱机操作模式外,还支持联机操作和断连接操作。它为用户提供了有选择的从邮件服务器接收邮件的功能、基于服务器的信息处理功能和共享信箱功能。Network Programming邮件的发送和接收邮件的发送和接收练习题练习题1n问题:以下哪个协议允许管理远程邮件服务器上的邮问题:以下哪个协议允许管理远程邮件服务器上的邮件夹?件夹?n选项选项:na)POP3nb)SMTPnc)HTTPnd)IMAP4n答案答案:dNetwork Programming邮件的发送和接收邮件的发送和接收练习题练习题2n问题:以下哪个协议是问题:以下哪个协议是发送邮件服务器使用邮件发送协议?n选项选项:na)POP3nb)SMTPnc)HTTPnd)IMAP4n答案答案:bNetwork Programming邮件的发送和接收邮件的发送和接收练习题练习题3n问题:以下哪些方法属于问题:以下哪些方法属于Store类的方法?类的方法?n选项选项:na)connect(Stringhost,Stringuser,Stringpassword)nb)getFolder(Stringname)nc)send(Messagemsg)nd)setText(Stringtxt)n答案答案:a,bNetwork Programming邮件的发送和接收邮件的发送和接收练习题练习题4n问题:问题:假设登入到一个假设登入到一个IMAPIMAP服务器的用户名为服务器的用户名为“TomTom”,口令为,口令为“12341234”,IMAPIMAP服务器的主机名为服务器的主机名为myhostmyhost,以下哪个以下哪个URLURL地址代表该用户的地址代表该用户的inboxinbox邮件夹?邮件夹?n选项选项:na)imap:/myhost/Tom/1234/inboxnb)imap:/inbox.myhost/Tom/1234/nc)imap:/1234:Tommyhost/inboxnd)imap:/Tom:1234myhost/inboxn答案答案:dNetwork ProgrammingNetwork Programming邮件的发送和接收邮件的发送和接收练习题练习题5n问题:问题:以下哪些邮件标记只能被客户程序读取,而不以下哪些邮件标记只能被客户程序读取,而不能被客户程序修改?能被客户程序修改?n选项选项:na)Flags.Flag.ANSWEREDnb)Flags.Flag.DELETEDnc)Flags.Flag.RECENTnd)Flags.Flag.SEENne)Flags.Flag.DRAFTnf)Flags.Flag.USERn答案答案:c,fNetwork Programming邮件的发送和接收邮件的发送和接收练习题练习题6n问题:问题:MultiPartMultiPart与与BodyPartBodyPart之间是什么关系之间是什么关系?n选项选项:na)继承继承nb)依赖依赖nc)组成组成nd)实现)实现n答案答案:cNetwork Programming邮件的发送和接收邮件的发送和接收思考与编程思考与编程1、电子邮件发送和接收过程?2、用用JavaMail实现实现电子邮件发送和接收。Network Programming邮件的发送和接收邮件的发送和接收使用使用Socket发送电子邮件发送电子邮件1、SMTP客户与SMTP服务器之间的会话(1)SMTP会话图 SMTP客户与SMTP服务器之间的会话 Network Programming邮件的发送和接收邮件的发送和接收使用使用Socket发送电子邮件发送电子邮件(2)SMTP命令一般是客户主动,首先发送。一般是客户主动,首先发送。SMTP客户发往客户发往SMTP服务器服务器的信息称为的信息称为SMTP命令。在命令。在RFC821中,中,SMTP协议规定了协议规定了14种命令。种命令。SMTP命令的一般的格式是:命令的一般的格式是:命令关键字命令关键字参数参数其中,命令关键字一般是四个字母,是一个英文动词的缩写。其中,命令关键字一般是四个字母,是一个英文动词的缩写。参数随命令而异,命令应当以回车换行符结束。参数随命令而异,命令应当以回车换行符结束。比如比如HELOWANGNetwork Programming邮件的发送和接收邮件的发送和接收使用使用Socket发送电子邮件发送电子邮件(3)SMTP应答SMTP服务器收到命令后,返回给服务器收到命令后,返回给SMTP客户的信息,客户的信息,称为称为SMTP应答。客户每次发送一条应答。客户每次发送一条SMTP命令后,服命令后,服务器给客户返回一条响应。务器给客户返回一条响应。SMTP规定了规定了23种响应码。种响应码。SMTP应答都是以一个响应码开头,后面接着响应的描应答都是以一个响应码开头,后面接着响应的描述信息,如果述信息,如果SMTP服务器不一样,响应的描述信息服务器不一样,响应的描述信息可能不一样,可能不一样,SMTP应答的一般格式是:应答的一般格式是:响应码响应码响应的文本描述信息响应的文本描述信息其中,响应码为其中,响应码为3位数字,与描述信息文本之间有一个位数字,与描述信息文本之间有一个空格,空格,Network Programming邮件的发送和接收邮件的发送和接收使用使用Socket发送电子邮件发送电子邮件2、常用的SMTP命令(1)SMTP客户问候SMTP服务器命令格式:命令格式:HELO发送方的主机名发送方的主机名(2)邮件来自何处,说明发信人的电子邮件地址命令格式:命令格式:MAILFROM:发信人的电子邮件地址:发信人的电子邮件地址(3)说明收信人的电子邮件地址命令格式:命令格式:RCPTTO:收信人的电子邮箱地址:收信人的电子邮箱地址(4)请求发送邮件内容命令格式:命令格式:DATANetwork Programming邮件的发送和接收邮件的发送和接收使用使用Socket发送电子邮件发送电子邮件(5)空操作命令格式:命令格式:NOOP(6)验证电子信箱是否合法命令格式:命令格式:VRFY电子信箱地址电子信箱地址(7)复位SMTP服务器命令格式:命令格式:RSET(8)请求服务器发回帮助信息命令格式:命令格式:HELP或者或者HELP命令关键字命令关键字(9)退出会话命令格式:命令格式:QUITNetwork Programming邮件的发送和接收邮件的发送和接收使用使用Socket发送电子邮件发送电子邮件3、常用的SMTP响应码211系统状态或系统帮助应答。系统状态或系统帮助应答。214帮助信息帮助信息220服务就绪。服务就绪。221服务器关闭传输通道。服务器关闭传输通道。250请求的邮件操作已经完成。请求的邮件操作已经完成。251用户不是本地的,将按照前向路径(用户不是本地的,将按照前向路径(forwaed-path)发。)发。354启动邮件输入,要求邮件文本要用启动邮件输入,要求邮件文本要用结束。结束。421服务不可使用,关闭传输通道。服务不可使用,关闭传输通道。450没有执行请求的邮箱操作,因为信箱不可用。没有执行请求的邮箱操作,因为信箱不可用。Network Programming邮件的发送和接收邮件的发送和接收使用使用Socket发送电子邮件发送电子邮件451请求的操作已经终止,因为在处理的过程中出现了错误。请求的操作已经终止,因为在处理的过程中出现了错误。452请求的操作没有发生,因为系统的存储空间不够,请求的操作没有发生,因为系统的存储空间不够,500语法错误,命令不可识别。语法错误,命令不可识别。501参数或变元中存在着语法错误。参数或变元中存在着语法错误。502命令不能实现。命令不能实现。503错误的命令序列错误的命令序列504命令的参数不能实现。命令的参数不能实现。550请求的操作不能发生,信箱不可用。请求的操作不能发生,信箱不可用。551用户不在本地,请尝试发送到前向路径(用户不在本地,请尝试发送到前向路径(forwaed-path)。)。552请求的邮件操作终止,超出存储分配。请求的邮件操作终止,超出存储分配。553请求的操作不能执行,因为信箱语法错误。请求的操作不能执行,因为信箱语法错误。554事务失败。事务失败。Network Programming邮件的发送和接收邮件的发送和接收4、SMTP的会话过程SMTP客户与客户与SMTP服务器的会话过程分为三个阶段,先举例服务器的会话过程分为三个阶段,先举例说明。以下每行前面的说明。以下每行前面的C代表代表SMTP客户发送的命令,客户发送的命令,S代代表服务器发回的响应。每行表服务器发回的响应。每行/后面的内容是注释。后面的内容是注释。C:HELOYE/你好!我是你好!我是YE。S:250YEHELLOsmtp.163.com,pleasedtomeetyou/你好!你好!YE,很高兴见到你,有事吗?,很高兴见到你,有事吗?C:MAILFROM:YE163.COM/我想发信,我的地址是我想发信,我的地址是YE163.COM。S:250,Sender,accepted/行!有信你就发吧行!有信你就发吧使用使用Socket发送电子邮件发送电子邮件Network Programming邮件的发送和接收邮件的发送和接收使用使用Socket发送电子邮件发送电子邮件C:RCPTZHANG263.net/我的信要发给我的信要发给ZHANG263.net。S:250,Recipientok/行!已行!已经准备好。经准备好。C:DATA/我要发信件的内容了。我要发信件的内容了。S:354Entermail,endwith./发吧!发吧!结尾标志是两个回车换行符夹个英文句点。结尾标志是两个回车换行符夹个英文句点。C:(客户端按照电子邮件的格式发送邮件内容):(客户端按照电子邮件的格式发送邮件内容)C:(邮件内容发送完毕,发送结束标志:(邮件内容发送完毕,发送结束标志crlf&.&crlf)/我我的信已经发完了的信已经发完了S:250ok,messagesaved/好的,你的信已经存储好的,你的信已经存储了。了。C:QUIT/再见再见S:221Seeyouincyberspace/再见再见Network Programming邮件的发送和接收邮件的发送和接收使用使用Socket发送电子邮件发送电子邮件在上面的对话过程中,粗体字部分是发送邮件的客户端软件在上面的对话过程中,粗体字部分是发送邮件的客户端软件发送的内容,其他部分是发送的内容,其他部分是SMTP服务器的应答内容。从中服务器的应答内容。从中可以明显看出可以明显看出SMTP会话具有以下特点:会话具有以下特点:(1)会话的过程采用交互式的请求应答模式,客户发送命令,)会话的过程采用交互式的请求应答模式,客户发送命令,服务器回送应答。服务器回送应答。(2)客户发送的命令和服务器回送的应答都是纯文本形式,)客户发送的命令和服务器回送的应答都是纯文本形式,有一定格式。有一定格式。(3)针对客户的每个命令,服务器总要返回一定的响应码,)针对客户的每个命令,服务器总要返回一定的响应码,表示服务器是否接受或执行了客户端命令。表示服务器是否接受或执行了客户端命令。(4)会话过程有一定的顺序)会话过程有一定的顺序Network Programming邮件的发送和接收邮件的发送和接收使用使用Socket发送电子邮件发送电子邮件(1)启动)启动SMTP服务器,在指定的传输层端口监听客户服务器,在指定的传输层端口监听客户端的连接请求,为端的连接请求,为SMTP服务器保留的端口是服务器保留的端口是25。(2)客户端设置)客户端设置sock连接的连接的IP地址或域名,指定端口地址或域名,指定端口号,主动发出连接请求,连接到号,主动发出连接请求,连接到SMTP服务器。比如,服务器。比如,网易的网易的SMTP服务器的域名是服务器的域名是smtp.163.com,监听,监听端口是端口是25。(3)服务器接收客户端的连接请求,并发回响应。客户)服务器接收客户端的连接请求,并发回响应。客户端应收到类似端应收到类似220BigFoxESMTPserviceready这这样的信息样的信息,这就说明客户端已经与服务器建立这就说明客户端已经与服务器建立TCP/IP连接,成功地实现了第一步。连接,成功地实现了第一步。Network Programming邮件的发送和接收邮件的发送和接收使用使用Socket发送电子邮件发送电子邮件(4)客户端和服务器分别向对方发送数据。)客户端和服务器分别向对方发送数据。(5)客户端或服务器分别读取自己缓冲区中的数据。)客户端或服务器分别读取自己缓冲区中的数据。(6)以上两步是)以上两步是SMTP会话的主要部分,要按照会话的主要部分,要按照SMTP协议的规定,按照一定顺序,客户向服务器发送命令,协议的规定,按照一定顺序,客户向服务器发送命令,服务器向客户发送应答,以上两步要多次重复。服务器向客户发送应答,以上两步要多次重复。(7)会话完毕,关闭客户端和服务器之间的连接。)会话完毕,关闭客户端和服务器之间的连接。Network Programming邮件的发送和接收邮件的发送和接收POP3的会话过程Network Programming邮件的发送和接收邮件的发送和接收POP3的会话过程POP也使用客户/服务器工作模式,在接收邮件的用户的PC机中,运行POP客户程序,在用户所连接的ISP的邮件服务器中,运行POP服务程序,二者之间按照POP协议相互发送信息,POP客户发送给POP服务器的消息称为POP命令,POP服务器返回的消息称为POP响应。交互的过程称为POP会话。例如:(Connect to the POP3 Server .) /首先连接到POP3服务器S: +OK POP3 server ready /服务器已经准备好C: USER Wang /用户名是Wang Network Programming邮件的发送和接收邮件的发送和接收POP3的会话过程S: +OKC: PASS vegetables /口令是vegetablesS: +OK login successful /客户登录成功了C: LIST /请列出信箱中的信件清单 S: 1 AAAA /第一封信S: 2 BBBB /第二封信S: 3 CCCC /第三封信C: RETR 1 /取回第一封信S: +OK (send message 1) /好,(发送第一封信)Network Programming邮件的发送和接收邮件的发送和接收POP3的会话过程C: DELE 1 /删除第一封信S: +OK /好的C: RETR 2S: +OK (send message 2)C: DELE 2S: +OKC: QUIT /结束会话,再见S: +OK POP3 server disconnecting /好,POP3服务器断开连接 Network Programming邮件的发送和接收邮件的发送和接收POP3的会话过程在上面的对话过程中,C:后面是接收邮件的客户端软件发送的命令,S:后面是POP服务器的应答,/后面是注释。从这个例子中可以看出POP会话的特点:会话采用交互的请求应答模式,会话过程通过相互发送文本来完成。客户发送的文本命令也采用命令字 参数的形式。服务器对于客户的命令总是返回一定的响应码,表示客户端的请求是否被正确处理。会话过程所发送的命令有一定的顺序 Network Programming邮件的发送和接收邮件的发送和接收POP3的会话过程常用的POP3命令:USERusernamePASSpasswordSTAT 请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数LIST 返回邮件数量和每个邮件的大小RETR Msg#返回由参数标识的邮件的全部文本DELEMsg#服务器将由参数标识的邮件标记为删除,由quit命令执行RSET服务器将重置所有标记为删除的邮件,用于撤消DELE命令NOOP 服务器返回一个肯定的响应QUIT更新 Network Programming邮件的发送和接收邮件的发送和接收接收电子邮件的一般步骤接收电子邮件的一般步骤Network Programming首先利用sock连接上POP3服务器,然后:1使用使用USER命令发送用户信箱名。命令发送用户信箱名。2使用使用PASS命令发送信箱密码。如果密码和命令发送信箱密码。如果密码和信箱不匹配,必须从上一步骤重新开始。信箱不匹配,必须从上一步骤重新开始。3对信箱邮件进行操作。对信箱邮件进行操作。此阶段称为事务状态,在这一个阶段,有许多POP3命令可以使用,大体分为下面几类:(1)取得信箱及邮件状态的命令Stat:取得信箱大小信息List:取得邮件大小信息Uidl:取得邮件的唯一标识符。 邮件的发送和接收邮件的发送和接收接收电子邮件的一般步骤接收电子邮件的一般步骤Network Programming(2)取得邮件内容的命令Retr:从服务器取回邮件TOP: 取邮件信头和信体的前N行。(3)对邮件进行操作的命令Dele:为邮件做删除标记。Rset:复位POP会话。4接收邮件完毕,发送接收邮件完毕,发送QUIT命令,结束命令,结束POP3对话。对话。邮件的发送和接收邮件的发送和接收使用使用Socket接收电子邮件接收电子邮件classPOP3DemoprivatestaticStringPOP3Server=“pop.126.com”;privatestaticStringUSERNAME=“username”;/用户名privatestaticStringPASSWORD=“password”;/密码publicstaticvoidmain(Stringargs)intPOP3Port=110;Socketclient=null;try/向POP3服务程序建立一个套接字连接。client=newSocket(POP3Demo.POP3Server,POP3Port);InputStreamis=client.getInputStream();BufferedReadersockin=newBufferedReader(newInputStreamReader(is)/创建一个BufferedReader对象,以便从套接字读取输出。OutputStreamos=client.getOutputStream();PrintWritersockout=newPrintWriter(os,true);/创建一个PrintWriter对象,以便向套接字写入内容Network Programming邮件的发送和接收邮件的发送和接收使用使用Socket接收电子邮件接收电子邮件/*显示同SMTP服务程序的握手过程。*/System.out.println(S:+sockin.readLine();sockout.println(user+POP3Demo.USERNAME);System.out.println(S:+sockin.readLine();sockout.println(pass+POP3Demo.PASSWORD);System.out.println(S:+sockin.readLine();sockout.println(stat);Stringtemp=sockin.readLine().split();intcount=Integer.parseInt(temp1);/得到信箱中共有多少封邮件for(inti=1;icount+1;i+)/依次打印出邮件的内容sockout.println(retr+i);System.out.println(以下为第+i+封邮件的内容);Network Programming邮件的发送和接收邮件的发送和接收使用使用Socket接收电子邮件接收电子邮件while(true)Stringreply=sockin.readLine();System.out.println(reply);if(reply.toLowerCase().equals(.)breakcatch(IOExceptione)System.out.println(e.toString();finallytryif(client!=null)client.close();catch(IOExceptione)Network Programming邮件的发送和接收邮件的发送和接收
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号