`
hebenben
  • 浏览: 34611 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

用java mail发送带有图片的html格式的邮件

阅读更多
用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

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

    Spring Boot整合邮件发送并保存历史发送邮箱

    3、Spring Boot 发送邮件(文本格式的邮件、发送HTML格式的邮件、发送带附件 的邮件、发送带静态资源的邮件) 个人觉得Springboot的开发简单的归纳为三步jar包引入,配置,应用。 (一)简单使用 1)JSP的使用...

    基于Maven的javax.mail发送邮件例子程序

    基于Maven的javax.mail发送邮件例子程序 pom.xml添加依赖jar: &lt;groupId&gt;javax.mail &lt;artifactId&gt;mail ${javamail.version} &lt;/dependency&gt; &lt;javamail.version&gt;1.4.1 /* 功能:加入了参考文章中没有...

    java 发送带模板的邮件工具类

    1、实测,代码是可运行的! 2、根据html模板,替换其中的内容 实现定制化发送邮件。 3、内附readme.txt,有详细说明。

    JAVA邮件发送例子

    发送带有附件的邮件可以调用 sendMultiPartEmail(); 3.发送HTML的邮件可以调用 sendHtmlEmail(); &lt;br&gt; 4.以上三种邮件发送方式都可以调用 sendEmail(); 但在调用前必需要实例化 EMailBean.java 对象

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

    NULL 博文链接:https://wisdombrave.iteye.com/blog/546508

    java源码包---java 源码 大量 实例

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包4

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包3

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    carmailer:向多个收件人发送邮件的Java程序

    在命令行上提供以下内容: SMTP认证参数:服务器域名、端口、用户名、密码包含电子邮件地址列表的文件课程带有 HTML 或纯文本格式的邮件正文的文件用于配置内容类型、字符集和发送行为的可选参数。 看用法。 然后该...

    java源码包2

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JavaMail(5种不同的javamail)

    5种不同的javamail 1.无验证发送的Text格式Mail 2.有验证发送普通Text格式的mail 3.有验证方式 使用自定义的验证类,发送TEXT格式的Mail 4.发送带附件的mail测试Servlet 5.发送HTML格式的Mail

    SpringBoot整合邮箱JavaMail

    SpringBoot整合JavaMail功能,使用的是Spring自带的发送邮件功能,本Demo以qq邮箱为服务器做的测试,完成了纯文本发送、html发送、嵌入图片、带有附件等的封装,如有不足欢迎交流

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,...

Global site tag (gtag.js) - Google Analytics