java自學之路-----JavaMail開發

郵件服務器:類似於現實生活中的郵局,負責接收用戶投遞的郵件,並將郵件投遞到指定的接收者的郵件中

電子郵箱:用戶申請的一個賬戶,郵件服務器也會爲該賬戶分配一個空間,用戶通過該賬號發送電子郵件,以及接收郵件

郵件傳輸協議{

SMTP協議:用戶連上了郵件的服務器之後想要發送郵件就需要遵循該協議,才能正確的將郵件發送出去,工作端口號25。用於處理smtp請求的稱爲SMTP服務器(http工作端口80,https工作端口443,)

POP3協議:如果用戶想要從郵件服務器中接收一份電子郵件就需要遵循該協議,才能將郵件接收進來,工作端口號110。用於處理pop3請求的稱爲POP3服務器

使用cmd命令行發送郵件:

telnet smtp.sina.com 25 ----->連接上smtp服務器,指定端口號25

ehlo halm ----->向服務器打個招呼,
auth login ----->告訴服務器登陸
NTQwODM2MDUxNg==   ----->提交登陸該用戶名@之前的字符(必須經過base64編碼)
MTAzMzA2NDkwMA== ----->提交登陸該密碼(必須經過base64編碼)

mail from: <[email protected]> ----->發件人地址
rcpt to:<[email protected]> ----->收件人地址

data ----->告訴服務器開始寫信

from: <[email protected]> ----->發件}
to:<[email protected]>   ----->收件}
subject: test ----->主題}
----->必須加個空行 }按照rfc822文檔指定信件的格式
aaaaaaaaaaa ----->內容}
. ----->結束標識  }

quit ----->退出

使用cmd命令行接收郵件:

telnet pop.qq.com 110 ----->連接上破皮服務器,端口號110
user 1033064900 ----->用戶名
pass !1033064900a# ----->密碼
stat ----->顯示郵件的整體內容
retr ----->接收第2封郵件

quit ----->退出

代碼說明:

220 服務就緒(在socket連接成功時,會返回此信息) 
221 正在處理 
250 請求郵件動作正確,完成(HELO,MAIL FROM,RCPT TO,QUIT指令執行成功會返回此信息) 
354 開始發送數據,結束以 .(DATA指令執行成功會返回此信息,客戶端應發送信息) 
500 語法錯誤,命令不能識別 
550 命令不能執行,郵箱無效 
552 中斷處理:用戶超出文件空間

}


複雜郵件{

MIME協議:對RFC822文檔的升級和補充,描述了一封複雜郵件的生成方式。MIME協議規定使用分割線對多段數據進行分割,並使用content-type頭字段進來說明該段數據的類型,同時還有每段數據間的關係

MimeMessage:用於創建一封郵件對象,需要設置接收者和發送者

MimeBodyPart:用於封裝郵件的一部分內容,需要設置該數據的類型,對於文件數據可以使用處理器進行封裝

MimeMultipart:用於將每部分數據通過關係聯繫起來,再將其封裝到郵件對象中。文本數據與圖片數據關係:related   與附件的關係:mixed


session:用於定義整個應用程序所需的環境信息,以及收集客戶端與郵件服務器建立網絡連接的會話信息,例如服務器的主機,端口,發送和接收的協議


需要導入mail.jar和activation.jar兩個包進行開發複雜郵件

//	創建信息對象封裝服務器信息
		Properties prop = new Properties();
		//服務器的主機
		prop.setProperty("mail.smtp.host", "localhost");
		//服務器的協議
		prop.setProperty("mail.transport.protocol", "smtp");
		//是否想服務器提交認證
		prop.setProperty("mail.smtp.auth", "true");
		
//	創建一封郵件
		//創建一個與服務器進行會話的對象
		Session session = Session.getDefaultInstance(new Properties(prop));
		//使用session來創建一封郵件
		MimeMessage message = new MimeMessage(session);
		//封裝發送者的地址
		message.setFrom(new InternetAddress("[email protected]"));
		//封裝接收者的類型和地址         
		message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
		//設置主題
		message.setSubject("test");
		
//	創建郵件內容
		//創建一個封裝文本數據的對象
		MimeBodyPart text = new MimeBodyPart();
		//封裝數據以及數據的類型
		text.setContent("hello world<img src='cid:1.jpg'></img>", "text/html");
		
		//創建用於封裝圖片數據的對象
		MimeBodyPart image = new MimeBodyPart();
		//設置一個處理器用於將圖片信息封裝到數據對象中(由於文件數據涉及到流比較麻煩,就直接使用處理器進行處理文件對象)
		DataHandler imagedh = new DataHandler(new FileDataSource("src/1.jpg"));
		image.setDataHandler(imagedh);
		//設置圖片的id便於引用 cid:1.jpg
		image.setContentID("1.jpg");
		
		//創建用於封裝附件數據的對象
		MimeBodyPart attach = new MimeBodyPart();
		//設置處理文件的處理器
		DataHandler attachdh = new DataHandler(new FileDataSource("src/1.jpg"));
		attach.setDataHandler(attachdh);
		
		//*** 設置附件的名字,同時默認執行了設置content-disposition 爲attachment
		attach.setFileName(attachdh.getName());
		
//	描述關係
		//文本與圖片的關係並封裝到一個body中
		MimeMultipart textImage = new MimeMultipart();
		textImage.addBodyPart(text);
		textImage.addBodyPart(image);
		//設置與圖片的關係
		textImage.setSubType("related");
		//在封裝到bodypart中
		MimeBodyPart textImageBody = new MimeBodyPart();
		textImageBody.setContent(textImage);
		
		//與附件的關係
		MimeMultipart textImageAttach = new MimeMultipart();
		textImageAttach.addBodyPart(textImageBody);
		textImageAttach.addBodyPart(attach);
		//設置關係
		textImageAttach.setSubType("mixed");
		
//	將保存了數據以及關係的內容封裝到郵件對象中
		message.setContent(textImageAttach);
		message.saveChanges();
		
//	發送郵件
		//從會話對象中拿到發送郵件的對象
		Transport transport = session.getTransport();
		//提交用戶名,密碼
		transport.connect("localhost", "aaa", "123");
		//發送郵件,指定郵件以及收件人地址
		transport.sendMessage(message, message.getAllRecipients());
		transport.close();
		


注意:
		//如此就是直接設置文本內容,不使用bodypart進行封裝。
		//當接收者確定接收該圖片的時候,程序就會從服務端
		//獲取圖片數據,這樣服務端就可以獲取到接收者的信息。(不建議使用)
		message.setContent("aaaa<img src='c://1.jpg'></img>", "text/html");

}


服務器搭建必須{

例:

1.a用戶通過新浪服務器向擁有搜狐賬號的b用戶發送郵件

2.新浪服務器先獲取a用戶指定的接收者的域名(souhu.com)

3.查詢dns服務器,得知域名對應的ip

4.新浪服務器就通過ip,將郵件發送至搜狐的服務器,並且說明是由新浪的服務器發送的郵件(即帶着smtp.sina.com)

5.搜狐的服務器拿到smtp.sina.com就去查詢dns服務器找到對應的ip

6.當ip值與發送郵件過來的服務器的ip值相等時,就確定這是新浪發送的服務器(就不需要使用用戶名密碼)

7.搜狐服務器再將郵件發送給b用戶

總結:

1.在dns服務器上指定服務器的域名對應的ip值(smtp.halm.com ——》127.0.0.1),用於服務器之間轉發的時候不需要用戶名密碼

2.在dns服務器上指定郵件的域名對應的ip值(@halm.com——》127.0.0.1),用於其它服務器找到自己的服務器的地址

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章