从Java应用程序中发送E-mail

  Java作为一种网络编程语言,具有强大的网络编程功能,可以用仅仅几条语句完成其他语言需要的几十条甚至上百条语句所能完成的功能。这里,我试着用Java编写了一个可以用来发送E-mail的程序,很简单,仅仅作为示例。
  首先,需要了解一下SMTP协议(简单邮件传输协议),是定义邮件传输的协议,它是基于TCP服务的应用层协议,由RFC0821所定义。SMPT协议规定的命令是以明文方式进行的。下表说明了SMTP服务器发送电子邮件所需的步骤。
  SMTP协议
  协议描述
  HELO本地主机名启动与SMTP服务器的通信
  MAIL FROM:用户 电子邮件地址.com指定谁正在发送电子邮件
  用户 电子邮件地址.com指定谁将接收电子邮件
  DATA指定电子邮件的数据是下一个
  (你的电子邮件信息)指定电子邮件的信息(任意行)
  一个点指定电子邮件的结束
  QUIT正常关闭连接
  这就是一个简单的发送邮件的会话过程,其实当使用outlook express等客户软件发送时,后台进行的交互也是这样的,当然,SMTP协议为了处理复杂的邮件发送情况如附件等等,定义了很多的命令及规定,具体可以通过阅读RFC821来获得。
  当你的一个朋友向你发送邮件时,他的邮件服务器和你的邮件服务器通过SMTP协议通信,将邮件传递给你邮件地址所指示的邮件服务器上(这里假设你的本地邮件服务器是Linux系统),若你通过telnet协议直接登录到邮件服务器上,则可以使用mail等客户软件直接阅读邮件,但是若你希望使用本地的MUA(Mail User Agent,如outlook express等客户软件)来阅读邮件,则本地客户端通过POP3或IMAP协议与邮件服务器交互,将邮件信息传递到客户端(如:win98系统)。而如果你向你的朋友回复一封信件时,你所使用的MUA也是通过SMTP协议与邮件服务(一般为发送邮件地址对应的email地址)器通信,指示其希望邮件服务器帮助转发一封邮件到你朋友的邮件地址指定的邮件服务器中。若本地邮件服务器允许你通过它转发邮件,则服务器通过SMTP协议发送邮件到对方的邮件服务器。这就是接受和发送邮件的全部过程。
  了解了电子邮件的发送过程,我们就可以利用Java的强大功能来实现这一过程了,下面这个程序SendMail.java演示了如何在应用程序中发送电子邮件。
  import java.io.*
  import java.net.*
  public class SendMail
  {static PrintStream ps=null;//发送信息
  static DatainputStream dis=null;//接受信息
  public static void send(String str)throws IOException
  {ps.println(str);//发送串
  ps.flush();//刷新该串
  System.out.println("Java sent:"+str);
  }
  public static void receive()throws IOException
  {String readstr=dis.readLine();//得到smtp响应
  System.out.println("SMTP response:"+readste);
  }
  public static void main(String args[])
  {String HELO="HELO";
  String MAIL_FROM="MAIL_FROM:user user.com";
  String RCPT_TO="RCPT_TO:user user.com";
  String SUBJECT="SUBJECT:Java is cool!";
  String DATA="DATA";//消息的开始
  String BODY="Java send this!\r\n.\r\n";
  //注意:"\r\n.\r\n"标志该信息结束
  Socket smtp=null;//smtp套接字
  try{smtp=new Socket("smtp.any.com",25);
  //注意:25是smtp的默认端口号
  OutputStream os=smtp.getOutputStream();
  ps=new PrintStream(os);
  InputStream is=smtp.getIntputStream();
  dis=new DataInputStream(is)
  }
  catch(IOException e)
  {System.out.println("error");
  }
  try{//告诉smtp已准备好
  String loc=InetAddress.getLocalHost().getHostname();
  send(HELO+loc);
  receive();//得到smtp响应
  send(MAIL_FROM);//从地址发出
  receive();//得到smtp响应
  send(RECP_TO);//发送smtp给谁
  receive();//得到smtp响应
  send(DATA);//发送smtp开始
  receive();//得到smtp响应
  send(SUBJECT);//发送smtp标题
  receive();//得到smtp响应
  send(BODY);//发信息主体
  receive();//得到smtp响应
  smtp.close();//关闭连接
  }
  catch(IOException e)
  {System.out.println("error");
  }
  System.out.println("Mail Sent!");
  }
  }
  你应该注意到,电子邮件消息的数据部分有两段:头部和主体。在头部,你可以制定有关这条消息的附加信息。在前面这个示例中,程序设置了这条消息的主题。为了运行上述代码,必须改变SMTP域名,以及发送者和接收者的E-mail地址。