欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaMail(一)

程序员文章站 2022-07-15 21:54:16
...
[size=medium][color=darkred][b]浅谈邮件传输协议[/b][/color][/size]
[color=red]SMTP(Simple Mail Transfer Protocol)[/color]即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把Email寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
简单邮件传输协议(SMTP)是一种基于文本的电子邮件传输协议,是在因特网中用于在邮件服务器之间交换邮件的协议。SMTP是应用层的服务,可以适应于各种网络系统。
SMTP的命令和响应都是基于文本,以命令行为单位,换行符为CR/LF。响应信息一般只有一行,由一个3位数的代码开始,后面可附上很简短的文字说明。
SMTP要经过建立连接、传送邮件和释放连接3个阶段。具体为:
(1)建立TCP连接。
(2)客户端向服务器发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令。
(3)服务器端以OK作为响应,表示准备接收。
(4)客户端发送RCPT命令。
(5)服务器端表示是否愿意为收件人接收邮件。
(6)协商结束,发送邮件,用命令DATA发送输入内容。
(7)结束此次发送,用QUIT命令退出。  
客户端邮件首先到达数据发送服务器,再由发送服务器负责发送到接收方的服务器。在发送邮件前,发送服务器会与接收方服务器联系,已确认接收方服务器是否已准备好接受邮件。如果已经准备好,则传送邮件;如果没有准备好,发送服务器便会等待,并在一段时间后继续与接收方服务器进行联系,若在规定的时间内联系不上,发送服务器会发送一个消息到客户的邮箱说明情况。
SMTP服务器基于DNS中的邮件交换(MX)记录路由电子邮件。电子邮件系统发邮件时是根据收信人的地址后缀来定位邮件服务器的。SMTP通过用户代理程序(UA)完成邮件的编辑、收取和阅读等功能;通过邮件传输代理程序(MTA)将邮件传送到目的地。
[color=red]POP(Post Office Protocol)即邮局协议[/color],POP协议允许工作站动态访问服务器上的邮件,目前已发展到第三版,称为 POP3。
POP协议支持“离线”邮件处理。其具体过程是:邮件发送到服务器上,用户通过自己所熟悉的邮件客户端软件,例如Foxmail、Outlook Express和the Bat等,经过相应的参数设置(主要是设置POP3邮件服务器的IP地址或者域名、用户名和口令)后,可以连接到邮件服务器并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人机器上,[color=red]邮件服务器上的邮件被删除[/color]。
POP3 并不支持对服务器上邮件进行扩展操作,此过程由更高级的IMAP4完成。POP3使用TCP作为传输协议。
[color=red]IMAP(Internet Message Access Protocol)[/color]即Internet消息访问协议,运行在TCP/IP协议之上,使用的端口是143,是一种功能比POP3更强大的新的接收邮件协议。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。常用的版本是IMAP4。
[color=olive]邮件客户程序的主要任务是向邮件服务器发送邮件,以及接收来自邮件服务器的邮件。如果用java语言从头编写邮件客户程序,就必须通过java套接字(socket)与邮件服务器通信,发送和接收符合IMAP、POP3或SMTP协议的请求和响应信息。[/color]
[img]http://dl.iteye.com/upload/attachment/473266/e1ba5ce4-1eb4-3157-a384-ecea702219c3.jpg[/img]
如果使用命令行发邮件的话,用户名和密码是需要[color=red]Base64[/color]编码的,下面的类提供了对用户名和密码编码的功能:

public class JmailClient {
public static void main(String[] args)throws Exception {
BASE64Encoder encoder = new BASE64Encoder();
System.out.println("请输入用户名:");
String name = new BufferedReader(new InputStreamReader(System.in)).readLine();
System.out.println(encoder.encode(name.getBytes()));
System.out.println("请输入密码:");
String password = new BufferedReader(new InputStreamReader(System.in)).readLine();
System.out.println(encoder.encode(password.getBytes()));
}
}


HELO : 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
EHLO : 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL FROM : 命令中指定的地址是发件人地址
RCPT TO : 标识单个的邮件接收人;可有多个RCPT TO;常在 MAIL 命令后面。
DATA : 在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF结束(回车点回车)
VRFY : 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN : 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP : 查询服务器支持什么命令
NOOP : 无操作,服务器应响应 OK
RSET : 重置会话,当前传输被取消
QUIT : 结束会话

Telnet协议是TCP/IP协议族中的一员,位于OSI模型的第7层---应用层上的一种协议。它是Internet远程登陆服务的标准协议和主要方式,是一个通过创建虚拟终端提供连接到远程主机终端仿真的TCP/IP协议。这一协议需要通过用户名和口令进行认证,是Internet远程登陆服务的标准协议。
它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样,从而可以在本地就能控制服务器。Telnet是常用的远程控制Web服务器的方法。

telnet [-a][-e escape char][-f log file][-l user][-t term][host [port]]
-a 企图自动登录。除了用当前已登陆的用户名以外,与-l选项相同。
-e 跳过字符来进入 telnet 客户提示。
-f 客户端登录的文件名
-l 指定远程系统上登录用的用户名称。
要求远程系统支持 TELNET ENVIRON 选项。
-t 指定终端类型。
支持的终端类型仅是: vt100, vt52, ansi 和 vtnt。
host 指定要连接的远程计算机的主机名或IP地址。
port 指定端口号或服务名。

[color=olive]举例1.[/color]
首先通过命令行:[color=red]telnet mail.ydon.com 25[/color]
[img]http://dl.iteye.com/upload/attachment/473271/6ec19e4c-f994-3e7c-a28a-b8707b276ad1.jpg[/img]
在发送数据时,输入data命令后,可以使用的Email关键字:
[img]http://dl.iteye.com/upload/attachment/473268/39c9ff78-0312-3c4f-b981-05819121942a.jpg[/img]
[align=center][color=darkred][b]<<To Be Continued>>[/b][/color][/align]