`

JavaMail_发送邮件_使用MIME协议创建内含图片的复杂邮件(转)

 
阅读更多

像上一篇文章那样,我们只能创建一封封只包含纯文本或者HTML格式的文本邮件,这远远不能满足我们现在的需要,我们经常想要把本机上的图片、相片包含在邮件的正文部分,或者是直接将自己制作的贺卡等作为邮件正文发送给我们的朋友。

想要在邮件中包含图片、音频、视频等其他格式的文件,就不能再简单地使用 RFC 文档来对邮件结构、内容进行描述了,因为 RFC 只能描述普通的文本,而且一旦遇到单独一行的句号“.”时,SMTP 服务器就会以此为邮件正文部分的结束符,因此很大可能会导致邮件信息的丢失。

关于MIME:

引入 MIME (Multipurpose Internet Mail Extension ,多功能 Internet 邮件扩展)协议来满足我们上面的需求。使用了 MIME 协议描述的邮件可称为 MIME 邮件,一个 MIME 邮件可由若干个 符合 MIME 格式描述的消息组成。而一个消息既可以表示邮件中一个基本的 MIME 资源文件(例如纯文本、音频、视频等),又可以表示若干个此类基本资源文件组合而成的大的 MIME 消息的组合体。

一个 MIME 消息分为消息头和消息体,消息头包含对于消息体的描述,消息体则包含资源文件的具体内容。

JavaMail 中使用MIME:

在 JavaMail 中,一个 MIME 邮件用一个 MimeMessage 对象表示,仔细看下图:

其中标了红色圈圈的则是 MIME 消息的资源类型。

BodyPart 相当于上述的 MIME 基本消息;

MultiPart 相当于由多个 BodyPart (基本消息)组合而成的较大的 MIME 消息组合体;

Message 则相当于一封 MIME 邮件;

withPictureMail01  在上图中,我们看到 BodyPart 还可以再包含 MultiPart ,很明显这是一种组合结构、模式,或者说成树状结构。

注:下面的类都是抽象类,其实它们之下就有 MimeMessage 类、MimeMultiPart 类、MimeBodyPart 类一一对应,如下图:

JavaMail01

 

好了,用代码来说明问题,实现一下,不管是否合适,我还是在代码中写上较多注释,其中有一些事必须注意的,代码如下:

  1. /**  
  2.  * 创建内含图片的邮件,保存为 Outlook 的 ".eml" 文件  
  3.  * @author haolloyin  
  4.  */ 
  5. public class WithPictureMessage {  
  6.     public static void main(String[] args) throws Exception{  
  7.  
  8.         String from = "test_hao@sina.cn";  
  9.         String to = "test_hao@163.com";  
  10.         String subject = "创建一个内含图片的邮件!";  
  11.         String body = "<h4>内含图片的邮件测试!!!</h4> " +  
  12.         "<a href = http://haolloyin.blog.51cto.com/> 蚂蚁</a></br></br>" +   
  13.         "<a href = http://haolloyin.blog.51cto.com/>" +  
  14.         "<img src = \"cid:haolloyin_logo_jpg\"></a>";  
  15.         /*  
  16.          *  上面的 cid 是指 MIME 协议中的 Content-ID 头,它是  
  17.          *  对于文件资源的唯一标识符,下面的 setContentID()方法  
  18.          *  中传入的 ID 号就必须与这个haolloyin_logo_jpg相一致  
  19.          */ 
  20.           
  21.         // 创建该邮件应用程序所需的环境信息以及会话信息  
  22.         Session session = Session.getDefaultInstance(new Properties());  
  23.           
  24.         // 以下几句是设置邮件的基本信息  
  25.         MimeMessage msg = new MimeMessage(session);       
  26.         msg.setFrom(new InternetAddress(from));       
  27.         msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));  
  28.         msg.setSubject(subject);  
  29.         msg.setSentDate(new Date());  
  30.           
  31.         /*  
  32.          *  创建一个子类型为 “related” 的 MIME 消息组合对象,  
  33.          *  其实 MimeMultipart 类还有另外两种子类型,请自行  
  34.          *  查阅并比较其中的适用场景  
  35.          */ 
  36.         MimeMultipart multipart = new MimeMultipart("related");  
  37.           
  38.         /*  
  39.          * 创建一个表示 HTML 正文部分的 MimeBodyPart 对象,   
  40.          * 并加入 到上一语句创建的 MimeMultiPart 对象中,  
  41.          * 由于 HTML 正文中包含中文,故下面应该指定字符集为 gbk 或 gb2312  
  42.          */ 
  43.         MimeBodyPart htmlBodyPart = new MimeBodyPart();  
  44.         htmlBodyPart.setContent(body, "text/html;charset=gbk");  
  45.         multipart.addBodyPart(htmlBodyPart);  
  46.           
  47.         /*  
  48.          *  创建一个表示图片文件的 MimeBodyPart 对象,  
  49.          *  并加入 到上面所创建的 MimeMultiPart 对象中,  
  50.          *  使用 JAF 框架中的 FileDataSource 类获取图片文件源,  
  51.          *  它能够自动获知文件的 MIME 格式并设置好消息头  
  52.          */ 
  53.         MimeBodyPart jpgBodyPart = new MimeBodyPart();  
  54.         FileDataSource fds = new FileDataSource("F:\\java\\haolloyin_logo.jpg");  
  55.         jpgBodyPart.setDataHandler(new DataHandler(fds));  
  56.         jpgBodyPart.setContentID("haolloyin_logo_jpg");  
  57.           
  58.         multipart.addBodyPart(jpgBodyPart);  
  59.           
  60.         /*  
  61.          *  这里不用再设置字符集了,因为上面的 HTML MimeBodyPart 对象中  
  62.          *  已经设置了,而图片文件的因为使用了 DataSource 对象,即 JAF 框架  
  63.          *  中的具体数据处理操作类,能够自动判断获知数据的 MIME 类型  
  64.          */ 
  65.         msg.setContent(multipart);  
  66.           
  67.         // 保存对邮件的修改并写入文件中  
  68.         msg.saveChanges();        
  69.         msg.writeTo(new FileOutputStream("withPictureMail.eml"));  
  70.     }  

编译、运行,生成 withPictureMail.eml 文件,双击打开,如下图:

withPictureMail02

 

image

在代码中的许多注释是比较重要的,必须要注意。此外,还可像上一篇文章中在 Outlook 中查看该 MIME 邮件的原始内容,其中应该既有 quoted-printable 编码也有 BASE64 编码方式,有兴趣的还可以看看各个消息头的格式是怎样的。

小结:

1、明白当 MIME 邮件需要附上多种格式(不仅仅是纯文本)的资源文件时,它是运用了层层嵌套的组合结构来表示、组织各个资源文件的;

2、在代码中的许多注释就是很重要的注意点了,必须掌握。

我的相关文章:

组合模式(Composite)的安全模式与透明模式

管道过滤器模式(Pipe and Filter)与组合模式(修改)

JavaMail入门:创建纯文本、HTML格式的邮件

本文出自 “蚂蚁” 博客,请务必保留此出处http://haolloyin.blog.51cto.com/1177454/353957

分享到:
评论

相关推荐

    geronimo-javamail_1.4_spec-1.7.1.jar

    geronimo-javamail_1.4_spec-1.7.1.jar

    JavaMail邮件收发实例_JavaMail_API

    JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API

    JavaMail_API,JavaMail_API简介,JavaMail

    综上所述,JavaMail API 为开发者提供了一个强大的工具箱,不仅能够轻松处理邮件的发送和接收,还能支持多种邮件协议。无论是构建简单的邮件应用还是复杂的邮件管理系统,JavaMail API 都是值得考虑的选择。

    邮件发送系统主体源程序.rar_javamail_邮件系统 linux

    例如,使用MimeMessage类可以创建包含文本、图片、文件附件等复杂结构的邮件;使用Multipart类可以组合多种内容类型。 在“邮件发送系统主体源程序”中,我们可以期待看到如何设置Session,创建并填充Message,以及...

    JavaMail+JAF+JavaMail_API+JavaMail_API详解

    JavaMail 是一个开源的Java库,它为Java程序员提供了处理电子邮件的...通过学习和使用这些资源,开发者可以熟练掌握如何使用JavaMail和JAF来实现复杂的邮件操作,例如发送带附件的邮件、处理邮件事件、读取IMAP邮箱等。

    geronimo-javamail_1.4_spec-1.6.jar

    不知道谁有这个jar的源码或者文档啊,希望能够分享一下:QQ:562387140

    hyl.rar_javamail_javamail jsp_mail

    `javamail_jsp`则表明了如何在JSP页面中使用JavaMail。JSP是一种基于Java的服务器端脚本语言,用于生成动态网页内容。将JavaMail与JSP结合,可以让用户在网页上直接发送或接收邮件,例如,创建一个简单的web邮件系统...

    JavaMail发送邮件的例子

    JavaMail是一种在Java环境中发送和接收电子邮件的标准API,它提供了丰富的功能来处理复杂的邮件操作。在Struts2框架中集成JavaMail服务,可以方便地在Web应用中实现邮件的发送功能。下面我们将深入探讨JavaMail的...

    javamail-1_3_3_01邮件发送组件

    除了基本的文本邮件,JavaMail还支持HTML邮件、附件、多部分消息(如同时包含文本和图片)以及使用MIME标准的复杂邮件结构。例如,通过`Multipart`对象可以添加多个内容部分,包括文本、图片、音频或任何其他类型的...

    javamail_test_QQmail

    通过JavaMail,开发者可以轻松地实现SMTP(简单邮件传输协议)集成,从而发送邮件,或者使用IMAP(因特网消息访问协议)或POP3(邮局协议)接收邮件。 在JavaMail中,发送邮件主要涉及以下几个关键组件: 1. **...

    MIME-java.rar_java mime_javamime_mime_mime java_邮件 解析

    在IT行业中,MIME(Multipurpose Internet Mail Extensions)是一种标准,它扩展了早期的电子邮件系统,使得能够发送和接收不仅仅是纯文本格式的邮件,还包括图片、音频、视频等各种类型的二进制数据。Java中的MIME...

    JavaMail_API基本原理

    总的来说,JavaMail API 是一个强大的工具,可以帮助开发者构建复杂的邮件处理应用,但理解邮件协议的基础知识对于有效利用API至关重要。通过掌握这些概念,开发者可以创建出适应各种邮件服务和用户需求的应用程序。

    javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码

    在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将详细探讨这些问题的原因及相应的解决方案。 ##...

    geronimo-javamail_1.4_provider-1.3.jar

    geronimo-javamail_1.4_provider-1.3.jar

    使用JavaMail创建邮件和发送邮件

    在JavaMail中,创建和发送邮件涉及到对邮件标准的理解,如RFC882和MIME协议。 RFC882 是一个早期的定义电子邮件格式的文档,规定了邮件的基本结构,包括邮件头和邮件体。邮件头包含了诸如发件人(from)、收件人...

    JavaMail发送邮件(文本、html、附件)

    - JavaMail API提供了一系列接口和类,允许开发者通过SMTP(Simple Mail Transfer Protocol)协议发送邮件。 - 主要涉及的接口和类包括:`Session`(邮件会话)、`Message`(邮件对象)、`Transport`(传输服务)...

    java_mail.rar_ javamail_java mail_java 下载_javamail-1.4.1_javamai

    JavaMail 支持多种邮件协议,包括 SMTP(Simple Mail Transfer Protocol)用于发送邮件,POP3(Post Office Protocol version 3)和 IMAP(Internet Message Access Protocol)用于接收邮件。此外,它还支持 MIME...

    使用JAVAMail代发邮件

    使用 JavaMail 库可以轻松地在 Java 应用程序中发送电子邮件。JavaMail 是一个 Java API,用于在 Java 应用程序中发送和接收电子邮件。它提供了一个抽象层,允许开发者使用不同的电子邮件协议,例如 SMTP、POP3 和 ...

    bbx_data.rar_java mail_javamail_mail_实用 java

    5. **javamail_mail 实用性** - 支持HTML格式的邮件内容,可以创建丰富的展示效果。 - 支持S/MIME(安全多用途互联网邮件扩展)和PGP(Pretty Good Privacy)加密,保障邮件安全。 - 可以处理邮件中的嵌入式图像...

    javaMail实现发送邮件的demo

    本示例将介绍如何使用 JavaMail 实现发送邮件的功能。 首先,我们需要导入 JavaMail 相关的库。在 Maven 项目中,可以在 `pom.xml` 文件中添加以下依赖: ```xml &lt;groupId&gt;com.sun.mail&lt;/groupId&gt; &lt;artifactId&gt;...

Global site tag (gtag.js) - Google Analytics