前面两篇博客都只是最基本的邮件最简单的邮件发送了,在实际的电子邮件中我们一般都会涉及到更加复杂电子邮件结构,例如有附件、邮件正文里面包含图片、包含歌曲等等,在这个时候我们就必须要对邮件的结构有着很清晰的认识。在进行复合邮件开发之前需要对复合邮件的结构有一定的了解。
复合邮件的整体结构
上面这幅图片展示了一封复合邮件的整体结构,我们可以看出一封复杂的电子邮件由多个部分组成。它有一个头部和正文,但是正文并不是像以前那么简单了,而是由几个部分组成。头部需要起到一个指示的作用,它需要说明正文需要使用什么样的分隔符来分开,正文几个部分之间使用什么样的组合关系。对于上面电子邮件它由三个部分组成,每一部分都有自己头和体,第一部分也由两个部分组成。
复合邮件的组合关系
正文部分之间有多种组合关系。组合关系如下图:
alternative:选择关系。上面的纯文本和超文本之间就是一种选择关系。
related:关联关系。假如上面的超文本正文是展示一幅图片,那么我们在发送邮件的时候必须要将这幅图片包含到邮件中,也就是所谓的内嵌资源,这个内嵌资源是给超文本用的。所以他们两者之间是一个关联关系。
mixed:混合关系。在纯文本、超文本和内嵌资源组成一个整体和,他们与附件并列着,两者之间就是一个混合关系了。
复合邮件组织结构的API
MimeMessage类表示整封电子邮件。
MimeBodyPart类表示邮件的一个MiME消息。
MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。
下面一个实例:该邮件里面包含两个附件、正文部分包括纯文本和超文本,超文本表示展示一张图片。源代码如下:
- public class JavaMail_03 {
- public static void main(String[] args) throws Exception {
- Properties props = new Properties();
- props.setProperty("mail.smtp.auth", "true");
- props.setProperty("mail.transport.protocol", "smtp");
- props.setProperty("mail.host", "smtp.163.com");
- Session session = Session.getInstance(props,
- new Authenticator(){
- protected PasswordAuthentication getPasswordAuthentication(){
- return new PasswordAuthentication("*****","******");
- }
- });
- Message message = new MimeMessage(session);
- message.setSubject("第三个JavaMail测试程序");
- message.setFrom(new InternetAddress("\""+MimeUtility.encodeText("陈明")+"\"<chenssy995812509@163.com>"));
- message.setRecipients(RecipientType.TO, new Address[]{new InternetAddress("995812509@qq.com")});
- //邮件正文
- MimeMultipart multipart = new MimeMultipart("mixed");
- message.setContent(multipart);
- /*
- * 创建邮件的内容
- * 包括一个邮件正文和两个附件
- */
- MimeBodyPart content = new MimeBodyPart(); //邮件内容
- MimeBodyPart attch1 = new MimeBodyPart(); //附件1
- MimeBodyPart attch2 = new MimeBodyPart(); //附件2
- //将邮件内容添加到multipart中
- multipart.addBodyPart(content);
- multipart.addBodyPart(attch1);
- multipart.addBodyPart(attch2);
- //设置附件1
- DataSource ds1 = new FileDataSource("G:\\电子书\\oracle口令.txt");
- DataHandler dh1 = new DataHandler(ds1);
- attch1.setDataHandler(dh1);
- attch1.setFileName("oracle.txt");
- //设置附件2
- DataSource ds2 = new FileDataSource("G:\\电子书\\账号.txt");
- DataHandler dh2 = new DataHandler(ds2);
- attch2.setDataHandler(dh2);
- attch2.setFileName(MimeUtility.encodeText("账号.txt"));
- /*
- * 设置内容(正文)---是一个复杂体
- * 包括HTML正文和显示一张图片
- */
- MimeMultipart bodyMultipart = new MimeMultipart("related");
- content.setContent(bodyMultipart);
- //构造正文
- MimeBodyPart htmlBody = new MimeBodyPart();
- MimeBodyPart gifBody = new MimeBodyPart();
- bodyMultipart.addBodyPart(htmlBody);
- bodyMultipart.addBodyPart(gifBody);
- //设置图片
- DataSource gifds = new FileDataSource("F:\\图片\\图片\\4.jpg");
- DataHandler gifdh = new DataHandler(gifds);
- gifBody.setDataHandler(gifdh);
- gifBody.setHeader("Content-ID", "<"+gifds.getName()+">");
- //gifBody.setHeader("Content-Location", "http://www.itcast.cn/logo.gif");
- //设置HTML正文
- htmlBody.setContent("<span style='color:red;font-size:16px'>这是我的第三个JavaMail测试哦!包括了附件和图片,有点儿复杂...</span><br>" +
- "显示的图片<img src='cid:4.jpg'/>", "text/html;charset=UTF-8");
- message.saveChanges(); //生成邮件
- Transport.send(message);
- }
- }
public class JavaMail_03 { public static void main(String[] args) throws Exception { Properties props = new Properties(); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.transport.protocol", "smtp"); props.setProperty("mail.host", "smtp.163.com"); Session session = Session.getInstance(props, new Authenticator(){ protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication("*****","******"); } }); Message message = new MimeMessage(session); message.setSubject("第三个JavaMail测试程序"); message.setFrom(new InternetAddress("\""+MimeUtility.encodeText("陈明")+"\"<chenssy995812509@163.com>")); message.setRecipients(RecipientType.TO, new Address[]{new InternetAddress("995812509@qq.com")}); //邮件正文 MimeMultipart multipart = new MimeMultipart("mixed"); message.setContent(multipart); /* * 创建邮件的内容 * 包括一个邮件正文和两个附件 */ MimeBodyPart content = new MimeBodyPart(); //邮件内容 MimeBodyPart attch1 = new MimeBodyPart(); //附件1 MimeBodyPart attch2 = new MimeBodyPart(); //附件2 //将邮件内容添加到multipart中 multipart.addBodyPart(content); multipart.addBodyPart(attch1); multipart.addBodyPart(attch2); //设置附件1 DataSource ds1 = new FileDataSource("G:\\电子书\\oracle口令.txt"); DataHandler dh1 = new DataHandler(ds1); attch1.setDataHandler(dh1); attch1.setFileName("oracle.txt"); //设置附件2 DataSource ds2 = new FileDataSource("G:\\电子书\\账号.txt"); DataHandler dh2 = new DataHandler(ds2); attch2.setDataHandler(dh2); attch2.setFileName(MimeUtility.encodeText("账号.txt")); /* * 设置内容(正文)---是一个复杂体 * 包括HTML正文和显示一张图片 */ MimeMultipart bodyMultipart = new MimeMultipart("related"); content.setContent(bodyMultipart); //构造正文 MimeBodyPart htmlBody = new MimeBodyPart(); MimeBodyPart gifBody = new MimeBodyPart(); bodyMultipart.addBodyPart(htmlBody); bodyMultipart.addBodyPart(gifBody); //设置图片 DataSource gifds = new FileDataSource("F:\\图片\\图片\\4.jpg"); DataHandler gifdh = new DataHandler(gifds); gifBody.setDataHandler(gifdh); gifBody.setHeader("Content-ID", "<"+gifds.getName()+">"); //gifBody.setHeader("Content-Location", "http://www.itcast.cn/logo.gif"); //设置HTML正文 htmlBody.setContent("<span style='color:red;font-size:16px'>这是我的第三个JavaMail测试哦!包括了附件和图片,有点儿复杂...</span><br>" + "显示的图片<img src='cid:4.jpg'/>", "text/html;charset=UTF-8"); message.saveChanges(); //生成邮件 Transport.send(message); } }