郵件原理與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號埠上)
電子郵件的傳送和接收過程
通過一張圖來說明一封郵件的傳送和接收過程,如下圖所示:
簡單說一下這個郵件收發過程:
- [email protected]使用者寫好一封Email之後,傳送到163的SMTP伺服器。對應於上圖的步驟①
- 163的SMTP伺服器開始處理[email protected]使用者的請求,它會根據收件人的地址判斷,當前收件人是不是自己管轄的使用者,如果是,就直接將Email存放到為該收件人分配的郵箱空間當中。163的SMTP伺服器判斷收件人地址發現,這一封Email的收件人[email protected]是sina的郵件伺服器管理的,於是又將Email轉發給sina的SMTP伺服器。對應於上圖的步驟②
- sina的SMTP伺服器開始處理163的SMTP伺服器傳送過來的Email,sina的SMTP伺服器根據收件人的地址判斷,發現收件人是自己管轄的使用者,於是就直接將Email存放到為[email protected]使用者分配的郵箱空間當中。對應於上圖的步驟③
- [email protected]使用者將郵件發出去之後,就通知[email protected]使用者去收取。[email protected]使用者於是就連線上sina的POP3伺服器收取郵件。對應於上圖的步驟④
- POP3伺服器從[email protected]使用者的郵箱空間當中取出Email。對應於步驟⑤
- POP3伺服器將取出來的Email發給[email protected]使用者。對應於步驟⑥
手工演示電子郵件的傳送
為了增強學習的趣味性和調動大家學習的熱情,我先通過手工方式來發送和接收一封郵件,我在163和sina上分別開設了一個郵箱賬號,我想用163的郵箱向sina的郵箱中傳送一封郵件,這個郵件傳送過程是怎樣的呢?先用畫圖的方式簡要描述一下(參見上圖),我們要傳送和接收郵件,首先要知道163和sina的郵件伺服器地址,郵件伺服器幫我們幹什麼呢?幫我們把郵件發出去,幫我們把郵件接收進來,為我們提供取郵件的服務。
然後我們就要思考一個問題:是直接把郵件發給sina的郵件伺服器,還是經過163的伺服器發給sina呢?我們分別要連線它們的什麼伺服器呢?——很顯然,是經過163的郵件伺服器傳送給sina的郵件伺服器。
準備實驗環境
- 提前在163和sina上註冊一個免費帳號。
獲取smtp和pop3伺服器的名稱。
163或sina會在其幫助中心裡提示管理當前註冊帳號的郵件伺服器的主機名。- 網易163免費郵箱相關伺服器資訊
- sina免費郵箱相關伺服器資訊
- 網易163免費郵箱相關伺服器資訊
編寫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())); } }
準備好實驗環境之後,那我們就手工使用SMTP協議傳送電子郵件。
使用SMTP協議傳送郵件
SMTP協議講解
使用SMTP協議傳送郵件給郵件伺服器時規定了要做以下幾件事:
- 使用
ehlo
命令和連線上的smtp伺服器打聲招呼,例如:
- echo hello
- 使用
auth login
命令登入到smtp伺服器,登入使用的使用者名稱和密碼必須是經過base64編碼後的使用者名稱和密碼,例如:
- 輸入命令:auth login
- 輸入使用base64加密過後的使用者名稱:eWVyZW55dW+1sFuMTAwMDE=
- 輸入使用base64加密過後的密碼:MTAwMDF5ZXJl+2sbnl1YW4=
- 指明郵件的發件人和收件人
- mail from:
<[email protected]>
- rcpt to:
<[email protected]>
- mail from:
編寫要傳送的郵件內容,郵件的編寫格式是有一定的規則的,必須符合RFC822文件規範,RFC822文件規定了如何編寫一封簡單的郵件,一封格式良好的郵件應該包含郵件頭和郵件的主體內容,並且郵件頭和郵件體兩者之間要使用空行分隔。
郵件頭使用下面的三個欄位來指明:- from欄位用於指明郵件的傳送人。
- to欄位用於指明郵件的收件人。
- subject欄位用於指明郵件的主題。
郵件體:即郵件內容。
郵件的內容包含了這些資訊之後才是一封格式良好的郵件。輸入
data
命令:data
編寫郵件內容
from:
<[email protected]>
——郵件頭
to:<[email protected]>
——郵件頭
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
退信程式碼說明:
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:返回某一封郵件的統計資訊(可以看到每封電子郵件分別佔用多少個位元組)
- retr 數字:收取郵件,如retr 1表示收取郵箱當中的第一封郵件,這是POP3協議裡面最重要的一個命令。
- 郵件收取完成之後使用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來進行郵件傳送。
相關推薦
郵件原理與JavaMail開發(一)——郵件的傳送與接收原理
Java郵件開發介紹 為什麼要學習javamail開發 現在很多WEB應用在開發時都需要整合郵件傳送功能,例如: 給新註冊的使用者自動傳送一封包含其註冊資訊的歡迎E-Mail。 給過生日的註冊會員自動傳送一封表示祝賀的E-Mail。 將網站的最新活動
郵件原理與JavaMail開發中應用的一些重要的類
JavaMail API使用javax.mail.Message類來表示一封郵件,Message類是一個抽象類,應用程式需要使用其實現子類java.mail.internet.MimeMessage來建立Message類的例項物件。如果要建立一封致包含文字的簡單郵件,那麼只需要使用到MimeMessage類就
電子郵件收發原理和JavaMail開發
Java郵件開發介紹 為什麼要學習javamail開發 現在很多WEB應用在開發時都需要整合郵件傳送功能,例如: 給新註冊的使用者自動傳送一封包含其註冊資訊的歡迎E-Mail。 給過生日的註冊會員自動傳送一封表示祝賀的E-Mail。 將網站的最新活動資訊通過E-Mail傳送給所有的註冊會員。 等等
郵件傳送和接收原理
一、 郵件開發涉及到的一些基本概念 1.1、郵件伺服器和電子郵箱 要在Internet上提供電子郵件功能,必須有專門的電子郵件伺服器。例如現在Internet很多提供郵件服務的廠商:sina、sohu、163等等他們都有自己的郵件伺服器。 這些郵件伺服器類似
Windows Service開發系列(ODBC開發)(一) -- ODBC簡介與一般操作流程
Windows Service開發系列(ODBC開發)(一) – ODBC簡介與一般操作流程 【1】ODBC簡介 開放資料庫互連(ODBC)是微軟提出的資料庫訪問介面標準。開放資料庫互連定義了訪問資料庫的API一個規範,這些API獨立於不同廠商的DBMS(資料庫
《深入Linux核心架構與底層原理》讀書筆記一——核心架構與核心資料結構知識
1、核心架構常見架構正規化:Linux核心上下層通訊方式橫向系統和縱向系統橫向系統如cgroup,proc,sys檔案系統,系統呼叫的組織,除錯系統,Core Dump,訊號,記憶體管理等;縱向系統是指具體的功能模組,如USB功能,一個對USB檔案的操作要走完核心中的很多個層
大數據入門第十九天——推薦系統與mahout(一)入門與概述
tps font 解決 技術分享 tar nbsp mage cnblogs clas 一、推薦系統概述 為了解決信息過載和用戶無明確需求的問題,找到用戶感興趣的物品,才有了個性化推薦系統。其實,解決信息過載的問題,代表性的解決方案是分類目錄和搜索引擎,如hao123
QT與SQL(一):與資料庫的連線
軟體版本:QT5.5.1+Microsoft SQL Server 2008 R2 1,在.Pro檔案中新增程式碼: QT += sql 2,在對應的.h檔案或.cpp檔案中新增引用: #include<QtSql> 3,進行連線配置,共有兩種方法:
javamail程式碼例子-java寫的郵件傳送-另一種傳送郵件的方法
package com.cs.mail; import java.io.FileInputStream; import java.io.InputStream; import java.util.Properties; import javax.mail.Authen
【JavaMail開發總結】配置檔案形式--傳送郵件程式
在上一篇中簡單的實現了一個傳送郵件功能的程式,今天用配置檔案的方式來實現,大致思路一致,示例程式碼如下: package com.javamail.test.demo; import java.io.IOException; import java.io.I
使用 JavaMail 實現郵件傳送與收取
因為上一篇已經實現了James的配置,那接下來就是利用javaMail實現郵件的傳送和收取。 傳送郵件的程式碼: package com.ge.test; import java.util.Properties; import javax.activation.
【JavaMail開發】使javamail-1.4.2 傳送郵件時中文附件亂碼或顯示"??"的解決辦法
使javamail-1.4.2 傳送郵件時中文附件亂碼或顯示”??”的解決辦法 首先需要匯入的jar包 : 1. mail-1.4.1.jar 記得不是 javax.mail.jar 程式碼如下: public class SendEmail
FIDO U2F應用與開發(一)-原理與協議
註冊 oss 特定 官方網站 圖1 images www 成功 tps 1. FIDO與U2F ??FIDO(Fast IDentity Online聯盟)是一個基於標準、可互操作的身份認證生態系統。??U2F(Universal 2nd Factor)是FIDO聯盟
iOS12系統應用開發基礎教程傳送郵件
iOS12系統應用開發基礎教程傳送郵件 訊息分享是應用社交化和營銷的重要途徑。除了開發者自己搭建專有的訊息分享渠道之外,還可以藉助系統自帶的各種途徑。iOS提供了3種快速分享訊息的方式,分別為傳送郵件、傳送簡訊以及資料分享等。本章將講解這三種方式。 傳送郵件 郵件是一種更為靈活的資料分享
基於JavaMail的簡單郵件傳送
電子郵件的應用非常廣泛,例如在某網站註冊了一個賬戶,自動傳送一封歡迎郵件,通過郵件找回密碼,自動批量傳送活動資訊等。但這些應用不可能和我們自己平時發郵件一樣,先開啟瀏覽器,登入郵箱,建立郵件再發送。本文將簡單介紹如何通過 Java 程式碼來建立電子郵件,並連線郵件伺服器傳送郵件。 1. 電子郵件
JavaMail傳送和接收郵件(轉載)
出處: http://blog.csdn.net/zapldy/article/details/3971579 一、JavaMail概述: JavaMail是由Sun定義的一套收發電子郵
JavaMail實踐--實現郵件傳送
一、介紹 1、主要功能: 實現普通郵件的傳送 實現帶有HTML標籤的內容傳送 實現帶有附件的郵件傳送 2、API JavaMail mail.jar 1.4.5 JAF(版本 1.1.1) activation.jar 3、QQ郵箱的認證
JavaMail 給多人傳送郵件
JavaMail傳送郵件 多人傳送 在我們開發過程中經常會用到郵件,比如 : 傳送通知,找回密碼 驗證碼 等等,再次總結了使用javaMail傳送郵件,無需單間james等郵件伺服器也可傳送郵件 javaMail官網 在裡面可以找到詳細的文件以及案例和ja
基於JavaMail的Java郵件傳送:複雜郵件傳送
一封複雜的郵件內容可以看做是由很多節點(或者可以說是“片段”/“部分”/“零件”)組成,文字、圖片、附件等都可以看成是郵件內容中的一個節點。這些節點之間又可以相互關聯組合成一個節點。最終組合成一個大節點就是郵件的正文內容。 完整程式碼演示: package com.xiets.ja
JavaMail傳送和接收郵件API
一、JavaMail概述: JavaMail是由Sun定義的一套收發電子郵件的API,不同的廠商可以提供自己的實現類。但它並沒有包含在JDK中,而是作為JavaEE的一部分。 廠商所提供的JavaMail服務程式可以有選擇地實現某些郵件協議,常見的郵件協議包括: SMTP:簡單