用Java编程实现SMTP服务器功能(4)
来源:asp之家 时间:2010-03-13 18:46:00
3.SmtpMail 类的实现
采用Open()方法,建立与邮件服务器之间的TCP/IP 连接,创建套接字,并且得到发送命令所用的输出流Send 和接收服务器相应所用的输入流Rev。Open()方法的代码如下:
public int open(String serverName, int port){ try{ mailSocket = new Socket(serverName, port); send = new PrintWriter(mailSocket.getOutputStream(), true); recv = new BufferedReader(new InputStreamReader(mailSocket.getInputStream())); String s1 = recv.readLine(); char c = s1.charAt(0); if((c == '4') | (c == '5')) return 0; } catch(Exception e){ return 0; } return 1; } |
在SmtpMail 类中,通过Transmit()方法完成发送任务。Transmit()方法的代码如下:
public int transmit(){ boolean flag = true; //发送HELO 命令 if(domain.length() != 0){ int i = sendString("HELO " + domain); if(i != 1) return 0; } //发送MAIL FROM 命令(发件人) if(from.length() != 0){ int j = sendString("MAIL FROM:" + from); if(j != 1) return 0; } //发送RCPT TO 命令(收件人) if(to.length() != 0){ int k = sendString("RCPT TO:" + to); if(k != 1) return 0; } //发送邮件正文(DATA 命令) if(sendString("DATA") != 1) return 0; //发送邮件头信息 for(int l = 0; l < x_set.size(); l += 2){ String s = (String)x_set.elementAt(l); send.println(s + ": " + x_set.elementAt(l + 1)); } //发送时间及相关内容格式说明 if(x_set.indexOf("Date") < 0) send.println("Date: " + (new Date()).toString()); ........ ........ |
使用SendString()方法来发送字符串命令,并且接收邮件服务器的响应信息,判断命令是否被接收。返回1表示命令被拒绝执行,返回0表示命令被接受。SendString()方法的代码如下:
private int sendString(String s){ String s1 = ""; try{ send.println(s); s1 = recv.readLine(); } catch(Exception e){ System.out.print(s1); return 0; } if(s1.length() == 0) return 0; char c = s1.charAt(0); return !((c == '4') | (c == '5')) ? 1 : 0; } |
使用Close()方法来关闭与服务器之间的套接字连接。该方法发送“QUIT”命令,收到响应消息后,才真正关闭连接。Close()方法的代码如下: