日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

电子邮件收发原理和JavaMail开发

發布時間:2023/12/10 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 电子邮件收发原理和JavaMail开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java郵件開發介紹

為什么要學習javamail開發

現在很多WEB應用在開發時都需要集成郵件發送功能,例如:

  • 給新注冊的用戶自動發送一封包含其注冊信息的歡迎E-Mail。
  • 給過生日的注冊會員自動發送一封表示祝賀的E-Mail。
  • 將網站的最新活動信息通過E-Mail發送給所有的注冊會員。
  • 等等…

這些功能的實現都需要軟件開發人員在開發WEB應用中編寫相應的郵件處理程序。

學習目標

學習javamail主要包括兩部分:生成郵件和發送接收郵件。
學習javamail開發之后的效果:

  • 可以編寫程序代碼生成一封帶內嵌圖片的郵件。
  • 可以編寫程序生成一封即帶附件又帶圖片的復雜郵件。
  • 可以編寫java郵件發送程序發送郵件。
  • 實現類似sina、sohu的web郵件發送程序。

郵件開發過程中的一些常見問題:

  • 中文名的郵件附件的亂碼問題。
  • Tomcat中JavaMail支持與沖突問題。
  • 如何實現郵件群發。

郵件開發涉及到的一些基本概念

郵件服務器和電子郵箱

  • 郵件服務器
    要在Internet上提供電子郵件功能,必須有專門的電子郵件服務器。例如現在Internet上有很多提供郵件服務的廠商:sina、sohu、163等等他們都有自己的郵件服務器。
    這些服務器類似于現實生活中的郵局,它主要負責接收用戶投遞過來的郵件,并把郵件投遞到郵件接收者的電子郵箱中。
  • 電子郵箱
    電子郵箱(E-mail地址)的獲得需要在郵件服務器上進行申請 ,確切地說,電子郵箱其實就是用戶在郵件服務器上申請的一個帳戶。用戶在郵件服務器上申請了一個帳號后,郵件服務器就會為這個帳號分配一定的空間,用戶從而可以使用這個帳號以及空間,發送電子郵件和保存別人發送過來的電子郵件。

郵件傳輸協議和郵件服務器類型

  • SMTP協議
    用戶連上郵件服務器后,要想給它發送一封電子郵件,需要遵循一定的通迅規則,SMTP協議就是用于定義這種通訊規則的。因而,通常我們也把處理用戶smtp請求(郵件發送請求)的郵件服務器稱之為SMTP服務器(郵件發送服務器)。(SMTP服務器工作在25號端口上)
  • POP3協議
    同樣,用戶若想從郵件服務器管理的電子郵箱中接收一封電子郵件的話,他連上郵件服務器后,也需要遵循一定的通迅格式,POP3協議用于定義這種通訊格式。因而,通常我們也把處理用戶pop3請求(郵件接收請求)的郵件服務器稱之為POP3服務器(郵件接收服務器)。(POP3服務器工作在110號端口上)

電子郵件的發送和接收過程

通過一張圖來說明一封郵件的發送和接收過程,如下圖所示:

簡單說一下這個郵件收發過程:

  • yerenyuan10001@163.com用戶寫好一封Email之后,發送到163的SMTP服務器。對應于上圖的步驟①
  • 163的SMTP服務器開始處理yerenyuan10001@163.com用戶的請求,它會根據收件人的地址判斷,當前收件人是不是自己管轄的用戶,如果是,就直接將Email存放到為該收件人分配的郵箱空間當中。163的SMTP服務器判斷收件人地址發現,這一封Email的收件人i_beautifulman@sina.com是sina的郵件服務器管理的,于是又將Email轉發給sina的SMTP服務器。對應于上圖的步驟②
  • sina的SMTP服務器開始處理163的SMTP服務器發送過來的Email,sina的SMTP服務器根據收件人的地址判斷,發現收件人是自己管轄的用戶,于是就直接將Email存放到為i_beautifulman@sina.com用戶分配的郵箱空間當中。對應于上圖的步驟③
  • yerenyuan10001@163.com用戶將郵件發出去之后,就通知i_beautifulman@sina.com用戶去收取。i_beautifulman@sina.com用戶于是就連接上sina的POP3服務器收取郵件。對應于上圖的步驟④
  • POP3服務器從i_beautifulman@sina.com用戶的郵箱空間當中取出Email。對應于步驟⑤
  • POP3服務器將取出來的Email發給i_beautifulman@sina.com用戶。對應于步驟⑥
  • 手工演示電子郵件的發送

    為了增強學習的趣味性和調動大家學習的熱情,我先通過手工方式來發送和接收一封郵件,我在163和sina上分別開設了一個郵箱賬號,我想用163的郵箱向sina的郵箱中發送一封郵件,這個郵件發送過程是怎樣的呢?先用畫圖的方式簡要描述一下(參見上圖),我們要發送和接收郵件,首先要知道163和sina的郵件服務器地址,郵件服務器幫我們干什么呢?幫我們把郵件發出去,幫我們把郵件接收進來,為我們提供取郵件的服務。
    然后我們就要思考一個問題:是直接把郵件發給sina的郵件服務器,還是經過163的服務器發給sina呢?我們分別要連接它們的什么服務器呢?——很顯然,是經過163的郵件服務器發送給sina的郵件服務器。

    • 準備實驗環境

      • 提前在163和sina上注冊一個免費帳號。
      • 獲取smtp和pop3服務器的名稱。
        163或sina會在其幫助中心里提示管理當前注冊帳號的郵件服務器的主機名。

        • 網易163免費郵箱相關服務器信息
        • sina免費郵箱相關服務器信息
      • 編寫base64編碼程序對用戶名和密碼進行編碼,這樣的程序代碼為:

        public class Base64Util {public static void main(String[] args) throws IOException {System.out.print("請輸入用戶名:");BufferedReader in = new BufferedReader(new InputStreamReader(System.in));String userName = in.readLine();System.out.print("請輸入密碼:");String password = in.readLine();BASE64Encoder encoder = new BASE64Encoder();System.out.println("編碼后的用戶名為:" + encoder.encode(userName.getBytes()));System.out.println("編碼后的密碼為:" + encoder.encode(password.getBytes())); }}
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17

    準備好實驗環境之后,那我們就手工使用SMTP協議發送電子郵件。

    使用SMTP協議發送郵件

    SMTP協議講解

    使用SMTP協議發送郵件給郵件服務器時規定了要做以下幾件事:

    • 使用ehlo命令和連接上的smtp服務器打聲招呼,例如:
      • echo hello
    • 使用auth login命令登錄到smtp服務器,登錄使用的用戶名和密碼必須是經過base64編碼后的用戶名和密碼,例如:
    • 輸入命令:auth login
    • 輸入使用base64加密過后的用戶名:eWVyZW55dW+1sFuMTAwMDE=
    • 輸入使用base64加密過后的密碼:MTAwMDF5ZXJl+2sbnl1YW4=
    • 指明郵件的發件人和收件人
      • mail from: <yerenyuan10001@163.com>
      • rcpt to: <i_beautifulman@sina.com>
    • 編寫要發送的郵件內容,郵件的編寫格式是有一定的規則的,必須符合RFC822文檔規范,RFC822文檔規定了如何編寫一封簡單的郵件,一封格式良好的郵件應該包含郵件頭和郵件的主體內容,并且郵件頭和郵件體兩者之間要使用空行分隔
      郵件頭使用下面的三個字段來指明:

      • from字段用于指明郵件的發送人。
      • to字段用于指明郵件的收件人。
      • subject字段用于指明郵件的主題。

      郵件體:即郵件內容。
      郵件的內容包含了這些信息之后才是一封格式良好的郵件。

    • 輸入data命令:

      data

    • 編寫郵件內容

      from: <yerenyuan10001@163.com>    ——郵件頭
      to: <i_beautifulman@sina.com>      ——郵件頭
      subject: hello           ——郵件頭
      <空行>
      hello world           ——郵件的具體內容

    • 提示:可利用RFC822文檔漏洞發送假冒郵件

    • 輸入一個.告訴郵件服務器郵件內容已經寫完了。
      • .
    • 輸入quit命令斷開與郵件服務器的連接。
      • quit

    以上的6個步驟就是SMTP協議規定的發送一封Email必須要做的事情。

    使用SMTP協議手工發送郵件

    在對SMTP協議有一定的了解之后,我們就可以使用SMTP協議來發送郵件了。下面演示一下使用telnet客戶端連接上163的郵件服務器然后發一封Email到sina的郵箱中去。
    為了能夠對SMTP協議有一個直觀的認識,這里我們不借助任何第三方郵件客戶端工具,而是使用最原始的的telnet客戶端來完成郵件的發送過程,telnet是一個windows自帶的網絡客戶端程序,通過它可以連接上互聯網上面的任意一臺主機。
    大概有人是第一次使用telnet客戶端的工具,我們試著使用telnet客戶端連接sina的smtp服務器,發現會出現’telnet’ 不是內部或外部命令,也不是可運行的程序這樣亂七八糟的東西,如下圖所示:

    要解決該問題,可以參見我的筆記win7操作系統下使用telnet客戶端。
    好了,現在我們使用telnet客戶端連接到網易的smtp服務器上,如下圖所示:

    通過telnet客戶端發Email,如下圖所示:

    這時我們發現會報一個錯誤:

    554 DT:SPM

    SMTP服務器會給我們一個提示,讓我們去找這個頁面:http://mail.163.com/help/help_spam_16.htm?ip=36.110.119.29&hostid=smtp12&time=1474462974,我們進入該頁面之后發現

    退信代碼說明:
    554 DT:SPM 發送的郵件內容包含了未被許可的信息,或被系統識別為垃圾郵件。請檢查是否有用戶發送病毒或者垃圾郵件;

    這說明我們使用telnet客戶端連接上163的郵件服務器然后發一封Email,163的SMTP服務器認為該郵件的內容包含了未被許可的信息,或被其識別為垃圾郵件,所以將該郵件退回。
    接著我想,既然使用telnet客戶端連接上163的郵件服務器然后發一封Email到sina的郵箱中去失敗了,那么試試使用telnet客戶端連接上163的郵件服務器然后發一封Email到qq的郵箱中去,結果依然報相同的錯誤:

    接著我試著使用telnet客戶端連接上sina的郵件服務器然后發一封Email到163的郵箱中去,結果驗證都沒通過:

    再接著我試著使用telnet客戶端連接上qq的郵件服務器然后發一封Email到163的郵箱中去,結果連SMTP服務器都登不上去。

    此刻,我已經瘋了!!!我試圖去搜狐閃電郵箱官網里面注冊一個搜狐郵箱,結果是連這個頁面都打不開。

    手工演示電子郵件的接收

    使用POP3協議接收郵件

    POP3協議講解

    POP3協議規定了收取郵件時要做以下幾件事:

    • 輸入用戶名和密碼登錄到POP3服務器,用戶名和密碼不需要經過base64加密。
      • user username——登錄郵箱的用戶名
      • pass password——登錄郵箱使用的密碼
    • 使用retr命令收取郵件。
      • retr 數字:收取郵件,如retr 1表示收取郵箱當中的第一封郵件,這是POP3協議里面最重要的一個命令。
        在使用retr命令收取郵件之前,可以使用如下的兩個命令查看一下郵箱里面的郵件的一些相關信息。
        • stat:返回郵箱里面的郵件數量以及郵件占用的空間大小信息(可以看到有幾封電子郵件,總共占用多少個字節)
        • list:返回某一封郵件的統計信息(可以看到每封電子郵件分別占用多少個字節)
    • 郵件收取完成之后使用quit命令斷開與POP3服務器的連接。
      • quit:斷開與POP3服務器的連接。

    使用POP3協議手工接收郵件

    收取郵件我們也不借助任何第三方客戶端工具,而是使用telnet客戶端連接到POP3服務器進行收取。
    例如:現在我的163郵箱當中有這樣的一封郵件,如下圖所示:

    現在我們不用使用foxmail或者outLook這樣的客戶端工具去收取,而是使用telnet客戶端連接到163的POP3服務器去手工收取。
    使用telnet連接上163的POP3服務器,使用命令:telnet pop.163.com 110,如下圖所示:

    接著根據POP3協議規定的郵件收取步驟來收取郵件。如下圖所示:

    可以看到,我們使用POP3協議純手工從163的POP3服務器當中收取回來了一封Email,Email里面的內容都經過了base64編碼處理。這就是使用POP3協議收取郵件的過程。
    以上就是郵件的發送與接收原理的相關內容,這一篇文章主要是介紹郵件發送和接收過程中使用到的SMTP協議和POP3協議,沒有涉及到太多代碼方面的東西,后面會具體介紹使用JavaMail來進行郵件發送。

    (function?()?{('pre.prettyprint code').each(function () { var lines = (this).text().split(\n).length;varnumbering = $('
    • ').addClass('pre-numbering').hide(); (this).addClass(has?numbering).parent().append(numbering); for (i = 1; i

    總結

    以上是生活随笔為你收集整理的电子邮件收发原理和JavaMail开发的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。