郵件系統(tǒng)圖片內(nèi)嵌_第1頁(yè)
郵件系統(tǒng)圖片內(nèi)嵌_第2頁(yè)
郵件系統(tǒng)圖片內(nèi)嵌_第3頁(yè)
郵件系統(tǒng)圖片內(nèi)嵌_第4頁(yè)
郵件系統(tǒng)圖片內(nèi)嵌_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 郵件系統(tǒng)優(yōu)化文檔整理學(xué)習(xí)目的:提高自身能力,增強(qiáng)解決問(wèn)題的能力,養(yǎng)成獨(dú)立思考的習(xí)慣學(xué)習(xí)內(nèi)容:學(xué)習(xí)郵件系統(tǒng)開(kāi)發(fā)的基礎(chǔ)知識(shí)并對(duì)現(xiàn)有的一個(gè)郵件系統(tǒng)優(yōu)化,實(shí)現(xiàn)郵件發(fā)送圖片時(shí)將圖片資源內(nèi)嵌到郵件內(nèi)容中去學(xué)習(xí)過(guò)程:1、 熟悉郵件系統(tǒng)的基礎(chǔ)知識(shí),了解郵件傳輸協(xié)議(SMTP協(xié)議、POP3協(xié)議等)(1) SMTP(Simple Mail Transfer Protocol,簡(jiǎn)單郵件傳輸協(xié)議)定義了郵件客戶(hù)端軟件與SMTP服務(wù)器之間以及兩臺(tái)SMTP服務(wù)器之間的通信規(guī)則。SMTP協(xié)議的通信雙方采用一問(wèn)一答的命令/響應(yīng)形式進(jìn)行對(duì)話(huà)。(2) POP3協(xié)議定義了郵件客戶(hù)端程序與POP3服務(wù)器進(jìn)行通信的具體規(guī)則和細(xì)節(jié)。用

2、戶(hù)要從郵件服務(wù)器提供商提供的電子郵箱來(lái)獲取自己的電子郵件,需要通過(guò)郵件服務(wù)提供商的POP3郵件服務(wù)器來(lái)幫助完成。2、 了解電子郵件的工作原理(假設(shè)lyk向lhl發(fā)送郵件)(1) lyk的郵件客戶(hù)端程序與對(duì)應(yīng)的SMTP服務(wù)器建立網(wǎng)絡(luò)連接,并以其用戶(hù)名和密碼登錄后使用SMTP協(xié)議把郵件發(fā)送到sina的SMTP服務(wù)器(2) Sina的SMTP服務(wù)器收到lyk提交的電子郵件后,首先根據(jù)收件人的得知后綴判斷接收者的郵件地址是否屬于該SMTP服務(wù)器的管轄范圍,如果是就直接把郵件存儲(chǔ)到收件人的郵箱中,否則sina的SMTP服務(wù)器想DNS服務(wù)器查詢(xún)收件人的郵件地址后綴所表示的域名的MX記錄,與163的SMTP

3、服務(wù)器建立連接并采用SMTP協(xié)議吧郵件發(fā)送給163的SMTP服務(wù)器。(3) 163的SMTP服務(wù)器收到sina的SMTP服務(wù)器發(fā)來(lái)的電子郵件后,也將根據(jù)收件人的地址判斷該郵件是否屬于該SMTP服務(wù)器的管轄范圍,如果是就直接把郵件存儲(chǔ)到收件人的郵箱中,否則163的SMTP服務(wù)器可能繼續(xù)轉(zhuǎn)發(fā)這封電子郵件,也可能丟棄這封電子郵件。(4) 用戶(hù)lhl通過(guò)郵件客戶(hù)端與163的POP3/IMAP服務(wù)器建立網(wǎng)絡(luò)連接,登錄后就可以通過(guò)POP3或IMAP協(xié)議瞎看郵箱中是否有新郵件。如果有,則用POP3或IMAP協(xié)議讀取郵箱中的郵件。3、 創(chuàng)建HTML格式的郵件在發(fā)送郵件的過(guò)程中可能會(huì)發(fā)送圖片,但是由于java自

4、帶的編輯器是純文本框,無(wú)法插入圖片,所以需要?jiǎng)?chuàng)建HTML格式的郵件。郵件正文用HTML文本表示時(shí),可以使用HTML文件的特性來(lái)豐富郵件正文,加入一些圖片和聲音等。4、 包含內(nèi)嵌圖片的復(fù)雜郵件如上所說(shuō),創(chuàng)建HTML格式的郵件能夠添加圖片等,在html頁(yè)面中直接嵌入圖片數(shù)據(jù)通常是在html頁(yè)面中應(yīng)用圖片的鏈接,如:<img src=" 但是,這樣的前提是我們需要將圖片先上傳到指定的網(wǎng)站,然后獲取外鏈。一方面 略麻煩,最主要的是存儲(chǔ)圖片的網(wǎng)站是否持續(xù)的支持外鏈引用。所以,將圖片直接插入到html頁(yè)面中。如<img src="data:image/png;base64,

5、.">其中base64逗號(hào)之后的就是將圖片經(jīng)過(guò)base64編碼后的數(shù)據(jù)。5、 如何實(shí)現(xiàn)圖片的嵌入實(shí)現(xiàn)郵件正文中圖片的嵌入,其實(shí)就是從郵件的html文件中將圖片的絕對(duì)URL解析出來(lái)再用base64編碼,將所得編碼以上訴的<img src="data:image/png;base64,.">形式替換原來(lái)的img標(biāo)簽的src屬性值操作過(guò)程1. 由前面的學(xué)習(xí)可知實(shí)現(xiàn)郵件正文的圖片嵌入,需要以<img src="data:image/png;base64,.">形式插入圖片。其中要將圖片進(jìn)行base64編碼,base64方法

6、如下:import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;public static String GetImageStr() /將圖片文件轉(zhuǎn)化為字節(jié)數(shù)組字符串,并對(duì)其進(jìn)行Base64編碼處理 String imgFile = "111.jpg"/待處理的圖片 /File f=new File(imgFile); f.length() FileInputStream in = null; byte data = null; FileChannel fc= null; /讀取圖片字節(jié)數(shù)組 try in = n

7、ew FileInputStream(imgFile); fc=in.getChannel(); data = new byte(int)fc.size();/in.available(); in.read(data); in.close(); catch (IOException e) e.printStackTrace(); /對(duì)字節(jié)數(shù)組Base64編碼 BASE64Encoder encoder = new BASE64Encoder(); return "data:image/jpg;base64," + encoder.encode(data);/返回Base64

8、編碼過(guò)的字節(jié)數(shù)組字符串 2. 對(duì)于網(wǎng)絡(luò)圖片和本地圖片,需要先通過(guò)圖片網(wǎng)址或者本地目錄打開(kāi)圖片,讀取圖片數(shù)據(jù),才能實(shí)現(xiàn)對(duì)圖片的base64編碼。從本地讀取圖片的方法:public static String GetImageStr(String imgFile)/imgFile 為本地圖片的目錄 /將圖片文件轉(zhuǎn)化為字節(jié)數(shù)組字符串,并對(duì)其進(jìn)行Base64編碼處理 /String imgFile = "111.jpg"/待處理的圖片 /File f=new File(imgFile); f.length() FileInputStream in = null; byte data

9、 = null; FileChannel fc= null; /讀取圖片字節(jié)數(shù)組 try in = new FileInputStream(imgFile);/imgFile 為本地圖片的目錄 fc=in.getChannel(); data = new byte(int)fc.size();/in.available(); in.read(data); in.close(); catch (IOException e) e.printStackTrace(); 從網(wǎng)絡(luò)通過(guò)URL讀取圖片:FileOutputStream fos = null;BufferedInputStream bis =

10、 null;HttpURLConnection httpUrl = null;URL url = null;int BUFFER_SIZE = 1024;byte buf = new byteBUFFER_SIZE;int size = 0;try url = new URL(destUrl);httpUrl = (HttpURLConnection) url.openConnection();httpUrl.connect();bis = new BufferedInputStream(httpUrl.getInputStream();fos = new FileOutputStream(&

11、quot;f:haha.jpg");while (size = bis.read(buf) != -1) fos.write(buf, 0, size);3. 通過(guò)以上對(duì)郵件系統(tǒng)開(kāi)發(fā)基礎(chǔ)知識(shí)的學(xué)習(xí),初步了解了郵件發(fā)送的原理和圖片嵌入的方式。實(shí)現(xiàn)圖片的嵌入,就是解析郵件HTML文件的img標(biāo)簽的src屬性。可采取兩種方式對(duì)html解析:htmlparser或者jsoup用htmlparser解析: Parser parser = new Parser();parser.createParser(strline, "UTF-8");/strline是要解析的html文

12、件內(nèi)容/ parser.setURL(url);NodeFilter filter = new TagNameFilter("img");NodeListnodes=(NodeList)parser.extractAllNodesThatMatch(filter); if (nodes != null) for (int i = 0; i < nodes.getLength(); i+) Node textnode = (Node) nodes.item(i);if (textnode instanceof ImageTag) ImageTag imageTag =

13、(ImageTag) textnode;url = imageTag.getAttribute("src"); / 獲得html文本的 原來(lái)的src屬性URL ur = new URL(url);if (ur.getProtocol() = "http") s.imge = url;imageTag.setImageURL(s.save(s.imge);/對(duì)圖片編碼并替換原src的URL else local.strImg = url;imageTag.setImageURL(local.GetImageStr(local.strImg);/對(duì)圖片編碼并

14、替換原src的URL 用jsoup解析:Document doc = Jsoup.parse(strbuf);/創(chuàng)建Document對(duì)象解析html文檔內(nèi)容Elements jpg = doc.select("imgsrc");/建立對(duì)象查找doc中的img標(biāo)簽的src屬性String imgUrl = jpg.attr("src");/獲取img標(biāo)簽的src屬性 /System.out.println(imgUrl);/如果src的值是以http開(kāi)頭則說(shuō)明該圖片為網(wǎng)絡(luò)圖片,調(diào)用savepicture對(duì)圖片進(jìn)行bsae64編碼if (imgUrl.tri

15、m().startsWith("http") String change = s.save(imgUrl);/ System.out.println(change);/jpg.removeattr(jpg.attr("src"), change);jpg.attr("src", change);/將base64編碼后的地址替換掉原來(lái)的src的值System.out.println(doc);FileOutputStream fos = new FileOutputStream("doc", false);Outpu

16、tStreamWriter osw = new OutputStreamWriter(fos, "utf-8");osw.write(doc.html();/將更改過(guò)img標(biāo)簽的src屬性的html文檔保存在當(dāng)前目錄的doc.html文件中osw.close();/src為本地目錄,則調(diào)用base64對(duì)本地圖片進(jìn)行編碼else String change = local.GetImageStr(imgUrl);/ System.out.println(change);/jpg.removeattr(jpg.attr("src"), change);jpg

17、.attr("src", change);/將base64編碼后的地址替換掉原來(lái)的src的值System.out.println(doc);FileOutputStream fos = new FileOutputStream("doc", false);OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");osw.write(doc.html();/將更改過(guò)img標(biāo)簽的src屬性的html文檔保存在當(dāng)前目錄的doc.html文件中osw.close();4. 實(shí)現(xiàn)

18、郵件圖片嵌入的代碼:package html;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.OutputStreamWriter;import org.jsoup.nodes.Document;import org.jsoup.Jsoup;import org.jsoup.select.Elements;public clas

19、s htmlparser public static void main(String args) savepicture s = new savepicture();base64 local = new base64();try FileReader fr = new FileReader("f:/in.html");/ 打開(kāi)本地的html文檔BufferedReader br = new BufferedReader(fr);FileWriter fw = new FileWriter("f:/change.html");BufferedWriter

20、 bw = new BufferedWriter(fw);String strline = ""String strbuf = ""/ 緩存文檔內(nèi)容while (br.ready() strline = br.readLine();strbuf += strline;bw.write(strline);bw.newLine();Document doc = Jsoup.parse(strbuf);/ 創(chuàng)建Document對(duì)象解析html文檔內(nèi)容Elements jpg = doc.select("imgsrc");/ 建立對(duì)象查找do

21、c中的img標(biāo)簽的src屬性String imgUrl = jpg.attr("src");/ 獲取img標(biāo)簽的src屬性/ System.out.println(imgUrl);/ 如果src的值是以http開(kāi)頭則說(shuō)明該圖片為網(wǎng)絡(luò)圖片,調(diào)用savepicture對(duì)圖片進(jìn)行bsae64編碼if (imgUrl.trim().startsWith("http") String change = s.save(imgUrl);/ System.out.println(change);/ jpg.removeattr(jpg.attr("src&qu

22、ot;), change);jpg.attr("src", change);/ 將base64編碼后的地址替換掉原來(lái)的src的值System.out.println(doc);FileOutputStream fos = new FileOutputStream("doc", false);OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");osw.write(doc.html();osw.close();/ src為本地目錄,則調(diào)用base64對(duì)本地圖片進(jìn)行編碼

23、else String change = local.GetImageStr(imgUrl);/ System.out.println(change);/ jpg.removeattr(jpg.attr("src"), change);jpg.attr("src", change);/ 將base64編碼后的地址替換掉原來(lái)的src的值System.out.println(doc);FileOutputStream fos = new FileOutputStream("doc", false);OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");osw.write(doc.html();osw.close();/ System.out.println(strbuf);bw.flush();bw.close();br.close();fw.close();br.close();fr.close(); catch (Exception e) e.printStackTrace();private static void attr(String imgUrl, String change) / TODO

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論