第二讲:使用JavaMail表示MIME消息(2)

第二讲:使用JavaMail表示MIME消息(2)

       在第二讲的第一部分主要讲解了MIME在JavaMail中如何表示以及使用MimeMessage进行创建纯文本和HTML类邮件的讲解。下面将会讲解如何使用MimeBodyPart和MimeMultipart等类创建含有组合消息、附件等较复杂的邮件。

一、MimeBodyPart类
      javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。
      下面介绍一下常用的函数:
MimeBodyPart()
MimeBodyPart(java.io.InputStream is)                                                                                                                                                                                                                                                                                                 
is参数表示从输入流中读取数据,并使用读取到的数据填充MimeBodyPart实例对象
setDDataHandler(javax.activation.DataHandler dh)    设置该对象后,MimeBodyPart在生成具体的MIME消息时会调用该对象的方法获取所需要的数据信息。DataHandler是JAF中定义的一个类,是一种数据访问接口,可以读取各种数据源中的数据和返回数据源的MIME类型。
setContentID(java.lang.String cid)设置消息头中的“Content-ID”头字段
setDisposition(java,lang.String disposition)设置消息头中的"Content-Disposition"字段,如果当前MIME消息作为邮件中的附件部分,那么可以使用这个方法设置。
setFileName(java.lang.String filename)常用于设置邮件附件名,即设置”Content-Disposition“中filename参数
二、MimeMultipart类
        javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
其主要函数有:
Mimemultipart()
MimeMultipart(java.lang.String type)                                                                                                  
缺省类型时"multipart/mixed"即 Mimemultipart对象代表的组合MIME消息的Content-Type属性值为"multipart/mixed",其他类型包括"multipart/related","multipart/alternative"
addBodyPart(BodyPart bp)
addBodyPart(BodyPart bp, int index)
新增一个BodyPart对象到Mimemultipart对象中,其位置位于原有的Mimemultipart对象列表的尾部,用index指定新增的BodyPart插入的位置
setSubType(java.lang.String type)用于设置Content-Type中MIME的子类型,      有:"mixed","related",”alternative"
getContentType():String返回Content-Type类型
getBodyPart(int index)
getBodyPart(java.lang.String cid)
返回Mimemultipart对象中位于index位置或为cid的BodyPart对象
getCount():int返回Mimemultipart对象中保存的BodyPart对象的个数
下面图是用来显示MIME中各个对象将的组合关系:

三、应用举例
例一:创建包含内嵌图片的邮件
         前面的例子中是单独的使用HTML或者是纯文本内容,但是有时候我们需要在纯文本中使用内嵌的方式显示一些图片,因此就要将纯文本和内嵌图片单独存放在MimeBodyPart中然后再将其存放在一个Mimemultipart对象中即可。
		String from = "lucas@sina.com";
		String to= "sacul@163.com,chidlk@gmai.com";
		String body = "<h4>欢迎大家阅读邮件</h4>" 
		+"<a href = \"http://blog.csdn.net/wenwen1538\">欢迎访问我的主页</a>";
		
		String subject = "HTML邮件";
		
		Properties props = new Properties();
		Session session = Session.getInstance(props);
		
		Message msg= new MimeMessage(session);
		
		msg.setFrom(new InternetAddress(from));
		msg.setRecipients(RecipientType.TO, InternetAddress.parse(to));
		
		msg.setSubject(subject);
		msg.setSentDate(new Date());
		
		//创建一个子类型为"related"的Mimemultipart对象
		MimeMultipart multipart = new MimeMultipart("related");
		
		//创建一个HTML正文的MimeBodyPart对象,并将其加载到Mimemultipart对象中
		MimeBodyPart htmlBodyPart = new MimeBodyPart();
		htmlBodyPart.setContent(body, "text/html; charset=gb2312");
		multipart.addBodyPart(htmlBodyPart);
		
		//创建一个图片内容的MimeBodyPart对象并将其加入前面创建的Mimemultipart对象中
		MimeBodyPart imgBodyPart = new MimeBodyPart();	
		FileDataSource fds = new FileDataSource("D:\\蜗牛的世界.png");
		imgBodyPart.setDataHandler(new DataHandler(fds));
		imgBodyPart.setContentID("uind--woniu--png-001");
//		imgBodyPart.setHeader("Content-ID", "uind--woniu--png-001");
		/**
		 * 不需要使用下面的语句来设置图片的MIME类型,因为JAF框架中的DataSource对象可以返回数据源的MIME类型,
		 * 因此上面的setDataHandler()可以设置MIME类型
		 */
//		imgBodyPart.setHeader("Content-Type", "image/gif");
		multipart.addBodyPart(imgBodyPart);
		
		//将multipart对象设置为整个邮件的内容,要使用saveChanges进行更新
		msg.setContent(multipart);
		msg.saveChanges();
		
		//将对象写入文件中
		msg.writeTo(new FileOutputStream("d:\\test.eml"));
		
例二:创建有内嵌图片、附件(普通文件、声音)的组合复杂邮件
	public static void main(String[] args) throws AddressException, MessagingException, FileNotFoundException, IOException {
		
		String from = "lucas@sina.com";
		String to= "sacul@163.com, chidlk@gmai.com";
		String body = "<h4>欢迎大家阅读邮件</h4>" 
		+"<a href = \"http://blog.csdn.net/wenwen1538\">欢迎访问我的主页</a>";
		
		String subject = "HTML邮件";
		
		Properties props = new Properties();
		Session session = Session.getInstance(props);
		
		Message msg= new MimeMessage(session);
		
		msg.setFrom(new InternetAddress(from));
		msg.setRecipients(RecipientType.TO, InternetAddress.parse(to));
		
		msg.setSubject(subject);
		msg.setSentDate(new Date());
		
		//创建代表邮件正文和附件的各个对象
		MimeBodyPart contentPart = createContent(body, "D:\\蜗牛的世界.png");
		MimeBodyPart attactment1 = createAttachment("D:\\create.sql");
		MimeBodyPart attachment2 = createAttachment("D:\\TTPmusic\\Maroon 5 - One More Night.mp3");
		
		//下面组合邮件正文和附件的Mimemultipart对象
		MimeMultipart allMultipart = new MimeMultipart("mixed");
		allMultipart.addBodyPart(contentPart);
		allMultipart.addBodyPart(attactment1);
		allMultipart.addBodyPart(attachment2);
		
		//将multipart对象设置为整个邮件的内容,要使用saveChanges进行更新
		msg.setContent(allMultipart);
		msg.saveChanges();
		
		//将对象写入文件中
		msg.writeTo(new FileOutputStream("d:\\test.eml"));
	}
	
	public static MimeBodyPart createContent(String body, String filename) throws MessagingException{
		
		//创建一个MimeBodyPart对象存放Mimemultipart对象
		MimeBodyPart contentBodyPart = new MimeBodyPart();
		
		//创建一个子类型为"related"的Mimemultipart对象
		MimeMultipart multipart = new MimeMultipart();
		multipart.setSubType("related");
		//创建一个HTML正文的MimeBodyPart对象,并将其加载到Mimemultipart对象中
		MimeBodyPart htmlBodyPart = new MimeBodyPart();
		htmlBodyPart.setContent(body, "text/html; charset=gb2312");
		multipart.addBodyPart(htmlBodyPart);
		
		//创建一个图片内容的MimeBodyPart对象并将其加入前面创建的Mimemultipart对象中
		MimeBodyPart imgBodyPart = new MimeBodyPart();
		FileDataSource fds = new FileDataSource(filename);
		imgBodyPart.setDataHandler(new DataHandler(fds));
		imgBodyPart.setContentID("uind--woniu--png-001");
		multipart.addBodyPart(imgBodyPart);
	
		//将Mimemultipart对象加入到MimeBodyPart对象中
		contentBodyPart.setContent(multipart);
		return contentBodyPart;
	}
	
	public static 	MimeBodyPart createAttachment(String filename) throws MessagingException{
		//创建保存附件的MimeBodyPart对象,并且加入附件内容和相应的信息
		MimeBodyPart attachmentPart = new MimeBodyPart();
		FileDataSource fds = new FileDataSource(filename);
		attachmentPart.setDataHandler(new DataHandler(fds));
		attachmentPart.setFileName(fds.getName());
		return attachmentPart;
	}

 













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值