我们都习惯了用邮件客户端软件或者登录到电子邮件站点进行收发邮件,现在尝试一下使用 Windows 自带的 Telnet 程序手工地发送一封简单的邮件,以此来稍微明白关于邮件发送的一些知识。
现在 E-mail 的传输一般都使用了 ESMTP (扩展的简单邮件传输协议),SMTP 中定义了 18 条命令,用于发送一封邮件。但是作为一个测试实验的话,我们只需要其中最基本的6条命令。
如下(其中的<Space>代表一个空格,<CRLF>代表回车加换行,即写代码时的 \r\n ):
ehlo<Space>主机名<CRLF>
SMTP 邮件发送程序与SMTP邮件接收程序建立连接的第一条必须的命令,主机名是当前邮件发送者的主机名;
auth<Space>login<CRLF>
现在一般的邮箱都需要进行用户名、密码验证,而且SMTP 邮件服务器一般都使用 Login 验证方式,因此就不用考虑其他两种验证方式了;
mail<Space>from:发送人邮箱地址<CRLF>
从命令中很明显地看出来 mail 命令用于指定邮件发送者的邮箱地址;
rcpt<Space>to:收件人邮箱地址<CRLF>
同理,rcpt 命令用于指定邮件接收人的邮箱地址;
data<CRLF>
data 命令用于表示该命令之后的所有内容、数据都将被作为邮件的相关内容,直到遇到<CRLF>.<CRLF>标识符,即一个句号“.”结束邮件的发送内容;
quit<CRLF>
该命令结束邮件发送过程,关闭本机与SMTP 邮件服务器的网络连接。
在该测试中,我在mail.163.com 和 mail.sina.com 分别注册了 test_hao@163.com 和 test_hao@sina.cn 两个邮箱,密码都是 123456 。由于这两个邮件服务器都需要进行用户名、密码进行身份验证,而且需要将我们的用户名、密码进行 BASE64 编码之后在进行发送验证,故我们使用 Java 中的 sun.misc.BASE64Encoder 类写一个 BASE64 转码程序,源代码如下:
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- //import sun.misc.BASE61Encoder;
- public class BASE64Util
- {
- public static void main(String [] args) throws IOException
- {
- BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
- System.out.println("转码前:");
- System.out.print("用户名 = ");
- String userName = in.readLine();
- System.out.print("密码 = ");
- String pwd = in.readLine();
- sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
- System.out.println("\n转码后:");
- System.out.println("用户名 : " + encoder.encode(userName.getBytes()));
- System.out.println("密码 : " + encoder.encode(pwd.getBytes()));
- }
- }
注:由于 BASE61Encoder 类是 JDK 自带的,编译时会出现警告,我们忽略则可。现在将我们的邮箱用户名、密码进行 BASE64 编码,如下:
准备好这一些之后,可以开始发送邮件了,假设我们将邮件从 163 发送到 sina ,步骤如下(最好将以下一行一行的命令预先写在文本中,否则一旦输入错误就要重新来过了):
1、使用 Telnet 程序连接到 163 的邮件服务器的 25 端口(该端口是默认的),如下图:
2、上面第一步完成按下 Enter 一般就会连接得上了,我们再按照上面所说的 6 条最基本的命令来发送邮件,输入ehlo hao (这个主机名自己取一个),返回一系列响应状态码,如下:
3、使用 auth 命令进行身份验证,先输入 auth login ,然后再分两步地输入转码后的用户名、密码,其中加了方框的是我们的输入,如下:
4、输入邮件发送人邮箱地址、收件人邮箱地址,如下:
6、此时可以开始输入邮件内容了,使用 data 命令,再输入内容,如下:
7、此时,邮件发送成功了,去查看一下,如下图:
虽然发送成功了,但是上面的邮件正文不应该包含from 、to 、subject 的相关内容的,我当我从 163 发送到 qq 邮箱时,这些内容被 qq 邮件服务器解析得比较正确,格式很好,这似乎也说明不同的邮件服务器的功能服务有所差别…
使用 Telnet 手工发送邮件的过程到此结束,感受一下,觉得还真的挺麻烦的…
本文转自 xxxx66yyyy 51CTO博客,原文链接:http://blog.51cto.com/haolloyin/351256,如需转载请自行联系原作者