代码之家  ›  专栏  ›  技术社区  ›  Nuno Furtado

使用字节[]和Java Mail发送电子邮件附件

  •  4
  • Nuno Furtado  · 技术社区  · 16 年前

    不幸的是,我找不到如何将其作为字节数组附加,我的解决方案使用的是磁盘文件(我不需要磁盘文件,因为我不想编写字节数组只是为了附加它)。

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

    有人知道更好的解决方案吗?

    2 回复  |  直到 16 年前
        1
  •  17
  •   erickson    10 年前

    创建一个 DataSource ByteArrayDataSource 来自JavaMail。

        2
  •  1
  •   Ashok Patel    14 年前

    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());