SMTP是工作在两种情况下:一是电子邮件从客户机传输到服务器:二是从某一个服务器传输到另一个服务器。SMTP也是个请求/响应协议,命令和响应都是基于ASCⅡ文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码。SMTP使用TCP协议25号端口监听连续请求。
连接和发送过程如下:[12]
(1)建立TCP 连接。
(2)客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令;服务器端正希望以OK作为响应,表明准备接收。
(3)客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行;服务器端则表示是否愿意为收件人接收邮件。
(4)协商结束,发送邮件,用命令DATA发送。
(5)以“.”号表示结束输入内容一起发送出去,结束此次发送,用QUIT命令退出。
2 .2 JavaMail API简介
JavaMail API是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展)。您可使用这种包创建邮件用户代理(Mail User Agent ,MUA) 类型的程序,它类似于Eudora、Pine及Microsoft Outlook这些邮件程序。其主要目的不是像发送邮件或其他邮件传输代理(Mail Transfer Agent,MTA)类型的程序那样用于传输、发送和转发消息[13]。换句话说,用户可以与MUA类型的程序交互,以阅读和撰写电子邮件。MUA依靠MTA处理实际的发送任务。
JavaMail API的设计是为收发信息提供与协议无关的访问。方式是把该API划分成两个部分:
•API的第一个部分是是如何发送和接收独立于提供程序/协议的消息。
•API的第二个部分则使用特定的协议语言,如:SMTP、POP、IMAP以及NNTP等等。如果要让JavaMail API与服务器通信,就需要为之提供这些协议。
JavaMail API中提供了很多用于处理E-mail的类,其中比较常用的有Session(回话)类、Message(消息)类、Address(地址)类、Authenticator(认证方式)类、Transport(传输)类、Store(存储)类和Folder(文件夹)类等7个类。这7个类都可以在JavaMailAPI的核心包mail.jar中找到。
发送、接收邮件的整个流程图如图2.1所示:
图2.1 电子邮件工作流程图
2.3 JavaMail体系结构
要完成消息的交互,需要几方面的支持:邮件发送客户端程序、邮件接收客户端程序、邮件发送服务器和邮件接收服务器,此外,还需要相关的通信协议。
邮件发送客户端程序和邮件接收客户端程序可以是相同的,例如经常使用的微软的Outlook既可以发送邮件,也可以接收邮件。
邮件发送服务器和邮件接收服务器也可以是相同的服务器。在与邮件服务器交互的过程中,主要完成两个动作,把邮件发送到邮件服务器,以及从邮件服务器读取邮件。所以,主要使用两类协议,分别进行邮件的发送和接收。
邮件从发送方到接收方的传递过程(参见图2.2)如下:[14]
(1)邮件发送方通过邮件发送客户端把邮件发送到发送方的邮件服务器,在发送的过程中需要用到SMTP协议。
(2)发送方的邮件服务器把邮件发送到接收方的邮件服务器,使用的协议也是SMTP。
(3)邮件接收方从接收方邮件服务器接收邮件,使用POP3协议或者IMAP协议。
图2.2 SMTP/POP3转发模型图
2.4 JavaMail核心成员
1.Session类
Session 类定义了一个基本邮件会话,是Java Mail API最高层入口类。所有其它类都是经由这个session 才得以生效。Session 对象用 Java.util.Properties 对象获取信息,如邮件服务器、用户名、密码及整个应用程序享的其它信息。
2.Message类
当建立了Session对象后,Message类便可以被发送的构造信息体了。大多数情况下,我们使用javax.mail.internet.MimeMessage这个子类,MimeMessage 是个能理解 MIME 类型和头的电子邮件消息,该类是使用MIME类型、MIME信息头的邮箱信息。信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用。[15] JAVA电子邮件接收程序的设计与实现(4):http://www.751com.cn/jisuanji/lunwen_6135.html