用java开发Email工具之发送邮件__教程 |
|
日期:2007-5-20 1:15:52 人气:130 [大 中 小] |
|
|
|
当一个电子邮件程序和SMTP服务程序建立联系后,SMTP服务程序将向电子邮件程序发送初始化消息。该消息包含了一个三位回应码,这个回应码是用来标识SMTP服务程序的。除此之外,在SMTP服务程序发送给电子邮件程序的消息的头部也带有回应码,它们被用来表示操作成功或者失败。电子邮件程序接收到这些回应码后,可以根据其中包含的信息完成相应的工作。而消息的文本部分是给人看的,电子邮件程序可以忽略文本部分。
在收到初始化消息后,电子邮件程序通过发送HELO命令来开始传输邮件。HELO命令有一个参数,该参数标志了SMTP服务程序所在服务器的域名。它将在SMTP服务程序中标识出SMTP服务程序。作为回应,SMTP服务程序进行一些初始化工作,将自己设定到初始状态以接收电子邮件。当这些工作成功完成后,它发送回一条成功的回应消息给电子邮件程序,该回应消息以回应码250开头。
在HELO命令之后,电子邮件程序会发送MAIL命令。MAIL命令将在SMTP服务程序中标识出发送者,它有两个参数:FROM:和一个电子邮件地址。如果SMTP服务程序能够成功地解析电子邮件地址的话,通常它将返回以250开头的回应消息;否者将发送回表示操作失败的回应消息。
在MAIL之后是RCPT命令。RCPT命令在SMTP服务程序中标识出一个邮件的接收者,它也有两个参数:TO:和一个电子邮件地址。如果邮件由多个接收者,则程序需要多次发送RCPT命令。
RCPT命令之后,程序需要发送电子邮件本身了。程序先发送一个DATA命令,当接收到表示成功的回应消息后,将电子邮件逐行发送给SMTP服务程序,当所有的行都发送完毕后,程序发送一行由句号组成的行。在此之后,电子邮件程序等待SMTP服务程序的回应消息,以确定邮件被SMTP服务程序正常接收了。这一切都成功后,程序可以发送RSET命令来退出邮件传输过程。最后,当要断开和SMPT服务程序建立的连接时,程序发送QUIT命令。主要提醒的一点是,虽然上面的命令都是大写的,但是在实际的协议对大小写不敏感。 现在也许你关心的问题是回应码的格式是怎样的。最左边的一位数字代表操作是否成功,1代表收到命令,2代表操作成功完成,3代表等待后续命令,4代表操作临时未能完成(电子邮件程序可以在当前的邮件传输过程中重新发送命令),5代表操作不能完成(电子邮件程序不能在当前的邮件传输过程中重新发送命令)。第二位数字代表回应的领域,0代表语法错误,1代表消息请求,2代表传输通道,3和4没有指定,5代表与邮件系统相关。最有一位数字对第二位数字做补充说明,这里就不再详述。根据上面的信息,我们可以看出250代表请求的命令已经成功完成;220代表SMTP服务程序正在等待HELO命令;而503代表命令顺序错误。有兴趣的朋友可以参见RFC 2821。
下面提供了一个基于命令行的例子SMTPDemo,这个例子可以帮助你理解基于SMTP的邮件传输机制。这个程序将利用标准端口25连接到一个SMTP服务程序上。为了使程序能够运行,你需要将home更改为你使用的邮件服务器的地址。
// SMTPDemo.java import java.io.*; import java.net.*; class SMTPDemo { public static void main (String [] args) { String SMTPServer = "home int SMTPPort = 25; Socket client = null; try { // 向SMTP服务程序建立一个套接字连接。 client = new Socket (SMTPServer, SMTPPort); // 创建一个BufferedReader对象,以便从命令行读取用户输入。 BufferedReader stdin; stdin = new BufferedReader (new InputStreamReader (System.in)); // 创建一个BufferedReader对象,以便从套接字读取输出。 InputStream is = client.getInputStream (); BufferedReader sockin; sockin = new BufferedReader (new InputStreamReader (is)); // 创建一个PrintWriter对象,以便向套接字写入内容。 OutputStream os = client.getOutputStream (); PrintWriter sockout; sockout = new PrintWriter (os, true); // 显示同SMTP服务程序的握手过程。 System.out.println ("S:" + sockin.readLine ()); while (true) { System.out.print ("C:"); // 读取用户输入。 String cmd = stdin.readLine (); // 将用户输入的命令发送到SMTP服务程序。 sockout.println (cmd); // 从套接字读取SMTP服务程序的回应消息并显示在屏幕上。 String reply = sockin.readLine (); System.out.println ("S:" + reply); // 如果发送了DATA命令并且获得成功的回应消息,从输入设备读取行, // 直到读取到完全由句号组成的行时停止, 这些行构成了电子邮件。 if (cmd.toLowerCase ().startsWith ("data") && reply.substring (0, 3).equals ("354")) { do { cmd = stdin.readLine (); if (cmd != null && cmd.length () 〉 1 && cmd.charAt (0) == ´.´) cmd = "."; sockout.println (cmd); if (cmd.equals (".")) break; } while (true); // 从SMTP服务程序中读取回应消息并显示。 reply = sockin.readLine (); System.out.println ("S:" + reply); continue; } // 如果用户输入QUIT命令,则退出程序。 |
|
出处:本站原创 作者:佚名 |
|
|