基于SMTP的JAVA邮件发送程序.doc_第1页
基于SMTP的JAVA邮件发送程序.doc_第2页
基于SMTP的JAVA邮件发送程序.doc_第3页
基于SMTP的JAVA邮件发送程序.doc_第4页
基于SMTP的JAVA邮件发送程序.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于SMTP的JAVA邮件发送程序!新一篇:如此解释!正好遇到这方面的问题,写出来,分享一下。这个程序没有使用JavaMail API,而是根据SMTP协议的要求直接处理协议的细节发送邮件,虽然比较麻烦了一些,但是对了解邮件协议的细节很有帮助的。本文分两部分,第一部分是SMTP命令介绍(这个从别的地方抄的,嘿嘿);第二部分通过一个实例真正理解一下发送邮件的过程。一:SMTP 命令简介什么是 SMTPSMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码。SMTP 在 TCP 协议 25 端口监听连接请求。什么是 ESMTPESMTP (Extended SMTP),顾名思义,扩展 SMTP 就是对标准 SMTP 协议进行的扩展。它与 SMTP 服务的区别仅仅是,使用 SMTP 发信不需要验证用户帐户,而用 ESMTP 发信时,服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与 SMTP 方式没有两样。SMTP 命令包括:HELO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。 EHLO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。MAIL FROM 命令中指定的地址是发件人地址RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束 VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令 EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用 HELP 查询服务器支持什么命令 NOOP 无操作,服务器应响应 OK RSET 重置会话,当前传输被取消QUIT 结束会话 连接到 Postfix 使用 SMTP 命令发送邮件例如:安装 Postfix 的邮件服务器IP是 (蓝色字体内容由客户端输入,红色字体内容是服务返回的) telnet 25 - 使用 telnet 命令连接服务器 25 端口 helo -向服务器标识用户身份发送 mail from 命令 ehlo - ESMTP 命令,发信需要认证。auth login -进行用户身份认证 334 VXNlcm5hbWU6 Y29zdGFAYW1heGl0Lm5ldA= - BASE64 加密后的用户名 334 UGFzc3dvcmQ6 MTk4MjIxNA= - BASE64 加密后的密码 235 authentication successfully - 身份认证成功 (535 authentication failed - -身份认证失败)发到本系统中域名下的账户可跳过身份认证。mail from: - mail from 地址 250 ok - -命令执行成功 rcpt to: - 递送给地址 250 ok - -命令执行成功 data - -数据传输初始化 354 End data with .- -开始传输数据 From: To: Date: Mon, 25 Oct 2004 14:24:27 +0800Subject: test mail Hi, test2 This is a test mail, you dont reply it. .- 数据内容,包括BASE64加密后的邮件内容, 以 CRLF.CRLF 结束数据传输 250 OK: queued as 2F6DE3929- 命令执行成功 quit - 结束会话 221 ByeConnection closed by foreign host .- 断开连接以上就是一个邮件发送的基本的命令。再说一下邮件发送的基本过程:如果你的邮件地址是,而你要用这个邮箱发送一封邮件到,你需要连接到服务器上,当然这个连接可能需要认证,现在基本上都要验证,然后是发送邮件到服务器上,关闭连接。在上,你所发送的邮件进入发送队列中,轮到你要发送的邮件时,主机再联系,将邮件传输到服务器上。二:实例应用-MailMessage.java-/这个类其实就是一个基本的JavaBean,用于完成一些基本信息的设置,也可以不要这个东西,直接在程序中写明就可以,不过这样条理较清楚一些,而且修改也方便一些.package mail;public class MailMessage private String from;private String to;private String datafrom;private String datato;private String subject;private String content;private String date;private String user;private String password;public String getPassword() return password;public void setPassword(String password) this.password = password;public String getUser() return user;public void setUser(String user) this.user = user;public String getContent() return content;public void setContent(String content) this.content = content;public String getDatafrom() return datafrom;public void setDatafrom(String datafrom) this.datafrom = datafrom;public String getDatato() return datato;public void setDatato(String datato) this.datato = datato;public String getDate() return date;public void setDate(String date) this.date = date;public String getFrom() return from;public void setFrom(String from) this.from = from;public String getSubject() return subject;public void setSubject(String subject) this.subject = subject;public String getTo() return to;public void setTo(String to) this.to = to;-SMTPClient .java-/主要的功能就在这里面完成了package mail;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import .Socket;import .SocketException;import .UnknownHostException;import java.util.StringTokenizer;import sun.misc.BASE64Encoder;public class SMTPClient private boolean debug=true;BASE64Encoder encode=new BASE64Encoder();/用于加密后发送用户名和密码public static void main(String args) throws UnknownHostException, IOException / TODO Auto-generated method stubMailMessage message=new MailMessage();message.setFrom();/发件人message.setTo();/收件人String server=;/邮件服务器message.setSubject(test);/邮件主题message.setContent(test);/邮件内容message.setDatafrom();/发件人,在邮件的发件人栏目中显示message.setDatato();/收件人,在邮件的收件人栏目中显示message.setUser(wasingmon);/登陆邮箱的用户名message.setPassword();/登陆邮箱的密码SMTPClient smtp=new SMTPClient(server,25);boolean flag;flag=smtp.sendMail(message,server);if(flag)System.out.println(邮件发送成功!);elseSystem.out.println(邮件发送失败!);private Socket socket;public SMTPClient(String server,int port) throws UnknownHostException, IOExceptiontrysocket=new Socket(server,25);catch(SocketException e)System.out.println(e.getMessage();catch(Exception e)e.printStackTrace();finallySystem.out.println(已经建立连接!);/注册到邮件服务器public void helo(String server,BufferedReader in,BufferedWriter out) throws IOExceptionint result;result=getResult(in);/连接上邮件服务后,服务器给出220应答if(result!=220)throw new IOException(连接服务器失败);result=sendServer(HELO +server,in,out);/HELO命令成功后返回250if(result!=250)throw new IOException(注册邮件服务器失败!);private int sendServer(String str,BufferedReader in,BufferedWriter out) throws IOExceptionout.write(str);out.newLine();out.flush();if(debug)System.out.println(已发送命令:+str);return getResult(in);public int getResult(BufferedReader in)String line=;tryline=in.readLine();if(debug)System.out.println(服务器返回状态:+line);catch(Exception e)e.printStackTrace();/从服务器返回消息中读出状态码,将其转换成整数返回StringTokenizer st=new StringTokenizer(line, );return Integer.parseInt(st.nextToken();public void authLogin(MailMessage message,BufferedReader in,BufferedWriter out) throws IOExceptionint result;result=sendServer(AUTH LOGIN,in,out);if(result!=334)throw new IOException(用户验证失败!); result=sendServer(encode.encode(message.getUser().getBytes(),in,out); if(result!=334)throw new IOException(用户名错误!); result=sendServer(encode.encode(message.getPassword().getBytes(),in,out); if(result!=235)throw new IOException(验证失败!); /开始发送消息,邮件源地址public void mailfrom(String source,BufferedReader in,BufferedWriter out) throws IOExceptionint result;result=sendServer(MAIL FROM:,in,out);if(result!=250)throw new IOException(指定源地址错误);/ 设置邮件收件人public void rcpt(String touchman,BufferedReader in,BufferedWriter out) throws IOExceptionint result;result=sendServer(RCPT TO:,in,out);if(result!=250)throw new IOException(指定目的地址错误!);/邮件体public void data(String from,String to,String subject,String content,BufferedReader in,BufferedWriter out) throws IOExceptionint result;result=sendServer(DATA,in,out);/输入DATA回车后,若收到354应答后,继续输入邮件内容if(result!=354)throw new IOException(不能发送数据);out.write(From: +from);out.newLine();out.write(To: +to);out.newLine();out.write(Subject: +subject);out.newLine();out.newLine();out.write(content);out.newLine();/句号加回车结束邮件内容输入result=sendServer(.,in,out);System.out.println(result);if(result!=250)throw new IOException(发送数据错误);/退出public void quit(BufferedReader in,BufferedWriter out) throws IOExceptio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论