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

本文详细介绍了如何使用JavaMail API实现MIME格式邮件的发送,包括创建MimeMessage对象、设置邮件主体、添加附件及发送过程。通过示例代码展示了如何创建纯文本邮件、HTML格式邮件以及包含图片的邮件。
摘要由CSDN通过智能技术生成
第二讲:使用JavaMail表示MIME消息
一、基本原理
    javax.mail.Message是一个抽象类,需要使用其子类javax.mail.MimeMessage来创建Message类的实例对象。如果要是仅仅创建包含文本内容的简单邮件只需要使用过MimeMessage类即可。但是要是创建的邮件中内嵌有资源(如图片,超链接,html)或多个附件,则需要同时使用JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等类。
  • MimeMessage:表示整封邮件
  • MimeBodyPart:表示邮件的一个MIME消息
  • MimeMultipart:表示一个由多个MIME消息组合成的组合MIME消息
三者之间的关系如图所示:

图1:MIME消息类间的关系(取自《JavaMail开发详解》)
    1. 对于复杂的邮件不能简单是使用setText方法生成文本信息,而是要使用一个MimeMultipart对象表示并通过MimeMessage.setContent(Multipart mp)方法设置到MimeMessage对象中。
    2. MimeMultipart对象用来组合多个MIME消息,其中的每个MIME消息分别用一个MimeBodyPart对象表示并通过MimeMultipart.addBodyPart(BodyPart bp)方法加入到MimeMultipart对象中。
    3. 如果MimeBodyPart对象表示的MIME消息又是一个MIME组合消息,那么它的内容又需要使用一个MimeMultipart对象来表示,并通过MimeBodyPart.setContent(MimeMultipart mp)方法设置到MimeBodyPart对象中。同代表整个邮件的MimeMultipart对象一样,这个MimeMultipart对象中的每一组成单元也分别有一个MimeBodyPart对象表示。

下面给出MIME各个类之间的关系图:

图2:JavaMail中定义的MIME类之间的关系
javax.mail.internet.InternetAddress类用于表示电子邮件的地址,邮件中的发件人和收件人地址都是用这个对象表示。
Message.RecipientType表示收件人的类型。它是Message类中的一个静态内部类。
  •        有三个常量:TO(表示主要收件人)、CC(邮件的抄送接收者)、BCC(邮件的暗送接收者)
MimeMessage中的函数:
MimeMessage(Session)
MimeMessage(Session, InputStream)                                                                                                                                                                                                    
Session中包含一系列的键值对,用于设置邮件发送前的信息设置如"mail.smtp.host"表示服务器的主机名。ImputStream 表示邮件的内容将从输入流对象中获取。
setFrom()
setFrom(Address)
第一个中的地址将由Session中的"mail.user"属性设置,Address是抽象类通过InternetAddress类实例化
setRecipient(Message.RecipientType, Address) 
setRecipients(Message.RecipientType, Address[])                                                   
设置接收邮件的用户或一组用户,并且可以指定接收用户的类型TO、CC、BCC
addRecipient(Message.RecipientType, Address) 
addRecipients(Message.RecipientType, Address[]) 
增加一个或一组收件人的地址
setSendData(java.util.Date data)设置邮件发送的日期
setSubject(java.lang.String)
setSubject(String subject, String charset)
设置邮件主题并且指定字符集,当MIME使用BASE64或 Quote-Printable编码是需要指定字符集
addHeader(String name, String value)
setHeader(String name, String value)
设置消息头字段的名称和消息头字段的值
setContent(Object obj, String type)
setContent(Multipart mp)
设置MimeMessage对象的邮件体
setText(java.lang.String)设置邮件的简单的纯文本内容
setFlags(Flags.Flag flag, boolean set )用于设置有的已读标记、删除标记等
saveChanges()更新并保存MimeMesssage中的  数据,通常是在发送MimeMessage对象封装的消息前调用此函数
writeTo(OutputStream os)

把MimeMessage对象中数据输出到一个RFC822格式的输出流中。第二个参数用于指定输出时应该忽略哪些字段。
writeTo(OutputStream os, String[] ignoreList) 
  
  
  
  

例一:使用MimeMessage创建存文本邮件
		String from = "lucas@sina.com";
		String to = "sacul@sohu.com";
		String subject = "This is a test!!";
		
		
		Properties props = new Properties();
		Session session = Session.getInstance(props );
		
		Message mailMessage =new MimeMessage(session);
		mailMessage.setFrom(new InternetAddress(from));
		mailMessage.setRecipient(RecipientType.TO, new InternetAddress(to));
		
		mailMessage.setSubject(subject);
		mailMessage.setText("hello, world!");
		mailMessage.setSentDate(new Date());
		mailMessage.writeTo(new FileOutputStream("D:\\test.eml"));
例二:创建HTML格式的邮件
要使用MimeMessage函数中setContent(Object obj, String type)来指定邮件正文的String对象MIME类型为"text/html"
下面的例子中在邮件的这个文中插入一个网络图片
	String from = "lucas@sina.com";
		String to= "sacul@163.com, chidlk@gmai.com";
		String body = "<h4>欢迎大家阅读邮件</h4>" + 
		"<img src= \"http://c.hiphotos.baidu.com/news/pic/item/a08b87d6277f9e2f11f6d7951d30e924b999f368.jpg\">";
		
		String subject = "Test";
		
		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());
		
		//设置HTML格式的邮件正文
		msg.setContent(body	, "text/html;charset=gb2312");
		msg.saveChanges();
		
		msg.writeTo(new FileOutputStream("d:\\test.eml"));
		



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值