简单讲述下发送和接受邮件的协议:
SMTP

    简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)由 RFC 821 定义。它定义了发送电子邮件的机制。在 JavaMail API 环境中,您基于 JavaMail 的程序将和您的公司或因特网服务供应商的(Internet Service Provider's,ISP's)SMTP 服务器通信。SMTP 服务器会中转消息给接收方 SMTP 服务器以便最终让用户经由 POP 或 IMAP 获得。这不是要求 SMTP 服务器成为开放的中继,尽管 SMTP 服务器支持身份验证,不过还是得确保它的配置正确。像配置服务器来中继消息或添加删除邮件账号这类任务的实现,JavaMail API 中并不支持。

   
POP

    POP 代表邮局协议(Post Office Protocol)。目前用的是版本 3,也称 POP3,RFC 1939 定义了这个协议。POP 是一种机制,因特网上大多数人用它得到邮件。它规定每个用户一个邮箱的支持。这就是它所能做的,而这也造成了许多混淆。使用 POP 时,用户熟悉的许多性能并不是由 POP 协议支持的,如查看有几封新邮件消息这一性能。这些性能内建于如 Eudora 或 Microsoft Outlook 之类的程序中,它们能记住一些事,诸如最近一次收到的邮件,还能计算出有多少是新的。所以当使用 JavaMail API 时,如果您想要这类信息,您就必须自己算。

IMAP

    IMAP 是更高级的用于接收消息的协议。在 RFC 2060 中被定义,IMAP 代表因特网消息访问协议(Internet Message Access Protocol),目前用的是版本 4,也称 IMAP4。在用到 IMAP 时,邮件服务器必需支持这个协议。不能仅仅把使用 POP 的程序用于 IMAP,并指望它支持 IMAP 所有性能。假设邮件服务器支持 IMAP,基于 JavaMail 的程序可以利用这种情况 — 用户在服务器上有多个文件夹(folder),并且这些文件夹可以被多个用户共享。

因为有这一更高级的性能,您也许会认为所有用户都会使用 IMAP。事实并不是这样。要求服务器接收新消息,在用户请求时发送到用户手中,还要在每个用户的多个文件夹中维护消息。这样虽然能将消息集中备份,但随着用户长期的邮件夹越来越大,到磁盘空间耗尽时,每个用户都会受到损失。使用 POP,就能卸载邮件服务器上保存的消息了。

MIME

    MIME 代表多用途因特网邮件扩展标准(Multipurpose Internet Mail Extensions)。它不是邮件传输协议。但对传输内容的消息、附件及其它的内容定义了格式。这里有很多不同的有效文档:RFC 822RFC 2045RFC 2046RFC 2047。作为一个 JavaMail API 的用户,您通常不必对这些格式操心。无论如何,一定存在这些格式而且程序会用到它。

NNTP 及其它

   因为 JavaMail API 将供应商和所有其它的东西分开了,您就能轻松添加额外的协议支持。Sun 保留了一张第三方供应商列表,他们利用了 Sun 不提供超出(out-of-the-box)支持范围的协议。您会找到 NNTP(网络新闻传输协议)[新闻组]、S/MIME(安全多用途因特网邮件扩展)及其它支持。

接下来,主要讲下:SMTP的模型 
     SMTP提供了一种邮件传输的机制,当收件方和发件方都在一个网络上时,可以把邮件直传给对方;当双方不在同一个网络上时,需要通过一个或几个中间服务器转发。SMTP首先由发件方提出申请,要求与接收方SMTP建立双向的通信渠道,收件方可以是最终收件人也可以是中间转发的服务器。收件方服务器确认可以建立连接后,双发就可以开始通信。下面是SMTP的模型示意图。



发件方SMTP向收件方发处MAIL命令,告知发件方的身份;如果收件方接受,就会回答OK。发件方再发出RCPT命令,告知收件人的身份,收件方SMTP确认是否接收或转发,如果同意就回答OK;接下来就可以进行数据传输了。通信过程中,发件方SMTP与收件方SMTP 采用对话式的交互方式,发件方提出要求,收件方进行确认,确认后才进行下一步的动作。整个过程由发件方控制,有时需要确认几回才可以。



为了保证回复命令的有效,SMTP要求发件方必须提供接收方的服务器及邮箱。邮件的命令和答复有严格的语法定义,并且回复具有相应的数字代码。所有的命令由ASCII码组成。命令代码是大小写无关的,如MAIL和 mail ﹑mAIL是等效的。

2. SMTP的基本命令
SMTP定义了14个命令,它们是:

HELO
MAIL FROM:
RCPT TO:
DATA
RSET
SEND FROM:
SOML FROM:
SAML FROM:
VRFY
EXPN
HELP [ ]
NOOP
QUIT
TURN
其中使得SMTP工作的基本的命令有7个,分别为:HELO﹑MAIL﹑RCPT﹑DATA﹑REST﹑NOOP和QUIT.下面分别介绍如下。

HELO--发件方问候收件方,后面是发件人的服务器地址或标识。收件方回答OK时标识自己的身份。问候和确认过程表明两台机器可以进行通信,同时状态参量被复位,缓冲区被清空。

MAIL--这个命令用来开始传送邮件,它的后面跟随发件方邮件地址(返回邮件地址)。它也用来当邮件无法送达时,发送失败通知。为保证邮件的成功发送,发件方的地址应是被对方或中间转发方同意接受的。这个命令会清空有关的缓冲区,为新的邮件做准备。

RCPT --这个命令告诉收件方收件人的邮箱。当有多个收件人时,需要多次使用该命令,每次只能指明一个人。如果接收方服务器不同意转发这个地址的邮件,它必须报550错误代码通知发件方。如果服务器同意转发,它要更改邮件发送路径,把最开始的目的地(该服务器)换成下一个服务器。

DATA--收件方把该命令之后的数据作为发送的数据。数据被加入数据缓冲区中,以单独一行是"."的行结束数据。结束行对于接收方同时意味立即开始缓冲区内的数据传送,传送结束后清空缓冲区。如果传送接受,接收方回复OK。

REST--这个命令用来通知收件方复位,所有已存入缓冲区的收件人数据,发件人数据和待传送的数据都必须清除,接收放必须回答OK.

NOOP--这个命令不影响任何参数,只是要求接收放回答OK, 不会影响缓冲区的数据。

QUIT--SMTP要求接收放必须回答OK,然后中断传输;在收到这个命令并回答OK前,收件方不得中断连接,即使传输出现错误。发件方在发出这个命令并收到OK答复前,也不得中断连接。

下面是SMTP答复中用到的代码和含义:

500 Syntax error, command unrecognized
[This may include errors such as command line too long]
501 Syntax error in parameters or arguments
502 Command not implemented
503 Bad sequence of commands
504 Command parameter not implemented
211 System status, or system help reply
214 Help message
[Information on how to use the receiver or the meaning of a
particular non-standard command; this reply is useful only to the human user]
220 Service ready
221 Service closing transmission channel
421 Service not available, closing transmission channel
[This may be a reply to any command if the service knows it must shut down]
250 Requested mail action okay, completed
251 User not local; will forward to
450 Requested mail action not taken: mailbox unavailable
[E.g., mailbox busy]
550 Requested action not taken: mailbox unavailable
[E.g., mailbox not found, no access]
451 Requested action aborted: error in processing
551 User not local; please try
452 Requested action not taken: insufficient system storage
552 Requested mail action aborted: exceeded storage allocation
553 Requested action not taken: mailbox name not allowed
[E.g., mailbox syntax incorrect]
354 Start mail input; end with .
554 Transaction failed
最后,让我们看一个RFC821中给出的例子。这封信是Smith在主机Alpha.ARPA 发给主机Beta.ARPA上的
Jones,Green和 Brown.并且假定两台主机在同一个网络上。

S: MAIL FROM:
R: 250 OK
S: RCPT TO:
R: 250 OK
S: RCPT TO:
R: 550 No such user here
S: RCPT TO:
R: 250 OK
S: DATA
R: 354 Start mail input; end with .
S: Blah blah blah...
S: ...etc. etc. etc.
S: .
R: 250 OK
邮件最后被对方接受。


◆ 电子邮件的工作原理


电子邮件与普通邮件有类似的地方,发信者注明收件人的姓名与地址(即邮件地址),发送方服务器把邮件传到收件方服务器,收件方服务器再把邮件发到收件人的邮箱中。如下图所示:



更进一步的解释涉及到以下几个概念:

MUA -- Mail User Agent, 邮件用户代理,帮助用户读写邮件;

MTA -- Mail Transport Agent, 邮件传输代理,负责把邮件由一个服务器传到另一个服务

器或邮件投递代理;

MDA -- Mail Delivery Agent, 邮件投递代理,把邮件放到用户的邮箱里。

整个邮件传输过程如下:

目前使用的SMTP 协议是存储转发协议,意味着它允许邮件通过一系列的服务器发送到最终目的地。服务器在一个队列中存储到达的邮件,等待发送到下一个目的地。下一个目的地可以是本地用户,或者是另一个邮件服务器,如下图所示。



如果下游的服务器暂时不可用,MTA 就暂时在队列中保存信件,并在以后尝试发送。



◆ 电子邮件的信头结构及分析

1 .邮件的结构
在最高层,邮件的结构是非常简单的,用户从终端机上看到的邮件格式一般为:

1. From:
user1@domain1.com

2. To:
user2@domain2.com

3. Subject: Explaination of mail format

4. Date: Thu, 1 Apr 1999. 10:00:00 GMT

5. Hi, Jack

7. This mail is to explain you the mail format

8. - - - -

9. Thanks

10. Bob

其中, 1~~4 行称作信件信头(message header) 6~~10行描述信件要表达的内容,称为信体 (message body)。第5行是空行,根据RFC822的要求,信头和信体之间必须加入一空行。[i]信头通常包含字段From, To, Subject 和Date,有的邮件还包含cc,bcc等字段。

2. 邮件的信头

事实上,邮件在传输过程中,服务器要把它打包成一个数据对象,包括上面的信件和一个信封。邮件的投递是依靠信封上的地址或信封信头(envelop address 或envelop header),而不是上面讲的信件上的地址。

从表面上看,一封邮件是从发件人的机器直接传送到收件人的机器,但通常这并不正确,一封邮件发送和接受过程至少要经过四台计算机。参考下图所示。用户通常在自己的电脑前编写阅读邮件,我们把它叫做客户端 (client 1~~4 )。大部分组织里,都是用一台专门的机器处理邮件,称作邮件服务器 (SMTP1, SMTP2). 如果用户是从家里拨号上网,那末邮件服务器是ISP 提供的。



当某个用户在自己的电脑 Client1 前编写完一个邮件,然后把它发送到他的ISP 的邮件服务器SMTP1。此时她的机器已经完成了所有的工作,但邮件服务器SMTP1还必须想法把邮件发送到目的地。SMTP1 通过阅读信头或信封上的地址,找到收件认得邮件服务器SMTP2, 然后与该服务器建立连接,把邮件发到收件人的服务器上,等待收件人来取阅。

下面我们将通过一个例子说明整个邮件传送过程及邮件的信头变化。假设发件人的名字叫 Sender, email地址是
sender@domain1.com使用的电脑名字叫 client1, IP 地址是 [111.11.1.1] (假设的地址)。 收件人的名字叫 receipt, email 地址是 receipt@domain2.com, 使用的电脑的名字叫 client2,IP 地址是 [222.22.2.2] (假设的地址)。当邮件编辑完传送给其邮件服务器mail.domain1.com 时,邮件的信头格式为:

From:
sender@domain1.com

To:
receipt@domain2.com

Date: Tue, Mar 18 1998 15:36:24 GMT

X-mailer:Sendmail 8.9.0

Subject: Greetings

当邮件服务器 mail.domain1.com 把邮件传到接收方的服务器 mail.domain2.com 时,接受方服务器会在信头上记录下有关的计算机信息,邮件的信头变成:

Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:3 7:24 GMT

From:
sender@domain1.com

To:
receipt@domain2.com

Date: Tue, Mar 18 1998 15:36:24 GMT

Message-Id:

X-mailer:Sendmail 8.9.0

Subject: Greetings

当收件人服务器mail.domain2.com 把邮件接收并存初下来,等待收件人来阅读时,邮件的信头将会再加入一条记录:

Received: from mail.domain1.com (mail.domain1.com [111.11.1.0] ) by mail.domain2.com (8.8.5/8.7.2) with ESMTP id LAA20869; Tue, Mar 18 1998 15:39:44 GMT

Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:37:24 GMT

From:
sender@domain1.com

To:
receipt@domain2.com

Date: Tue, Mar 18 1998 15:36:24 GMT

Message-Id:

X-mailer:Sendmail 8.9.0

Subject: Greetings

上面整个记录就将是收件人看到的完整的邮件信头。让我们逐行看一下信头中各行的含义:

Received: from mail.domain1.com (mail.domain1.com [111.11.1.0] ) by mail.domain2.com (8.8.5/8.7.2) with ESMTP id LAA20869; Tue, Mar 18 1998 15:39:44 GMT

这封信是从一台自称为 mail.domain1.com 的机器上接收的;这台机器的IP 地址是[111.11.1.0],真实名字就是标称名字 mail.domain1.com; 接收方的机器名称是 mail.domain2.com, 运行的邮件服务器是 Sendmail, 版本(8.8.5/8.7.2) 。接收方机器给邮件的编号是ESMTP id LAA20869, 接收到的时间是 Tue, Mar 18 1998 15:39:44 GMT。

Received: from client1.domain1.com (client1.domain1.com [111.11.1.1]) by mail.domain1.com (8.8.5) id 004A21; Tue, Mar 18 1998 15:37:24 GMT

这条记录表明信件是由机器client1.domain1.com ( IP 地址是 [111.11.1.1]) 在Tue, Mar 18 1998 15:37:24 GMT交给mail.domain1.com,并赋给编号id 004A21。

From,TO ,Date和Subject 都易于理解,分别指明发件人,收件人,信件编辑日期及信件主题。

Message-Id:

这是由发件方邮件服务器赋给这封邮件的编号。与其它编号不同,这个编号自始至终跟随邮件。


------------------------------------

方法一:没有使用JavaMail API,而是根据SMTP协议的要求直接处理协议的细节发送邮件。
MailMessage.java

----------------------------------------

//这个类其实就是一个基本的JavaBean,用于完成一些基本信息的设置,也可以不要这个东西,直接在程序中写明就可以,不过这样条理较清楚一些,而且修改也方便一些.

  1package mail;
  2
  3public class MailMessage {
  4 
  5 private String from;
  6 private String to;
  7 private String datafrom;
  8 private String datato;
  9 private String subject;
 10 private String content;
 11 private String date;
 12 private String user;
 13 private String password;
 14
 15 public String getPassword() {
 16  return password;
 17 }

 18
 19 public void setPassword(String password) {
 20  this.password = password;
 21 }

 22
 23 public String getUser() {
 24  return user;
 25 }

 26
 27 public void setUser(String user) {
 28  this.user = user;
 29 }

 30
 31 public String getContent() {
 32  return content;
 33 }

 34
 35 public void setContent(String content) {
 36  this.content = content;
 37 }

 38
 39 public String getDatafrom() {
 40  return datafrom;
 41 }

 42
 43 public void setDatafrom(String datafrom) {
 44  this.datafrom = datafrom;
 45 }

 46
 47 public String getDatato() {
 48  return datato;
 49 }

 50
 51 public void setDatato(String datato) {
 52  this.datato = datato;
 53 }

 54
 55 public String getDate() {
 56  return date;
 57 }

 58
 59 public void setDate(String date) {
 60  this.date = date;
 61 }

 62
 63 public String getFrom() {
 64  return from;
 65 }

 66
 67 public void setFrom(String from) {
 68  this.from = from;
 69 }

 70
 71 public String getSubject() {
 72  return subject;
 73 }

 74
 75 public void setSubject(String subject) {
 76  this.subject = subject;
 77 }

 78
 79 public String getTo() {
 80  return to;
 81 }

 82
 83 public void setTo(String to) {
 84  this.to = to;
 85 }

 86
 87}

 88
 89
 90---------------------------------------------
 91
 92SMTPClient .java
 93
 94------------------------------
 95
 96//主要的功能就在这里面完成了
 97
 98package mail;
 99
100import java.io.BufferedReader;
101import java.io.BufferedWriter;
102import java.io.IOException;
103import java.io.InputStreamReader;
104import java.io.OutputStreamWriter;
105import java.net.Socket;
106import java.net.SocketException;
107import java.net.UnknownHostException;
108import java.util.StringTokenizer;
109
110import sun.misc.BASE64Encoder;
111
112public class SMTPClient {
113
114 private boolean debug=true;
115 BASE64Encoder encode=new BASE64Encoder();//用于加密后发送用户名和密码
116 public static void main(String[] args) throws UnknownHostException, IOException {
117  // TODO Auto-generated method stub
118  MailMessage message=new MailMessage();
119  message.setFrom("wasingmon@163.com");//发件人
120  message.setTo("wasingmon@eyou.com");//收件人
121  String server="smtp.163.com";//邮件服务器
122  message.setSubject("test");//邮件主题
123  message.setContent("test");//邮件内容
124  message.setDatafrom("wangxingmou@eyou.com");//发件人,在邮件的发件人栏目中显示
125  message.setDatato("wasingmon@163.com");//收件人,在邮件的收件人栏目中显示
126  message.setUser("wasingmon");//登陆邮箱的用户名
127  message.setPassword("");//登陆邮箱的密码
128  
129  SMTPClient smtp=new SMTPClient(server,25);
130  boolean flag;
131  flag=smtp.sendMail(message,server);
132  if(flag){
133   System.out.println("邮件发送成功!");
134  }

135  else{
136   System.out.println("邮件发送失败!");
137  }

138
139 }

140 private Socket socket;
141 public SMTPClient(String server,int port) throws UnknownHostException, IOException{
142  try{
143   socket=new Socket(server,25);
144  }
catch(SocketException e){
145   System.out.println(e.getMessage());
146  }
catch(Exception e){
147   e.printStackTrace();
148  }
finally{
149   System.out.println("已经建立连接!");
150  }

151
152 }

153 //注册到邮件服务器
154 public void helo(String server,BufferedReader in,BufferedWriter out) throws IOException{
155  int result;
156  result=getResult(in);
157  //连接上邮件服务后,服务器给出220应答
158  if(result!=220){
159   throw new IOException("连接服务器失败");
160  }

161  result=sendServer("HELO "+server,in,out);
162  //HELO命令成功后返回250
163  if(result!=250)
164  {
165   throw new IOException("注册邮件服务器失败!");
166  }

167 }

168 
169 private int sendServer(String str,BufferedReader in,BufferedWriter out) throws IOException{
170  out.write(str);
171  out.newLine();
172  out.flush();
173  if(debug)
174  {
175   System.out.println("已发送命令:"+str);
176  }

177  return getResult(in);
178 }

179 public int getResult(BufferedReader in){
180  String line="";
181  try{
182   line=in.readLine();
183   if(debug){
184    System.out.println("服务器返回状态:"+line);
185   }

186  }
catch(Exception e){
187   e.printStackTrace();
188  }

189  //从服务器返回消息中读出状态码,将其转换成整数返回
190  StringTokenizer st=new StringTokenizer(line," ");
191  return Integer.parseInt(st.nextToken());
192 }

193 
194 public void authLogin(MailMessage message,BufferedReader in,BufferedWriter out) throws IOException{
195  int result;
196  result=sendServer("AUTH LOGIN",in,out);
197  if(result!=334){
198   throw new IOException("用户验证失败!");
199  }

200  
201   result=sendServer(encode.encode(message.getUser().getBytes()),in,out);
202   if(result!=334){
203   throw new IOException("用户名错误!"); 
204   }

205   result=sendServer(encode.encode(message.getPassword().getBytes()),in,out);
206  
207   if(result!=235){
208    throw new IOException("验证失败!"); 
209  }

210 }

211 //开始发送消息,邮件源地址
212 public void mailfrom(String source,BufferedReader in,BufferedWriter out) throws IOException{
213  int result;
214  result=sendServer("MAIL FROM:<"+source+">",in,out);
215  if(result!=250){
216   throw new IOException("指定源地址错误");
217  }

218 }

219 // 设置邮件收件人
220 public void rcpt(String touchman,BufferedReader in,BufferedWriter out) throws IOException{
221  int result;
222  result=sendServer("RCPT TO:<"+touchman+">",in,out);
223  if(result!=250){
224   throw new IOException("指定目的地址错误!");
225  }

226 }

227 
228 //邮件体
229 public void data(String from,String to,String subject,String content,BufferedReader in,BufferedWriter out) throws IOException{
230  int result;
231  result=sendServer("DATA",in,out);
232  //输入DATA回车后,若收到354应答后,继续输入邮件内容
233  if(result!=354){
234   throw new IOException("不能发送数据");
235  }

236  out.write("From: "+from);
237  out.newLine();
238  out.write("To: "+to);
239  out.newLine();
240  out.write("Subject: "+subject);
241  out.newLine();
242  out.newLine();
243  out.write(content);
244  out.newLine();
245  //句号加回车结束邮件内容输入
246  result=sendServer(".",in,out);
247  System.out.println(result);
248  if(result!=250)
249  {
250   throw new IOException("发送数据错误");
251  }

252 }

253 
254 //退出
255 public void quit(BufferedReader in,BufferedWriter out) throws IOException{
256  int result;
257  result=sendServer("QUIT",in,out);
258  if(result!=221){
259   throw new IOException("未能正确退出");
260  }

261 }

262 
263 //发送邮件主程序
264 public boolean sendMail(MailMessage message,String server){
265  try{
266   BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
267   BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
268   helo(server,in,out);//HELO命令
269   authLogin(message,in,out);//AUTH LOGIN命令
270   mailfrom(message.getFrom(),in,out);//MAIL FROM
271   rcpt(message.getTo(),in,out);//RCPT
272   data(message.getDatafrom(),message.getDatato(),message.getSubject(),message.getContent(),in,out);//DATA
273   quit(in,out);//QUIT
274  }
catch(Exception e){
275   e.printStackTrace();
276   return false;
277   
278  }

279  return true;
280 }

281
282}

283
方法二:用javaMail发送邮件
 1public class JavaMail {    
 2    //  发送邮件函数    
 3    public boolean sendMail(String mailTo, String mailSubject, String mailBody) {    
 4        //发送email    
 5        try {    
 6            //default account information    
 7            String smtpServer = "smtp.163.com";    
 8            String smtpAuth = "true";    
 9            String smtpUser = "xxxx";    
10            String smtpPassword = "xxxx";    
11            String From = "xxx@163.com";    
12            String To = mailTo;    
13            String Subject = mailSubject;    
14            String Text = mailBody;    
15            //        java.util.ResourceBundle resBundle;    
16            //        resBundle = java.util.ResourceBundle.getBundle("mailinfo",Locale.SIMPLIFIED_CHINESE);    
17            //        if (resBundle != null) {    
18            //          smtpServer = resBundle.getString("mail.smtp.host");    
19            //          smtpAuth = resBundle.getString("mail.smtp.auth");    
20            //          smtpUser = resBundle.getString("mail.smtp.user");    
21            //          smtpPassword = resBundle.getString("mail.smtp.password");    
22            //          From = resBundle.getString("mail.smtp.from");    
23            //        }    
24            Properties props = new Properties();    
25            Session sendMailSession;    
26            Transport transport;    
27            props.put("mail.smtp.host", smtpServer);    
28            props.put("mail.smtp.auth", smtpAuth);    
29            if ("true".equals(smtpAuth)) {    
30                //smtp服务器需要验证,用MyAuthertiactor来创建mail session    
31                MyAuthenticator myauth = new MyAuthenticator(smtpUser,    
32                        smtpPassword);    
33                sendMailSession = Session.getInstance(props, myauth);    
34            }
 else {    
35                sendMailSession = Session.getInstance(props);    
36            }
    
37            //Debug    
38            sendMailSession.setDebug(true);    
39            Message newMessage = new MimeMessage(sendMailSession);    
40            newMessage.setFrom(new InternetAddress(From));    
41            newMessage.setRecipient(Message.RecipientType.TO,    
42                    new InternetAddress(mailTo));    
43            newMessage.setSubject(Subject);    
44            newMessage.setSentDate(new Date());    
45            newMessage.setText(Text);    
46            newMessage.saveChanges();    
47            transport = sendMailSession.getTransport("smtp");    
48            transport.send(newMessage, newMessage.getAllRecipients());    
49            transport.close();    
50        }
 catch (Exception mailEx) {    
51            System.err.println("Send Mail Error:" + mailEx.getMessage());    
52            return false;    
53        }
    
54        return true;    
55    }
    
56   
57    //smtp需要验证时候的验证类    
58    class MyAuthenticator extends javax.mail.Authenticator {    
59        private String strUser;    
60   
61        private String strPwd;    
62   
63        public MyAuthenticator(String user, String password) {    
64            this.strUser = user;    
65            this.strPwd = password;    
66        }
    
67   
68        protected PasswordAuthentication getPasswordAuthentication() {    
69            return new PasswordAuthentication(strUser, strPwd);    
70        }
    
71    }
    
72   
73}
   
74