在上一篇文章Java邮件开发(二):使用JMail发送一封图文并茂且包含附件的邮件(上) 中,我们大概了解了一封邮件的组成。
下面我们完成发送有以下要求的邮件:
1.正文是一段html代码
2.这段html代码中内嵌一张图片
3.这封邮件包含两个附件
首先根据上篇文章最后的“邮件组织结构API”,分析以下有哪些MimeMultipart对象,有哪些MimeBodyPart对象。
1.有一个MimeMultipart对象msgPart,表示整封邮件的消息体,且消息体的multipart类型为mixed(有附件)。
2.msgPart应该有三个MimeBodyPart对象,分别为body(表示正文),attach1(表示附件1),attach2(表示附件2)
3.有一个MimeMultipart对象contentPart,表示正文的消息体且消息体的multipart类型为related(有图片内嵌资源)。而contentPart对象和body对象有关联
4..contentPart应该有两个MimeBodyPart对象,分别为content(表示正文的html代码),img(表示内嵌资源图片)
分析清楚MimeMultipart对象和MimeBodyPart对象以及他们之间的关系,代码写起来就很轻松了。
代码如下:
package com.zyh.demo; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.Message.RecipientType; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.util.ByteArrayDataSource; /** * 创建一个复杂的邮件,这个邮件包括一段正文和两个附件 * 其中正文要包含一张图片 * @author Administrator * */ public class Demo3 { public static void main(String[] args) throws Exception { Properties props = new Properties(); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.transport.protocol", "smtp"); Session session = Session.getInstance(props); session.setDebug(true); Message msg = new MimeMessage(session); /*邮件消息头设置*/ msg.setFrom(new InternetAddress("zyh5540@sohu.com")); msg.setRecipients(RecipientType.TO, InternetAddress.parse("zyh5540@sohu.com,554077931@qq.com,zyh5540@163.com,zyh5540@sina.com")); msg.setSubject("From sohu 这是一封复杂邮件"); /*邮件消息内容设置,包括两个附件和一段正文*/ Multipart msgPart = new MimeMultipart("mixed"); msg.setContent(msgPart); MimeBodyPart body = new MimeBodyPart(); //表示正文 MimeBodyPart attach1 = new MimeBodyPart(); //表示附件1 MimeBodyPart attach2 = new MimeBodyPart(); //表示附件2 msgPart.addBodyPart(body); msgPart.addBodyPart(attach1); msgPart.addBodyPart(attach2); /*以下为设置正文*/ /*正文是文字和图片混合的*/ Multipart contentPart = new MimeMultipart("related"); body.setContent(contentPart); MimeBodyPart content = new MimeBodyPart(); //文字 MimeBodyPart img = new MimeBodyPart(); //图片 contentPart.addBodyPart(content); contentPart.addBodyPart(img); ByteArrayDataSource fileds = new ByteArrayDataSource(new FileInputStream("D:\\picture\\jpg\\touxiang.jpg"),"application/octet-stream"); DataHandler imgDataHandler = new DataHandler(fileds); // DataSource imgds = new FileDataSource("D:\\picture\\jpg\\touxiang.jpg"); // DataHandler imgDataHandler = new DataHandler(imgds); img.setDataHandler(imgDataHandler); //注意:Content-ID的属性值一定要加上<>,不能是touxiang.jpg img.setHeader("Content-ID", "<touxiang.jpg>"); //为图片设置文件名,有的邮箱会把html内嵌的图片也当成附件 img.setFileName("touxianga.jpg"); //设置文字内容 /** * 注意:在html代码中要想显示刚才的touxiang.jpg * src里不能直接写Content-ID的值,要用cid:这种方式 */ content.setContent("<div style=‘color:red;font-size:18px;‘>从sohu发来的邮件</div>:我这里有一张图片<img src=‘cid:touxiang.jpg‘ alt=‘touxiang‘ width=\"100px\" height=‘100px‘ />,好看吗?", "text/html;charset=utf-8"); /*正文内容设置结束*/ /*下面为设置附件*/ attach1.setDataHandler(new DataHandler(new FileDataSource("E:\\others\\firefox.txt"))); attach1.setFileName("file1.txt"); attach2.setDataHandler(new DataHandler(new FileDataSource("E:\\others\\java.txt"))); attach2.setFileName("file2.txt"); msg.saveChanges(); //把邮件以文件的形式写入到磁盘 OutputStream os = new FileOutputStream("E:\\others\\demo.eml"); msg.writeTo(os); os.close(); Transport trans = session.getTransport(); trans.connect("smtp.sohu.com", 25, "zyh5540", "test"); trans.sendMessage(msg,msg.getAllRecipients()); } }
附:
1.JavaMail开发jar包下载地址:http://download.csdn.net/download/zyh5540/6900667
2.参考代码下载地址:http://download.csdn.net/download/zyh5540/6907731Java邮件开发(二):使用JMail发送一封图文并茂且包含附件的邮件(下)
原文:http://blog.csdn.net/zyh5540/article/details/19018363