知识大全 基于SMTP的JAVA邮件发送程序

Posted 命令

篇首语:勤勉是幸运的右手,世俭是幸运的左手。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 基于SMTP的JAVA邮件发送程序相关的知识,希望对你有一定的参考价值。

基于SMTP的JAVA邮件发送程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  这个程序没有使用JavaMail API 而是根据SMTP协议的要求直接处理协议的细节发送邮件 虽然比较麻烦了一些 但是对了解邮件协议的细节很有帮助的

  本文分两部分 第一部分是SMTP命令介绍(这个从别的地方抄的 嘿嘿) 第二部分通过一个实例真正理解一下发送邮件的过程

  一 SMTP 命令简介

  什么是 SMTP

  SMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议 SMTP 是请求/响应协议 命令和响应都是基于 ASCII 文本 并以 CR 和 LF 符结束 响应包括一个表示返回状态的三位数字代码 SMTP 在 TCP 协议 端口监听连接请求

  什么是 ESMTP

  ESMTP (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 使用 telnet 命令连接服务器 端口

  helo 向服务器标识用户身份发送 mail from 命令

  ehlo ESMTP 命令 发信需要认证

  auth login 进行用户身份认证

   VXNlcm hbWU

  Y zdGFAYW heGl Lm ldA== BASE 加密后的用户名

   UGFzc dvcmQ

  MTk MjIxNA== BASE 加密后的密码

   authentication successfully 身份认证成功

  ( authentication failed 身份认证失败)

  发到本系统中域名下的账户可跳过身份认证

  mail from: <> mail from 地址

   ok 命令执行成功

  rcpt to: <> 递送给地址

   ok 命令执行成功

  data 数据传输初始化

   End data with 开始传输数据

  From:

  To:

  Date: Mon Oct : : +

  Subject: test mail

  Hi test

  This is a test mail you don t reply it

  

   数据内容 包括BASE 加密后的邮件内容 以 CRLF CRLF 结束数据传输

   OK: queued as F DE 命令执行成功

  quit 结束会话

   Bye

  Connection 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)

  ntent = 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 BASE Encoder;

  public class SMTPClient

  private boolean debug=true;

  BASE Encoder encode=new BASE Encoder();//用于加密后发送用户名和密码

  public static void main(String[] args) throws UnknownHostException IOException

  // TODO Auto generated method stub

  MailMessage message=new MailMessage();

  message setFrom( mailto:% );//发件人

  message setTo( mailto:% );//收件人

  String server= ;//邮件服务器

  message setSubject( test );//邮件主题

  message setContent( test );//邮件内容

  message setDatafrom( mailto:% );//发件人 在邮件的发件人栏目中显示

  message setDatato( mailto:% );//收件人 在邮件的收件人栏目中显示

  message setUser( wasingmon );//登陆邮箱的用户名

  message setPassword( );//登陆邮箱的密码

  SMTPClient smtp=new SMTPClient(server );

  boolean flag;

  flag=smtp sendMail(message server);

  if(flag)

  System out println( 邮件发送成功! );

  

  else

  System out println( 邮件发送失败! );

  

  

  private Socket socket;

  public SMTPClient(String server int port) throws UnknownHostException IOException

  try

  socket=new Socket(server );

  catch(SocketException e)

  System out println(e getMessage());

  catch(Exception e)

  e printStackTrace();

  finally

  System out println( 已经建立连接! );

  

  

  //注册到邮件服务器

  public void helo(String server BufferedReader in BufferedWriter out) throws IOException

  int result;

  result=getResult(in);

  //连接上邮件服务后 服务器给出 应答

  if(result!= )

  throw new IOException( 连接服务器失败 );

  

  result=sendServer( HELO +server in out);

  //HELO命令成功后返回

  if(result!= )

  

  throw new IOException( 注册邮件服务器失败! );

  

  

  private int sendServer(String str BufferedReader in BufferedWriter out) throws IOException

  out write(str);

  out newLine();

  out flush();

  if(debug)

  

  System out println( 已发送命令: +str);

  

  return getResult(in);

  

  public int getResult(BufferedReader in)

  String line= ;

  try

  line=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 IOException

  int result;

  result=sendServer( AUTH LOGIN in out);

  if(result!= )

  throw new IOException( 用户验证失败! );

  

  result=sendServer(encode encode(message getUser() getBytes()) in out);

  if(result!= )

  throw new IOException( 用户名错误! );

  

  result=sendServer(encode encode(message getPassword() getBytes()) in out);

  if(result!= )

  throw new IOException( 验证失败! );

  

  

  //开始发送消息 邮件源地址

  public void mailfrom(String source BufferedReader in BufferedWriter out) throws IOException

  int result;

  result=sendServer( MAIL FROM:< +source+ > in out);

  if(result!= )

  throw new IOException( 指定源地址错误 );

  

  

  // 设置邮件收件人

  public void rcpt(String touchman BufferedReader in BufferedWriter out) throws IOException

  int result;

  result=sendServer( RCPT TO:< +touchman+ > in out);

  if(result!= )

  throw new IOException( 指定目的地址错误! );

  

  

  //邮件体

  public void data(String from String to String subject String content BufferedReader in BufferedWriter out) throws IOException

  int result;

  result=sendServer( DATA in out);

  //输入DATA回车后 若收到 应答后 继续输入邮件内容

  if(result!= )

  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!= )

  

  throw new IOException( 发送数据错误 );

  

  

  //退出

  public void quit(BufferedReader in BufferedWriter out) throws IOException

  int result;

  result=sendServer( QUIT in out);

  if(result!= )

  throw new IOException( 未能正确退出 );

  

  

  //发送邮件主程序

  public boolean sendMail(MailMessage message String server)

  try

  BufferedReader in=new BufferedReader(new InputStreamReader(socket getInputStream()));

  BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket getOutputStream()));

  helo(server in out);//HELO命令

  authLogin(message in out);//AUTH LOGIN命令

  mailfrom(message getFrom() in out);//MAIL FROM

  rcpt(message getTo() in out);//RCPT

  data(message getDatafrom() message getDatato() message getSubject() message getContent() in out);//DATA

  quit(in out);//QUIT

  catch(Exception e)

  e printStackTrace();

  return false;

  

  return true;

  

  

cha138/Article/program/Java/hx/201311/26183

相关参考

收发电子邮件要使用__协议

收发电子邮件要使用_____协议。A、P0P3和IPB、TCP和IPC、SMTP和TCPD、SMTP和POP3答案:D解析:收发电子邮件需要用到SMTP和POP3两个协议。发送邮件通常使用SMTP协议

知识大全 java实现邮件的发送分享

  java实现邮件的发送分享方法如下  publicclassPopupAuthenticatorextendsAuthenticator  publicPasswordAuthentication

知识大全 Java发送邮件

Java发送邮件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  记得曾经学习用javamail发

知识大全 java实现邮件发送

  要实现邮箱的发送需要一个已知账号和密码的邮箱并且开通了STMPPOP服务常见主流邮箱邮件收取和发送popstmp服务配置汇总介绍一文中详细介绍了各个邮箱开通服务的步骤  &nb

知识大全 java如何发送电子邮件?

cha138/Article/program/Java/JSP/201404/30613

知识大全 在Java中发送邮件的一个相当完善的脚本

在Java中发送邮件的一个相当完善的脚本  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  pack

知识大全 在.NET 应用程序中用System.Web.Mail 发送电子邮件

在.NET应用程序中用System.Web.Mail发送电子邮件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起

知识大全 .net SMTP发送Email实例(可带附件)

.netSMTP发送Email实例(可带附件)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本文为

知识大全 用Java设计防病毒的电子邮件程序

用Java设计防病毒的电子邮件程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb

知识大全 编写支持基于代理的防火墙的Java应用程序

编写支持基于代理的防火墙的Java应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  几乎所