亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用java開發Email工具之發送郵件

2019-11-18 12:11:18
字體:
來源:轉載
供稿:網友

  本文介紹了如何利用java的網絡API來實現一個電子郵件工具程序。通常Email工具都是使用SMTP(簡單郵件傳輸協議, Simple Mail Transfer PRotocol)來發送郵件,使用POP3協議來接受電子郵件。在本文中只對這兩個協議作簡單介紹。假如有愛好的讀者可以參考以下站點:
  
  POP3: FTP://ftp.isi.edu/in-notes/rfc1939.txt
  
  SMTP: ftp://ftp.isi.edu/in-notes/rfc2821.txt
  
  Java中雖然提供了JavaMail API,但是由于在這篇文章中我將從底層來探討電子郵件軟件是如何工作的,因此不會使用JavaMail API。本文中的例子是在J2SE 1.4下開發的。
  
  
  電子郵件的格式
  
  
  在開發Email軟件之前,你需要了解電子郵件的格式。根據RFC 2882(http://www.faqs.org/rfcs/rfc2822.Html)的規定,電子郵件由很多行組成,每行由(ASCII代碼13和ASCII代碼10)結束。每行的最大長度為998個字符。其中有些行提供了收發電子郵件所必需的信息,這些行被稱為頭(Header),所有的頭構成了頭域(Header Field)。其他的行用于保存郵件的具體內容。
  
  頭域提供了很多信息,其中包括郵件的來源;郵件的目的地和郵件的主題等。每個頭由名稱和冒號加上相應的值構成。例如From:、Send:和Reply-To:中記錄了郵件的來源。在From:中記錄的是郵件的作者;在Sender:中指定了發送郵件的代理(可以是郵件地址,也可以是機器名稱);Reply-To:中指定了接受回信的郵箱地址。
  
  一封郵件可能有多個作者,因此From:中可以指定一個或多個郵箱地址。下面給出了一個個From:的例子:
  
  From: Ray Feng , bogus@yahoo.com.cn
  
  
  
  在一封電子郵件中只能有一個Sender。因此Sender:的值只能包含一個郵箱地址。假如在From:中只有一個作者,而且Sender:的值和From:的值相同,則Sender:就不會出現在電子郵件中,否則會出現信息冗余;反之Sender:則應該出現在郵件中。下面是一個Sender:的例子:
  
  Sender: Ray Feng rayfeng@yahoo.com.cn
  
  
  
  在電子郵件中可以指定將回信發送到多個郵箱地址中。因此Reply-To:中可以包含一個或多個郵箱地址,每個地址之間用逗號隔開。假如郵件中有Reply-To:,回信會被發送到羅列在Reply-To:中的所有地址;假如郵件中沒有Reply-To:,則回信會被發送到羅列在From:中的地址。那么誰會收到郵件呢?To:和Cc:中保存了接受郵件的郵箱地址。兩者的值都可以包含多個郵箱地址。
  
  除了郵件的來源和接受者,RFC 2882中還定義了其他一些頭,例如Subject:中包含了電子郵件的主題。下面是一個電子郵件頭域的例子:
  
  From: Ray Feng
  To: bogus
  Cc: John
  Subject: Test Email
  
  
  
  附件
  
  在MIME中答應在電子郵件中添加二進制文件,被添加的文件叫做附件。附件的內容可以作為郵件的一部分進行傳輸。MIME是假如實現這個功能的呢?在MIME中引入了很多頭,其中和附件相關的最重要的就是Content-Type:和Content-Tracnsfer-Encoding:。為了在一封電子郵件中區分不同的部分,MIME要求在Content-Type: multipart/mixed頭中包含一個邊界參數。邊界參數的值是一個在雙引號中的字符串。通過這個字符串,程序就可以區分電子郵件的不同部分。在傳輸電子郵件的內容前,程序先傳輸一個,兩個連字符和邊界參數。當完成Email內容的傳輸后,程序會在最后傳輸邊界參數和兩個連字符。
  
  下面的電子郵件中包含了兩個部分,一個部分是由iso-8859-1字符組成的文本,一部分是名為file.txt的附件。這里沒有包含Content-Transfer-Encoding:頭,表明使用缺省的7位ASCII字符。
  
  Content-Type: multipart/mixed; boundary="***"
  --***
  Content-Type: text/plain; charset="iso-8859-1"
  This message has an attachment.
  --***
  Content-Type: text/plain; name="file.txt"
  Attachment text.
  --***--
  
  
  
  
  發送電子郵件
  
  
  基于互聯網的電子郵件通常是利用SMTP網絡協議進行傳輸的。根據SMTP,當電子郵件程序需要發送電子郵件時,該程序首先同一個SMTP服務程序建立起雙向的通訊通道(通常是通過套接字建立這種通道的)。這個基本的SMTP服務程序或許是這份電子郵件的最終目的地,也可能只是通向另一個SMTP服務程序的跳板。總而言之,當電子郵件程序同SMTP服務程序建立起雙相的傳輸通道后,電子郵件程序會向SMTP服務程序發送一系列基于ASCII字符的命令,而SMTP服務程序會對這些命令產生相應的回應來表明相應的操作是成功還是失敗了。
  
  讓我們假設所有的操作都成功了,那么電子郵件程序將把郵件發送到SMTP服務程序,假如電子郵件的接收地址正好是該SMTP服務程序運行的服務器,那么SMTP服務程序就會將郵件加入郵件數據庫中,否則SMTP服務程序將把郵件轉發到在其他SMTP服務器上的SMTP服務程序,直到到達目的地為止。圖二通過圖示說明了這一點。
  用java開發Email工具之發送郵件
  SMTP可以識別很多電子郵件用來與SMTP服務程序通訊的命令。某些命令需要參數,某些命令則不需要。但是每個命令后必須跟一個。最常用的六個命令是HELO,MAIL,RCPT,DATA,RSET和QUIT。
  
  按照上面的順序給出這六個命令并非偶然。除了RSET外,其他的命令必須按照特定的順序發送,這是因為SMTP服務程序是基于狀態的。對于每一個建立了雙向通訊通道的電子郵件程序,SMTP服務程序都會保存當前的通訊狀態。
  
  當一個電子郵件程序和SMTP服務程序建立聯系后,SMTP服務程序將向電子郵件程序發送初始化消息。該消息包含了一個三位回應碼,這個回應碼是用來標識SMTP服務程序的。除此之外,在SMTP服務程序發送給電子郵件程序的消息的頭部也帶有回應碼,它們被用來表示操作成功或者失敗。電子郵件程序接收到這些回應碼后,可以根據其中包含的信息完成相應的工作。而消息的文本部分是給人看的,電子郵件程序可以忽略文本部分。
  
  在收到初始化消息后,電子郵件程序通過發送HELO命令來開始傳輸郵件。HELO命令有一個參數,該參數標志了SMTP服務程序所在服務器的域名。它將在SMTP服務程序中標識出SMTP服務程序。作為回應,SMTP服務程序進行一些初始化工作,將自己設定到初始狀態以接收電子郵件。當這些工作成功完成后,它發送回一條成功的回應消息給電子郵件程序,該回應消息以回應碼250開頭。
  
  在HELO命令之后,電子郵件程序會發送MAIL命令。MAIL命令將在SMTP服務程序中標識出發送者,它有兩個參數:FROM:和一個電子郵件地址。假如SMTP服務程序能夠成功地解析電子郵件地址的話,通常它將返回以250開頭的回應消息;否者將發送回表示操作失敗的回應消息。
  
  在MAIL之后是RCPT命令。RCPT命令在SMTP服務程序中標識出一個郵件的接收者,它也有兩個參數:TO:和一個電子郵件地址。假如郵件由多個接收者,則程序需要多次發送RCPT命令。
  
  RCPT命令之后,程序需要發送電子郵件本身了。程序先發送一個DATA命令,當接收到表示成功的回應消息后,將電子郵件逐行發送給SMTP服務程序,當所有的行都發送完畢后,程序發送一行由句號組成的行。在此之后,電子郵件程序等待SMTP服務程序的回應消息,以確定郵件被SMTP服務程序正常接收了。這一切都成功后,程序可以發送RSET命令來退出郵件傳輸過程。最后,當要斷開和SMPT服務程序建立的連接時,程序發送QUIT命令。主要提醒的一點是,雖然上面的命令都是大寫的,但是在實際的協議對大小寫不敏感。
  現在也許你關心的問題是回應碼的格式是怎樣的。最左邊的一位數字代表操作是否成功,1代表收到命令,2代表操作成功完成,3代表等待后續命令,4代表操作臨時未能完成(電子郵件程序可以在當前的郵件傳輸過程中重新發送命令),5代表操作不能完成(電子郵件程序不能在當前的郵件傳輸過程中重新發送命令)。第二位數字代表回應的領域,0代表語法錯誤,1代表消息請求,2代表傳輸通道,3和4沒有指定,5代表與郵件系統相關。最有一位數字對第二位數字做補充說明,這里就不再詳述。根據上面的信息,我們可以看出250代表請求的命令已經成功完成;220代表SMTP服務程序正在等待HELO命令;而503代表命令順序錯誤。有愛好的朋友可以參見RFC 2821。
  
  下面提供了一個基于命令行的例子SMTPDemo,這個例子可以幫助你理解基于SMTP的郵件傳輸機制。這個程序將利用標準端口25連接到一個SMTP服務程序上。為了使程序能夠運行,你需要將home更改為你使用的郵件服務器的地址。
  
  // SMTPDemo.java
  import java.io.*;
  import java.net.*;
  class SMTPDemo
  {
   public static void main (String [] args)
   {
  String SMTPServer = "home
  int SMTPPort = 25;
  Socket client = null;
  try
  {
   // 向SMTP服務程序建立一個套接字連接。
   client = new Socket (SMTPServer, SMTPPort);
   // 創建一個BufferedReader對象,以便從命令行讀取用戶輸入。
   BufferedReader stdin;
   stdin = new BufferedReader (new InputStreamReader (System.in));
   // 創建一個BufferedReader對象,以便從套接字讀取輸出。
   InputStream is = client.getInputStream ();
   BufferedReader sockin;
   socki

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文.日本.精品| 久久久久久免费精品| 国产欧美一区二区三区久久人妖| 一本色道久久88综合日韩精品| 日韩av电影在线播放| 中文字幕亚洲情99在线| 国产精品视频成人| 亚洲国产另类 国产精品国产免费| 一区二区三欧美| 午夜精品理论片| 超碰91人人草人人干| 国产黑人绿帽在线第一区| 亚洲欧美成人一区二区在线电影| 国产精品十八以下禁看| 日韩精品欧美国产精品忘忧草| 欧美日韩国产精品一区| 亚洲va国产va天堂va久久| 亚洲精品国产欧美| 日韩在线观看免费全| 成人激情电影一区二区| 欧洲精品久久久| 国产免费一区二区三区在线能观看| 欧美午夜丰满在线18影院| 亚洲深夜福利在线| 97精品一区二区三区| 美女撒尿一区二区三区| 丝袜一区二区三区| 美女少妇精品视频| 日韩欧美亚洲成人| 92版电视剧仙鹤神针在线观看| 亚洲第一页自拍| 亚洲成人精品久久久| 亚洲永久在线观看| 久久久精品国产| 亚洲第一视频网| 日韩欧美国产高清91| 日韩日本欧美亚洲| 欧美日韩激情视频8区| 97在线视频免费| 九九久久久久99精品| 91福利视频网| 国产一区二区三区四区福利| 亚洲91av视频| 正在播放亚洲1区| 在线观看欧美成人| 欧美日韩另类字幕中文| 国产精品va在线| 久久影院资源网| 国产精品久久久久久五月尺| 深夜精品寂寞黄网站在线观看| 91精品综合久久久久久五月天| 国内精品久久久久伊人av| 日韩av电影手机在线| 欧美亚洲视频在线看网址| 精品福利免费观看| 亚洲欧美日韩久久久久久| 日韩在线中文字| 亚洲成人国产精品| 亚洲第五色综合网| 韩国欧美亚洲国产| 懂色av影视一区二区三区| 国产精品久久久久久久久粉嫩av| 国产99久久精品一区二区| 中文字幕日韩精品有码视频| 色综合色综合久久综合频道88| 九九久久久久久久久激情| 欧美日韩黄色大片| 91香蕉嫩草神马影院在线观看| 久久精品国产一区| 96pao国产成视频永久免费| 91丨九色丨国产在线| 欧美色欧美亚洲高清在线视频| 亚洲精品一区中文字幕乱码| 日韩av电影国产| 久久九九有精品国产23| 国产日韩欧美中文在线播放| 亚洲精品国产福利| 国产精品丝袜白浆摸在线| 欧美裸身视频免费观看| 欧美孕妇性xx| 91精品久久久久久久久中文字幕| 欧美日韩中文字幕在线| 欧美精品在线观看91| 日韩大片免费观看视频播放| 爽爽爽爽爽爽爽成人免费观看| 91久久精品国产91久久性色| 高清视频欧美一级| 亚洲欧洲日韩国产| 美女黄色丝袜一区| 色老头一区二区三区在线观看| 亚洲人精选亚洲人成在线| 亚洲人午夜色婷婷| 亚洲级视频在线观看免费1级| 日韩三级影视基地| 亚洲图片在区色| 97色伦亚洲国产| 色樱桃影院亚洲精品影院| 成人久久一区二区| www.欧美精品一二三区| 亚洲国产精彩中文乱码av| www.日本久久久久com.| 国产精品视频26uuu| 2019中文字幕全在线观看| 亚洲男人天堂古典| 亚洲色图色老头| 亚洲国产精品推荐| 国产91色在线|| 亚洲欧美日韩另类| 555www成人网| 久久91精品国产91久久久| 国产精品成人一区二区| 午夜精品久久久久久久久久久久| 国产午夜精品免费一区二区三区| 国产亚洲免费的视频看| 久久九九有精品国产23| 国产精品久久久久久av| 亚洲精品国产品国语在线| 国产福利视频一区二区| 在线看片第一页欧美| 精品国产依人香蕉在线精品| 日韩精品福利网站| 亚洲在线www| 久久久久亚洲精品成人网小说| 精品欧美aⅴ在线网站| 久久成人精品电影| 97成人精品区在线播放| 亚洲综合社区网| 欧美成人亚洲成人| 欧美国产日韩精品| 97在线观看免费高清| 最近2019年日本中文免费字幕| 国产日韩欧美综合| 国产精品男女猛烈高潮激情| 亚洲美女av在线| 国产精品一区二区三区成人| 亚洲大尺度美女在线| 精品亚洲一区二区三区| 成人免费淫片视频软件| 欧美极品少妇全裸体| 亚洲性视频网址| 情事1991在线| 欧美最顶级丰满的aⅴ艳星| 亚洲精品福利免费在线观看| 亚洲激情在线观看视频免费| 美女av一区二区| 亚洲精品av在线播放| 精品中文字幕在线观看| 亚洲新中文字幕| 久久夜色精品国产欧美乱| 清纯唯美亚洲综合| 午夜精品久久久久久99热| 亚洲黄色www| 亚洲精品aⅴ中文字幕乱码| 日韩精品免费一线在线观看| 亚洲天堂av在线免费观看| 欧美在线观看www| 日韩视频中文字幕| 亚洲午夜小视频| 亚洲欧美精品伊人久久| 91精品一区二区| 国产精品成人av在线| 成人亚洲激情网| 亚洲色图25p| 国产精品久久久久久久久久久久久久|