使用带有Javamail的byte []发送电子邮件附件

时间:2009-11-26 17:30:26

标签: java email

我有一个字节数组,我希望将其添加为我发送的电子邮件的附件。

不幸的是我无法找到如何将其作为字节数组附加,我已经使用磁盘文件的解决方案(我不想要,因为我不想写字节数组,所以我可以附加它)。

我找到了一个解决方案,涉及创建一个扩展DataSource的对象,并将其用作字节数组的包装器,然后将其提供给MimeBodyPart。

任何人都知道更好的解决方案吗?

2 个答案:

答案 0 :(得分:17)

创建DataSource是正确的方法。但是,您不必自己编写。只需使用JavaMail中的ByteArrayDataSource

答案 1 :(得分:1)

以下是您的要求的代码...将附件文件存储为DB中的BLOB并获取将其作为邮件中的附件发送...............

import java.io.*; 
import java.util.*; 
import javax.activation.*; 

public class BufferedDataSource implements DataSource { 

private byte[] _data; 
private java.lang.String _name; 

public BufferedDataSource(byte[] data, String name) { 
_data = data; 
_name = name;
} 

public String getContentType() { return "application/octet-stream";} 
public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(_data);} 
public String getName() { return _name;} 

/** 
* Returns an OutputStream from the DataSource 
* @returns OutputStream Array of bytes converted into an OutputStream 
*/ 
public OutputStream getOutputStream() throws IOException { 
OutputStream out = new ByteArrayOutputStream(); 
out.write(_data); 
return out;
}
}
===========================================================
//Getting ByteArray From BLOB
byte[] bytearray; 
BLOB blob = ((OracleResultSet) rs).getBLOB("IMAGE_GIF"); 
if (blob != null) { 
BufferedInputStream bis = new BufferedInputStream(blob.getBinaryStream()); 
ByteArrayOutputStream bao = new ByteArrayOutputStream(); 
byte[] buffer = new byte[4096]; 
int length = 0; 
while ((length = bis.read(buffer)) != -1) { 
bao.write(buffer, 0, length);
} 
bao.close(); 
bis.close(); 
bytearray = bao.toByteArray(); 
}
===============================================================
//Attach File for mail
MimeBodyPart att = new MimeBodyPart(); 
BufferedDataSource bds = new BufferedDataSource(bytearray, "AttName"); 
att.setDataHandler(new DataHandler(bds)); 
att.setFileName(bds.getName());