作者:冯睿
本文介绍了如何利用Java的网络API来实现一个电子邮件工具程序。通常Email工具都是使用SMTP(简单邮件传输协议, Simple Mail Transfer Protocol)来发送邮件,使用POP3协议来接受电子邮件。在本文中只对这两个协议作简单介绍。如果有兴趣的读者可以参考以下站点:
POP3: ftp://ftp.isi.edu/in-notes/rfc1939.txt
SMTP: ftp://ftp.isi.edu/in-notes/rfc2821.txt
Java中虽然提供了JavaMail API,但是由于在这篇文章中我将从底层来探讨电子邮件软件是如何工作的,因此不会使用JavaMail API。本文中的例子是在J2SE 1.4下开发的。
电子邮件的格式
在开发Email软件之前,你需要了解电子邮件的格式。根据RFC 2882(http://www.faqs.org/rfcs/rfc2822.html)的规定,电子邮件由很多行组成,每行由〈CRLF〉(ASCII代码13和ASCII代码10)结束。每行的最大长度为998个字符。其中有些行提供了收发电子邮件所必需的信息,这些行被称为头(Header),所有的头构成了头域(Header Field)。其他的行用于保存邮件的具体内容。
头域提供了很多信息,其中包括邮件的来源;邮件的目的地和邮件的主题等。每个头由名称和冒号加上相应的值构成。例如From:、Send:和Reply-To:中记录了邮件的来源。在From:中记录的是邮件的作者;在Sender:中指定了发送邮件的代理(可以是邮件地址,也可以是机器名称);Reply-To:中指定了接受回信的邮箱地址。
一封邮件可能有多个作者,因此From:中可以指定一个或多个邮箱地址。下面给出了一个个From:的例子:
From: Ray Feng 〈
[email protected]〉,
[email protected]在一封电子邮件中只能有一个Sender。因此Sender:的值只能包含一个邮箱地址。如果在From:中只有一个作者,而且Sender:的值和From:的值相同,则Sender:就不会出现在电子邮件中,否则会出现信息冗余;反之Sender:则应该出现在邮件中。下面是一个Sender:的例子:
Sender: Ray Feng
[email protected]在电子邮件中可以指定将回信发送到多个邮箱地址中。因此Reply-To:中可以包含一个或多个邮箱地址,每个地址之间用逗号隔开。如果邮件中有Reply-To:,回信会被发送到罗列在Reply-To:中的所有地址;如果邮件中没有Reply-To:,则回信会被发送到罗列在From:中的地址。那么谁会收到邮件呢?To:和Cc:中保存了接受邮件的邮箱地址。两者的值都可以包含多个邮箱地址。
除了邮件的来源和接受者,RFC 2882中还定义了其他一些头,例如Subject:中包含了电子邮件的主题。下面是一个电子邮件头域的例子: