邮件系统图片内嵌_第1页
邮件系统图片内嵌_第2页
邮件系统图片内嵌_第3页
邮件系统图片内嵌_第4页
邮件系统图片内嵌_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

邮件系统优化文档整理学习目的:提高自身能力,增强解决问题的能力,养成独立思考的习惯学习内容:学习邮件系统开发的基础知识并对现有的一个邮件系统优化,实现邮件发送图片时将图片资源内嵌到邮件内容中去学习过程:1、 熟悉邮件系统的基础知识,了解邮件传输协议(SMTP协议、POP3协议等)(1) SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)定义了邮件客户端软件与SMTP服务器之间以及两台SMTP服务器之间的通信规则。SMTP协议的通信双方采用一问一答的命令/响应形式进行对话。(2) POP3协议定义了邮件客户端程序与POP3服务器进行通信的具体规则和细节。用户要从邮件服务器提供商提供的电子邮箱来获取自己的电子邮件,需要通过邮件服务提供商的POP3邮件服务器来帮助完成。2、 了解电子邮件的工作原理(假设向发送邮件)(1) 的邮件客户端程序与对应的SMTP服务器建立网络连接,并以其用户名和密码登录后使用SMTP协议把邮件发送到sina的SMTP服务器(2) Sina的SMTP服务器收到提交的电子邮件后,首先根据收件人的得知后缀判断接收者的邮件地址是否属于该SMTP服务器的管辖范围,如果是就直接把邮件存储到收件人的邮箱中,否则sina的SMTP服务器想DNS服务器查询收件人的邮件地址后缀所表示的域名的MX记录,与163的SMTP服务器建立连接并采用SMTP协议吧邮件发送给163的SMTP服务器。(3) 163的SMTP服务器收到sina的SMTP服务器发来的电子邮件后,也将根据收件人的地址判断该邮件是否属于该SMTP服务器的管辖范围,如果是就直接把邮件存储到收件人的邮箱中,否则163的SMTP服务器可能继续转发这封电子邮件,也可能丢弃这封电子邮件。(4) 用户通过邮件客户端与163的POP3/IMAP服务器建立网络连接,登录后就可以通过POP3或IMAP协议瞎看邮箱中是否有新邮件。如果有,则用POP3或IMAP协议读取邮箱中的邮件。3、 创建HTML格式的邮件在发送邮件的过程中可能会发送图片,但是由于java自带的编辑器是纯文本框,无法插入图片,所以需要创建HTML格式的邮件。邮件正文用HTML文本表示时,可以使用HTML文件的特性来丰富邮件正文,加入一些图片和声音等。4、 包含内嵌图片的复杂邮件如上所说,创建HTML格式的邮件能够添加图片等,在html页面中直接嵌入图片数据通常是在html页面中应用图片的链接,如: 但是,这样的前提是我们需要将图片先上传到指定的网站,然后获取外链。一方面 略麻烦,最主要的是存储图片的网站是否持续的支持外链引用。所以,将图片直接插入到html页面中。如其中base64逗号之后的就是将图片经过base64编码后的数据。5、 如何实现图片的嵌入实现邮件正文中图片的嵌入,其实就是从邮件的html文件中将图片的绝对URL解析出来再用base64编码,将所得编码以上诉的形式替换原来的img标签的src属性值操作过程1. 由前面的学习可知实现邮件正文的图片嵌入,需要以形式插入图片。其中要将图片进行base64编码,base64方法如下:import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;public static String GetImageStr() /将图片文件转化为字节数组字符串,并对其进行Base64编码处理 String imgFile = 111.jpg;/待处理的图片 /File f=new File(imgFile); f.length() FileInputStream in = null; byte data = null; FileChannel fc= null; /读取图片字节数组 try in = new FileInputStream(imgFile); fc=in.getChannel(); data = new byte(int)fc.size();/in.available(); in.read(data); in.close(); catch (IOException e) e.printStackTrace(); /对字节数组Base64编码 BASE64Encoder encoder = new BASE64Encoder(); return data:image/jpg;base64, + encoder.encode(data);/返回Base64编码过的字节数组字符串 2. 对于网络图片和本地图片,需要先通过图片网址或者本地目录打开图片,读取图片数据,才能实现对图片的base64编码。从本地读取图片的方法:public static String GetImageStr(String imgFile)/imgFile 为本地图片的目录 /将图片文件转化为字节数组字符串,并对其进行Base64编码处理 /String imgFile = 111.jpg;/待处理的图片 /File f=new File(imgFile); f.length() FileInputStream in = null; byte data = null; FileChannel fc= null; /读取图片字节数组 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(); 从网络通过URL读取图片:FileOutputStream fos = null;BufferedInputStream bis = 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(f:haha.jpg);while (size = bis.read(buf) != -1) fos.write(buf, 0, size);3. 通过以上对邮件系统开发基础知识的学习,初步了解了邮件发送的原理和图片嵌入的方式。实现图片的嵌入,就是解析邮件HTML文件的img标签的src属性。可采取两种方式对html解析:htmlparser或者jsoup用htmlparser解析: Parser parser = new Parser();parser.createParser(strline, UTF-8);/strline是要解析的html文件内容/ 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 = (ImageTag) textnode;url = imageTag.getAttribute(src); / 获得html文本的 原来的src属性URL ur = new URL(url);if (ur.getProtocol() = http) s.imge = url;imageTag.setImageURL(s.save(s.imge);/对图片编码并替换原src的URL else local.strImg = url;imageTag.setImageURL(local.GetImageStr(local.strImg);/对图片编码并替换原src的URL 用jsoup解析:Document doc = Jsoup.parse(strbuf);/创建Document对象解析html文档内容Elements jpg = doc.select(imgsrc);/建立对象查找doc中的img标签的src属性String imgUrl = jpg.attr(src);/获取img标签的src属性 /System.out.println(imgUrl);/如果src的值是以http开头则说明该图片为网络图片,调用savepicture对图片进行bsae64编码if (imgUrl.trim().startsWith(http) String change = s.save(imgUrl);/ System.out.println(change);/jpg.removeattr(jpg.attr(src), change);jpg.attr(src, change);/将base64编码后的地址替换掉原来的src的值System.out.println(doc);FileOutputStream fos = new FileOutputStream(doc, false);OutputStreamWriter osw = new OutputStreamWriter(fos, utf-8);osw.write(doc.html();/将更改过img标签的src属性的html文档保存在当前目录的doc.html文件中osw.close();/src为本地目录,则调用base64对本地图片进行编码else String change = local.GetImageStr(imgUrl);/ System.out.println(change);/jpg.removeattr(jpg.attr(src), change);jpg.attr(src, change);/将base64编码后的地址替换掉原来的src的值System.out.println(doc);FileOutputStream fos = new FileOutputStream(doc, false);OutputStreamWriter osw = new OutputStreamWriter(fos, utf-8);osw.write(doc.html();/将更改过img标签的src属性的html文档保存在当前目录的doc.html文件中osw.close();4. 实现邮件图片嵌入的代码: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 class htmlparser public static void main(String args) savepicture s = new savepicture();base64 local = new base64();try FileReader fr = new FileReader(f:/in.html);/ 打开本地的html文档BufferedReader br = new BufferedReader(fr);FileWriter fw = new FileWriter(f:/change.html);BufferedWriter bw = new BufferedWriter(fw);String strline = ;String strbuf = ;/ 缓存文档内容while (br.ready() strline = br.readLine();strbuf += strline;bw.write(strline);bw.newLine();Document doc = Jsoup.parse(strbuf);/ 创建Document对象解析html文档内容Elements jpg = doc.select(imgsrc);/ 建立对象查找doc中的img标签的src属性String imgUrl = jpg.attr(src);/ 获取img标签的src属性/ System.out.println(imgUrl);/ 如果src的值是以http开头则说明该图片为网络图片,调用savepicture对图片进行bsae64编码if (imgUrl.trim().startsWith(http) String change = s.save(imgUrl);/ System.out.println(change);/ jpg.removeattr(jpg.attr(src), change);jpg.attr(src, change);/ 将base64编码后的地址替换掉原来的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为本地目录,则调用base64对本地图片进行编码else String change = local.GetImageStr(imgUrl);/ System.out.println(change);/ jpg.removeattr(jpg.attr(src), change);jpg.attr(src, change);/ 将base64编码后的地址替换掉原来的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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论