Java程序中使用JavaMail发送带图片和附件的邮件_java

我们常常在邮件中添加附件,以达到传输较大文件的目的。而上一篇文章只是将本机的一张图片内嵌到邮件的 HTML 格式的正文当中,这样的邮件显得不够丰富多彩。我们想要一封正文部分图文并茂,而游客附带若干附件的邮件。
下面是代码结构中3个重要的方法:

  1. MimeBodyPart createAttachment(String fileName) 方法用于创建附件并返回;
  2. MimeBodyPart createContent(String body, String fileName) 方法用于创建正文部分并返回;
  3. MimeMessage createMessage(Session session) 方法用于调用上面的两个方法生成邮件。

其实,创建一个内含附件的邮件与上一篇文章中创建正文中包含图片的邮件的原理,甚至代码都几乎相同。也就是使用 JAF 框架中的 FileDataSource 类和 DataHandler 类来获得给定路径的资源文件,JAF 框架中的这两个类共同协作可以获知文件所属的 MIME 类型,它们会正确地添加到邮件组织结构中的对应消息头中。

不同的是:
在 HTML 格式的正文中内含图片是使用 MimeBody.setContentID() 方法设置对应的资源文件的唯一标识符,即 MIME 协议对于邮件的结构组织格式中的 Content-ID 头字段;
而在 MIME 邮件中添加附件是使用 MimeBodyPart.setFileName() 方法来关联 FileSourceData 对象指向的资源文件。
程序代码:
这个不同点在下面代码中会用橙色背景强调指出,代码如下:

import java.io.FileOutputStream;
import java.util.Properties; 

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart; 

/**
 * 创建内含附件、图文并茂的邮件
 * @author haolloyin
 */
public class WithAttachmentMessage { 

  /**
   * 根据传入的文件路径创建附件并返回
   */
  public MimeBodyPart createAttachment(String fileName) throws Exception {
    MimeBodyPart attachmentPart = new MimeBodyPart();
    FileDataSource fds = new FileDataSource(fileName);
    attachmentPart.setDataHandler(new DataHandler(fds));
    attachmentPart.setFileName(fds.getName());
    return attachmentPart;
  } 

  /**
   * 根据传入的邮件正文body和文件路径创建图文并茂的正文部分
   */
  public MimeBodyPart createContent(String body, String fileName)
      throws Exception {
    // 用于保存最终正文部分
    MimeBodyPart contentBody = new MimeBodyPart();
    // 用于组合文本和图片,"related"型的MimeMultipart对象
    MimeMultipart contentMulti = new MimeMultipart("related"); 

    // 正文的文本部分
    MimeBodyPart textBody = new MimeBodyPart();
    textBody.setContent(body, "text/html;charset=gbk");
    contentMulti.addBodyPart(textBody); 

    // 正文的图片部分
    MimeBodyPart jpgBody = new MimeBodyPart();
    FileDataSource fds = new FileDataSource(fileName);
    jpgBody.setDataHandler(new DataHandler(fds));
    jpgBody.setContentID("logo_jpg");
    contentMulti.addBodyPart(jpgBody); 

    // 将上面"related"型的 MimeMultipart 对象作为邮件的正文
    contentBody.setContent(contentMulti);
    return contentBody;
  } 

  /**
   * 根据传入的 Seesion 对象创建混合型的 MIME消息
   */
  public MimeMessage createMessage(Session session) throws Exception {
    String from = test_hao@163.com;
    String to = "test_hao@sina.cn";
    String subject = "创建内含附件、图文并茂的邮件!";
    String body = "<h4>内含附件、图文并茂的邮件测试!!!</h4> </br>"
        + "<a href = http://haolloyin.blog.51cto.com/> 蚂蚁</a></br>"
        + "<img src = \"cid:logo_jpg\"></a>"; 

    MimeMessage msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress(from));
    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
    msg.setSubject(subject); 

    // 创建邮件的各个 MimeBodyPart 部分
    MimeBodyPart attachment01 = createAttachment("F:\\java\\Snake.java");
    MimeBodyPart attachment02 = createAttachment("F:\\java\\meng.mp3");
    MimeBodyPart content = createContent(body, "F:\\java\\logo.jpg"); 

    // 将邮件中各个部分组合到一个"mixed"型的 MimeMultipart 对象
    MimeMultipart allPart = new MimeMultipart("mixed");
    allPart.addBodyPart(attachment01);
    allPart.addBodyPart(attachment02);
    allPart.addBodyPart(content); 

    // 将上面混合型的 MimeMultipart 对象作为邮件内容并保存
    msg.setContent(allPart);
    msg.saveChanges();
    return msg;
  } 

  // 测试生成邮件
  public static void main(String[] args) throws Exception {
    WithAttachmentMessage mail = new WithAttachmentMessage();
    Session session = Session.getDefaultInstance(new Properties());
    MimeMessage message = mail.createMessage(session);
    message.writeTo(new FileOutputStream("withAttachmentMail.eml"));
  }
}

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

看看上面用 Outlook 打开生成的文件,在附件栏里面就有一个 .java 源文件和一首 MP3 文件了。
打开邮件的原始内容:
查看生成的邮件的原始内容,点击“文件”、“属性”、“邮件来源”或者使用 EditPlus 、UltraEdit 等文本编辑器直接打开也行,下面是原始内容:

From: test_hao@163.com
To: test_hao@sina.cn
Message-ID: <56667.2.1279677956578.JavaMail.Administrator@WWW-1477FF1578B>
Subject: =?GBK?B?tLS9qMTauqy4vbz+oaLNvM7EsqLDr7XE08q8/qOh?=
MIME-Version: 1.0
Content-Type: multipart/mixed;
  boundary="----=_Part_1_13249998.1279677956546" 

------=_Part_1_13249998.1279677956546
Content-Type: application/octet-stream; name=Snake.java
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=Snake.java 

// 省略被 BASE64 转码后的 Snake.java 附件内容 

------=_Part_1_13249998.1279677956546
Content-Type: application/octet-stream; name=meng.mp3
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=meng.mp3 

// 省略被 BASE64 转码后的 meng.java 附件内容 

------=_Part_1_13249998.1279677956546
Content-Type: multipart/related;
  boundary="----=_Part_0_3373112.1279677956546" 

------=_Part_0_3373112.1279677956546
Content-Type: text/html;charset=gbk
Content-Transfer-Encoding: quoted-printable 

<h4>=C4=DA=BA=AC=B8=BD=BC=FE=A1=A2=CD=BC=CE=C4=B2=A2=C3=AF=B5=C4=D3=CA=BC=
=FE=B2=E2=CA=D4=A3=A1=A3=A1=A3=A1</h4> </br><a href =3D http://haolloyin.bl=
og.51cto.com/> =C2=EC=D2=CF</a></br><img src =3D "cid:logo_jpg"></a>
------=_Part_0_3373112.1279677956546
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: logo_jpg 

// 省略被 BASE64 转码后的邮件正文部分内嵌的 .jpg 图片的内容 

------=_Part_0_3373112.1279677956546-- 

------=_Part_1_13249998.1279677956546--

重要部分已经用背景颜色指出来了,有兴趣的可以深入了解一下 MIME 协议对邮件结构组织的规范格式。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
附件
javamail发送邮件附件、mail发送邮件 附件bin、javamail发送附件、javamail发送多个附件、javamail读取邮件附件,以便于您获取更多的相关知识。

时间: 2024-10-24 22:47:57

Java程序中使用JavaMail发送带图片和附件的邮件_java的相关文章

解析Java程序中对象内存的分配和控制的基本方法_java

一.对象与内存控制的知识点 1.java变量的初始化过程,包括局部变量,成员变量(实例变量和类变量). 2.继承关系中,当使用的对象引用变量编译时类型和运行时类型不同时,访问该对象的属性和方法是有区别的. 3.final修饰符特性. 二.java变量的划分与初始化过程 java程序的变量大体可以分为成员变量和局部变量,成员变量可以分为实例变量(非静态变量)和类变量(静态变量),一般我们遇到的局部变量会在下列几种情况中出现: (1)形参:在方法签名中定义的局部变量,由调用方为其赋值,随着方法结束消

java中javamail发送带附件的邮件实现方法_java

本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输,JavaMail是可选包,因此如果需要使用的话你需要首先从java官网上下载.目前最新版本是JavaMail1.5.0,下面我们来看看javamail发送带附件的邮件实例 mail.java 代码: 复制代码 代码如下: package mail;

基础-java 程序中如何获取所有类 或者带注解的类

问题描述 java 程序中如何获取所有类 或者带注解的类 最近写了一个使用注解的mvc的spring框架,这个框架的基础就是要读取到工程中的带有注解的类. 我的实现方法是将工程中的目录全部读取匹配得到.class后缀的所有路径的list,再用class.forname加载对应的类并且将注解读取判断是否为定义的注解.然后使用一个map装起来,在用到的时候拿出来.但是问题来了,我将项目打包jar之后程序是不能够读取到文件的.也就是说获取不到类的全路径如:cn.com.smq.Test 这样的字符串.

在Java程序中运行外部类文件

程序 在Java程序中运行外部类文件 一.引言无论是用传统的编程语言(C++.VB等)还是Java语言编程,都经常需要在一个运行的程序中执行另外一个独立的外部程序.例如用Java设计一个IDE程序,那么这个IDE程序就必需能够调式.运行其它独立的外部Java程序.况且直接运行已经存在的外部程序来实现本程序的某些特定的功能,也是提高程序开发效率的一种重要手段.Java2为实现在一个Java程序中运行外部类文件(即Java程序)提供了的两种解决方案,即在同一进程中运行外部类文件和在不同进程中运行外部

Java发送带html标签内容的邮件实例代码_java

如下所示: package test; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; import javax.mail.Session; import javax.mail.MessagingException; import javax.mail.Transport; public class

Java 程序中的多线程

程序|多线程 在Java程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持.本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观.读完本文以后,用户应该能够编写简单的多线程程序. 为什么会排队等待? 下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 - 打印机.磁盘.数据库和显示屏 -- 由于硬件和软件的限制都有内在的潜伏时间,所以每项任务都包含

java程序中双重检查锁定与延迟初始化

在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化.此时程序员可能会采用延迟初始化.但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题.比如,下面是非线程安全的延迟初始化对象的示例代码: public class UnsafeLazyInitialization { private static Instance instance; public static Instance getInstance() { if (instanc

教你怎样在java程序中引入neo4j数据库

随着关系型数据库在某些方面的力不从心,了解当下流行的各种数据库模式的特点和性能,无疑会给我们提供更多的选择和方向. neo4j是一种图形数据库,在遍历和关联查询方面具有突出的优势.废话少说,深入了解neo4j之前,先让我们尝试一下怎样在程序中使用neo4j. neo4j采用java语言开发,如果我们要在java程序中以内嵌方式使用neo4j,只需导入neo4j的对应包即可. 首先,我们来创建一个maven项目并修改pom.xml添加对neo4j的依赖. <?xml version="1.0

Java程序中的配置文件的存放和读取

大家可能经常会遇到在Java程序中存取程序配置文件的需求,比如,为了能够 和不同的数据库连接,我们经常把数据库连接的信息存放到属性文件中,这些信 息一般包括数据库驱动程序类名.数据库连接的URL,数据库的用户名和口令等等 .为了便于程序的安装或部署,我们经常会把这些的配置文件存放到程序安装的 根目录中.由于Java程序用包来分组类,有时候将这些配置文件放入到读取它们 的类所在的包目录中会更好一些.比如,在下面的图示中,将数据库配置文件 database.properties放到数据库读取类所在的