`

用Java Mail发送带有图片附件的html格式邮件

    博客分类:
  • java
阅读更多
用Java Mail发送带有图片的html格式的邮件,针对于显示图片,一般有两种方法。

1. 图片存在于服务器上,我们只需要把图片在服务器的的链接放进去即可。
这种发式比较简单,但是这种方法有些缺陷:
图片不支持离线浏览;
每次浏览邮件需要访问web服务,增加服务器负担;
若图片以二进制的方式存在于数据库或是动态生成的,则无法有效的解决。

2. 把图片以附件的方式发送出去,这种方式非常适用于图片存在于数据库中的情况。
本文也主要讨论这种情况。

对于Java Mail的基础知识,请看http://www.yesky.com/SoftChannel/72348977504190464/20020713/1620276.shtml,
本文不作介绍了。

说到邮件中的附件,我不得不说一说MiniMultipart类,提供了在邮件中加入附加的实现方法。
一个多部分邮件是一个内容类型(content-type)被设置为MiniMultipart的Message对象。
MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象。
我们可以用一个MimeBodyPart包含html源代码,其他的MimeBodyPart包含二进制的图片附件。

但是这里有个意外情况,我们先看MimeBodyPart的初始化代码:

MimeBodyPart mdp = new MimeBodyPart(); //新建一个存放附件的BodyPart
DataHandler dh = new DataHandler(...);
mdp.setDataHandler(dh); //给BodyPart对象设置内容为dh
其中当DataHandler初始化时需要DataSource的子类

/** from JDK Doc */
public DataHandler(DataSource ds)
Create a DataHandler instance referencing the specified DataSource.
The data exists in a byte stream form. The DataSource will provide an InputStream to access the data.
Parameters:ds - the DataSource

在JDK1.4中,DataSource是个Interface,DataSource仅有MimePartDataSource, URLDataSource, FileDataSource三个子类,
而在这三个类中没有一个能直接用二进制流(byte[])创建实例。当然我们可以把内存中的二进制流写到文件中,再让FileDataSource读进来。
但是这样会给服务器带来而外的硬盘读写,若操作频繁,会造成服务器性能下降。幸运的是我再网上发现了这么一个类,可以直接用二进制流直接创建实例。

import java.io.*;
import javax.activation.*;
public class ByteArrayDataSource implements DataSource
{
/*** Data to write. */
private byte[] _data;
/*** Content-Type. */
private String _type;

/* Create a datasource from an input stream */
public ByteArrayDataSource(InputStream is,String type)
{
_type = type;
try
{
ByteArrayOutputStream os = new ByteArrayOutputStream();
int ch;

// XXX : must be made more efficient by
// doing buffered reads, rather than one byte reads
while ((ch = is.read()) != -1)
os.write(ch);
_data = os.toByteArray();
}
catch (IOException ioe)
{
}
}
/* Create a datasource from a byte array */
public ByteArrayDataSource(byte[] data,String type)
{
_data = data;
_type = type;
}
/* Create a datasource from a String */
public ByteArrayDataSource(String data,String type)
{
try
{
// Assumption that the string contains only ascii
// characters ! Else just pass in a charset into this
// constructor and use it in getBytes()
_data = data.getBytes("iso-8859-1");
}
catch (UnsupportedEncodingException uee)
{
}
_type = type;
}
public InputStream getInputStream()
throws IOException
{
if (_data == null)
throw new IOException("no data");
return new ByteArrayInputStream(_data);
}
public OutputStream getOutputStream()
throws IOException
{
throw new IOException("cannot do this");
}
public String getContentType()
{
return _type;
}
public String getName()
{
return "dummy";
}
}

有了上面ByteArrayDataSource类,我们就可以发送图片附件的邮件了。
{
String smtpHost = ...;
String to = ...;
String from = ...;
String name = ...;
String password = ...;
String subject = ...;
StringBuffer content = ...; // 邮件的html源代码
LinkedList attachList = ...; // 附件的list,它的element都是byte[],即图片的二进制流

Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props, null);

MimeMessage message;
InternetAddress[] address = {new InternetAddress(to)};

message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO, address);
message.setSubject(subject);
message.setSentDate(new Date());
// 新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)
MimeMultipart mm = new MimeMultipart();
// 新建一个存放信件内容的BodyPart对象
BodyPart mdp = new MimeBodyPart();
// 给BodyPart对象设置内容和格式/编码方式
mdp.setContent(content.toString(), "text/html;charset=GBK");
// 这句很重要,千万不要忘了
mm.setSubType("related");

mm.addBodyPart(mdp);

// add the attachments
for( int i=0; i<attachList.size(); i++)
{
// 新建一个存放附件的BodyPart
mdp = new MimeBodyPart();
DataHandler dh = new DataHandler(new ByteArrayDataSource((byte[])attachList.get(i),"application/octet-stream"));
mdp.setDataHandler(dh);
// 加上这句将作为附件发送,否则将作为信件的文本内容
mdp.setFileName(new Integer(i).toString() + ".jpg");
mdp.setHeader("Content-ID", "IMG" + new Integer(i).toString());
// 将含有附件的BodyPart加入到MimeMultipart对象中
mm.addBodyPart(mdp);
}
// 把mm作为消息对象的内容
message.setContent(mm);

message.saveChanges();
javax.mail.Transport transport = session.getTransport("smtp");
transport.connect(smtpHost, name, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}

在上述代码中需注意的是这句代码:
mdp.setHeader("Content-ID", "IMG" + new Integer(i).toString());
它描述了附件图片的相对路径,
当i=1时,代码就是mdp.setHeader("Content-ID", "IMG1");

我们的html源代码中,也就是上述的content中,需包含
<td align='center' valign='middle'>
<div align="center">
<a href="http://www.test.com" target="_blank" >
<img src="cid:IMG1" width="60" height="45" border="0">
</a>
</div>
</td>
就能在邮件中显示图片。
分享到:
评论

相关推荐

    用Java Mail发送带有图片的html格式的邮件.txt

    在IT领域,特别是Java开发中,使用Java Mail API发送带有图片的HTML格式邮件是一项常见且实用的功能。本文将深入解析如何利用Java Mail实现这一需求,包括必要的知识点、代码示例及其实现细节。 ### 一、Java Mail ...

    JAVA 发送HTML格式并带图片的邮件实例

    在Java编程中,发送带有HTML格式和图片的邮件是一项常见的任务,这通常涉及到电子邮件API的使用,例如JavaMail API。以下是对这个主题的详细讲解: 首先,JavaMail API是Java平台上的一个开源库,用于处理电子邮件...

    java 发送附件mail

    总结一下,Java发送带有附件的邮件涉及到JavaMail API的使用,包括配置SMTP服务器、创建邮件对象、添加内容和附件,以及发送邮件等步骤。理解这些步骤和相关类的作用是实现此功能的关键。在处理不同类型的邮件时,...

    JAVA MAIL发送邮件带附件和图片

    在Java编程中,发送带有附件和图片的电子邮件是一项常见的任务,尤其在自动化通知、报告分发等场景下。本文将详细讲解如何使用Java Mail API来实现这一功能,同时参考提供的`TemplateMailMessage.java`和`...

    java实现发送带有附件的邮件

    在Java编程语言中,发送带有附件的邮件是一个常见的任务,特别是在企业级应用或者自动化脚本中。这个场景通常涉及到SMTP(Simple Mail Transfer Protocol)服务,JavaMail API以及MIME(Multipurpose Internet Mail ...

    java 邮件发送 可带附件

    在Java中,我们可以使用JavaMail API来实现邮件的发送,包括带有附件的功能。以下是对这个主题的详细解释: 一、JavaMail API简介 JavaMail API是一个开源的Java库,用于处理邮件服务。它提供了丰富的接口和类,...

    java 发邮件带excel附件,以流的形式发送附件,不生成excel文件

    在Java编程中,发送带有Excel附件的电子邮件是一项常见的任务,特别是在数据报告或自动化流程中。在某些场景下,我们可能希望直接以流的形式处理Excel数据,而不是先将其保存为一个实际的文件,然后再作为附件发送。...

    用java mail发送包含图片的html

    标题中的“用Java Mail发送包含图片的HTML”指的是使用JavaMail API来发送带有嵌入式图像的HTML格式电子邮件。在电子邮件中,除了纯文本内容,我们有时需要包含图像以提高信息的可读性和视觉吸引力。JavaMail API是...

    java发邮件 带附件 多媒体邮件

    根据提供的文件信息,本文将详细解释如何使用Java发送带有附件及多媒体内容(如图片)的电子邮件。本示例代码及说明适用于希望利用Java Mail API发送包含丰富格式内容邮件的开发者。 ### Java 发送带有附件及多媒体...

    Java实现发送邮件内容+附件

    以上就是使用Java实现发送带有内容和附件的邮件的基本过程。在实际项目中,你可能需要根据具体需求进行更复杂的定制,例如处理HTML格式的正文、添加抄送和密送收件人、设置邮件头信息等。在提供的压缩包文件“发送...

    JavaMail(3)——发送带附件的邮件.docx

    在JavaMail中,发送带有附件的邮件涉及到对MIME(Multipurpose Internet Mail Extensions)标准的理解和使用。MIME扩展了邮件协议,允许在邮件中包含多媒体内容,如图片、文档、音频或视频文件等。 在JavaMail中,`...

    利用Java发送邮件(含附件)的例子

    在Java编程中,发送带有附件的邮件是一项常见的任务,尤其对于自动化报告或者系统通知非常有用。以下是如何利用Java实现这一功能的详细步骤和关键知识点: 首先,你需要配置邮件发送的相关属性,这通常通过一个...

    java发送邮件,可带图片

    在Java编程中,发送带有图片和样式的电子邮件是一项常见的任务,尤其对于自动化通知、报告或者营销活动来说。本文将详细讲解如何使用Java实现这个功能,主要涉及JavaMail API的使用和MIME(多用途互联网邮件扩展)...

    java mail 发送邮件

    在Java应用程序中,我们通常使用JavaMail API来实现邮件的自动化操作,比如发送带有附件的邮件、群发邮件等。下面将详细介绍如何使用Java Mail进行邮件发送,并结合提供的文件名称,提供相关的代码实例。 首先,要...

    Java发送带模版的邮件示例

    在Java编程中,发送带有模板的邮件是一项常见的任务,尤其对于企业级应用来说,通过电子邮件进行通知、报告或客户服务是必不可少的。JavaMail API提供了一种标准的方式来处理邮件的发送,而结合模板技术,我们可以...

    使用 java mail 发送邮件

    总之,Java Mail API为开发者提供了丰富的功能,能够实现复杂的邮件操作,如发送带有附件的邮件、设置HTML格式的邮件内容、处理邮件服务器的身份验证等。在Android开发中,通过正确配置和使用Java Mail,可以实现...

    Spring mail 使用多个账号发送带有附件的HTML邮件

    总结,使用Spring Mail发送带有附件的HTML邮件是一项常见的任务,特别是当需要支持多个账号时,需要精心设计和配置。通过理解Spring Mail的工作原理和JavaMail API,开发者可以有效地实现代理邮件发送,并确保邮件的...

    利用Java并配置Foxmail发送邮箱(携带附件)

    本教程将深入探讨如何使用Java来配置Foxmail发送带有附件的邮件。首先,我们需要理解Java Mail API,它是Java中用于处理邮件的核心库。 Java Mail API提供了处理邮件的所有必要工具,包括创建、读取、发送和管理...

    SpringBoot中整合Mail实现发送带附件的邮件示例代码

    本文将详细介绍如何在Spring Boot项目中配置和使用JavaMailSender来发送带有附件的邮件。 首先,我们需要在项目的`pom.xml`或`build.gradle`文件中添加对`spring-boot-starter-mail`的依赖。对于Maven用户,可以在`...

    java实现邮件发送(三种发送方式都有)

    总的来说,通过学习这些资源,开发者可以熟练掌握在Java环境中使用SMTP协议发送不同类型的邮件,包括纯文本、带附件以及包含HTML内容的邮件。这不仅可以提高工作效率,也有助于提升软件的用户体验。

Global site tag (gtag.js) - Google Analytics