熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

基於SMTP的JAVA郵件發送程序

2013-11-23 19:02:38  來源: Java核心技術 

  這個程序沒有使用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 命令後表示所有的郵件接收人已標識並初始化數據傳輸以 CRLFCRLF 結束

  VRFY 用於驗證指定的用戶/郵箱是否存在由於安全方面的原因服務器常禁止此命令

  EXPN 驗證給定的郵箱列表是否存在擴充郵箱列表也常被禁用

  HELP 查詢服務器支持什麼命令

  NOOP 無操作服務器應響應 OK

  RSET 重置會話當前傳輸被取消

  QUIT 結束會話

  連接到 Postfix 使用 SMTP 命令發送郵件

  例如安裝 Postfix 的郵件服務器IP是 (藍色字體內容由客戶端輸入紅色字體內容是服務返回的)

  telnet 使用 telnet 命令連接服務器 端口

  helo 向服務器標識用戶身份發送 mail from 命令

  ehlo ESMTP 命令發信需要認證

  auth login 進行用戶身份認證

   VXNlcmhbWU

  YzdGFAYWheGlLmldA== BASE 加密後的用戶名

   UGFzcdvcmQ

  MTkMjIxNA== 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 dont reply it

  

   數據內容包括BASE加密後的郵件內容 以 CRLFCRLF 結束數據傳輸

   OK: queued as FDE 命令執行成功

  quit 結束會話

   Bye

  Connection closed by foreign host 斷開連接

  以上就是一個郵件發送的基本的命令

  再說一下郵件發送的基本過程

  如果你的郵件地址是而你要用這個郵箱發送一封郵件到你需要連接到服務器上當然這個連接可能需要認證現在基本上都要驗證然後是發送郵件到服務器上關閉連接在上你所發送的郵件進入發送隊列中輪到你要發送的郵件時主機再聯系將郵件傳輸到服務器上

  二實例應用

  

  MailMessageJava

  

  //這個類其實就是一個基本的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) {

  thispassword = password;

  }

  public String getUser() {

  return user;

  }

  public void setUser(String user) {

  thisuser = user;

  }

  public String getContent() {

  return content;

  }

  public void setContent(String content) {

  ntent = content;

  }

  public String getDatafrom() {

  return datafrom;

  }

  public void setDatafrom(String datafrom) {

  thisdatafrom = datafrom;

  }

  public String getDatato() {

  return datato;

  }

  public void setDatato(String datato) {

  thisdatato = datato;

  }

  public String getDate() {

  return date;

  }

  public void setDate(String date) {

  thisdate = date;

  }

  public String getFrom() {

  return from;

  }

  public void setFrom(String from) {

  thisfrom = from;

  }

  public String getSubject() {

  return subject;

  }

  public void setSubject(String subject) {

  thissubject = subject;

  }

  public String getTo() {

  return to;

  }

  public void setTo(String to) {

  thisto = to;

  }

  }

  

  SMTPClient Java

  

  //主要的功能就在這裡面完成了

  package mail;

  import JavaioBufferedReader;

  import JavaioBufferedWriter;

  import JavaioIOException;

  import JavaioInputStreamReader;

  import JavaioOutputStreamWriter;

  import Socket;

  import SocketException;

  import UnknownHostException;

  import JavautilStringTokenizer;

  import sunmiscBASEEncoder;

  public class SMTPClient {

  private boolean debug=true;

  BASEEncoder encode=new BASEEncoder();//用於加密後發送用戶名和密碼

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

  // TODO Autogenerated method stub

  MailMessage message=new MailMessage();

  messagesetFrom(mailto:%);//發件人

  messagesetTo(mailto:%);//收件人

  String server=;//郵件服務器

  messagesetSubject(test);//郵件主題

  messagesetContent(test);//郵件內容

  messagesetDatafrom(mailto:%);//發件人在郵件的發件人欄目中顯示

  messagesetDatato(mailto:%);//收件人在郵件的收件人欄目中顯示

  messagesetUser(wasingmon);//登陸郵箱的用戶名

  messagesetPassword();//登陸郵箱的密碼

  SMTPClient smtp=new SMTPClient(server);

  boolean flag;

  flag=smtpsendMail(messageserver);

  if(flag){

  Systemoutprintln(郵件發送成功!);

  }

  else{

  Systemoutprintln(郵件發送失敗!);

  }

  }

  private Socket socket;

  public SMTPClient(String serverint port) throws UnknownHostException IOException{

  try{

  socket=new Socket(server);

  }catch(SocketException e){

  Systemoutprintln(egetMessage());

  }catch(Exception e){

  eprintStackTrace();

  }finally{

  Systemoutprintln(已經建立連接!);

  }

  }

  //注冊到郵件服務器

  public void helo(String serverBufferedReader inBufferedWriter out) throws IOException{

  int result;

  result=getResult(in);

  //連接上郵件服務後服務器給出應答

  if(result!=){

  throw new IOException(連接服務器失敗);

  }

  result=sendServer(HELO +serverinout);

  //HELO命令成功後返回

  if(result!=)

  {

  throw new IOException(注冊郵件服務器失敗!);

  }

  }

  private int sendServer(String strBufferedReader inBufferedWriter out) throws IOException{

  outwrite(str);

  outnewLine();

  outflush();

  if(debug)

  {

  Systemoutprintln(已發送命令:+str);

  }

  return getResult(in);

  }

  public int getResult(BufferedReader in){

  String line=;

  try{

  line=inreadLine();

  if(debug){

  Systemoutprintln(服務器返回狀態:+line);

  }

  }catch(Exception e){

  eprintStackTrace();

  }

  //從服務器返回消息中讀出狀態碼將其轉換成整數返回

  StringTokenizer st=new StringTokenizer(line );

  return IntegerparseInt(stnextToken());

  }

  public void authLogin(MailMessage messageBufferedReader inBufferedWriter out) throws IOException{

  int result;

  result=sendServer(AUTH LOGINinout);

  if(result!=){

  throw new IOException(用戶驗證失敗!);

  }

  result=sendServer(encodeencode(messagegetUser()getBytes())inout);

  if(result!=){

  throw new IOException(用戶名錯誤!);

  }

  result=sendServer(encodeencode(messagegetPassword()getBytes())inout);

  if(result!=){

  throw new IOException(驗證失敗!);

  }

  }

  //開始發送消息郵件源地址

  public void mailfrom(String sourceBufferedReader inBufferedWriter out) throws IOException{

  int result;

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

  if(result!=){

  throw new IOException(指定源地址錯誤);

  }

  }

  // 設置郵件收件人

  public void rcpt(String touchmanBufferedReader inBufferedWriter out) throws IOException{

  int result;

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

  if(result!=){

  throw new IOException(指定目的地址錯誤!);

  }

  }

  //郵件體

  public void data(String fromString toString subjectString contentBufferedReader inBufferedWriter out) throws IOException{

  int result;

  result=sendServer(DATAinout);

  //輸入DATA回車後若收到應答後繼續輸入郵件內容

  if(result!=){

  throw new IOException(不能發送數據);

  }

  outwrite(From: +from);

  outnewLine();

  outwrite(To: +to);

  outnewLine();

  outwrite(Subject: +subject);

  outnewLine();

  outnewLine();

  outwrite(content);

  outnewLine();

  //句號加回車結束郵件內容輸入

  result=sendServer(inout);

  Systemoutprintln(result);

  if(result!=)

  {

  throw new IOException(發送數據錯誤);

  }

  }

  //退出

  public void quit(BufferedReader inBufferedWriter out) throws IOException{

  int result;

  result=sendServer(QUITinout);

  if(result!=){

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

  }

  }

  //發送郵件主程序

  public boolean sendMail(MailMessage messageString server){

  try{

  BufferedReader in=new BufferedReader(new InputStreamReader(socketgetInputStream()));

  BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socketgetOutputStream()));

  helo(serverinout);//HELO命令

  authLogin(messageinout);//AUTH LOGIN命令

  mailfrom(messagegetFrom()inout);//MAIL FROM

  rcpt(messagegetTo()inout);//RCPT

  data(messagegetDatafrom()messagegetDatato()messagegetSubject()messagegetContent()inout);//DATA

  quit(inout);//QUIT

  }catch(Exception e){

  eprintStackTrace();

  return false;

  }

  return true;

  }

  }

  因為現在一般SMTP服務器都需要SMTP驗證所以本例子中也加入了這個驗證要不然郵件時發不出去的(剛開始我就這樣)


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26183.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.