用Java Mail发送带有图片附件的html格式邮件
2008-02-23 10:09:49来源:互联网 阅读 ()
用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)};
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Eclipse的几个插件
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash