`
dream_land
  • 浏览: 22458 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaMail发送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>
就能在邮件中显示图片。

转载:http://javazeke.iteye.com/blog/456837
分享到:
评论

相关推荐

    Spring进阶—如何用Java代码实现邮件发送

    对于更复杂的邮件需求,例如发送带有附件的邮件,可以使用`Multipart`邮件来添加附件,如图片文件。内嵌资源邮件允许将图像或样式表内嵌在邮件正文中,而不是作为附件。在创建`Multipart`邮件时,需注意文本和资源的...

    韩顺平jsp购物网源码(包含javaMail)

    通过这个项目,学习者不仅可以深入理解JSP的使用,还可以掌握如何集成javaMail发送邮件,同时了解一个完整的电商网站是如何运作的。这对于想要提升Web开发技能,特别是JSP和电子邮件服务的开发者来说,是一个非常...

    javaMail,XSLT,正则等琐碎知识

    接着,我们来讨论“XSLT”(可扩展样式表语言转换)。XSLT是一种用于转换XML文档的XML语言。它主要用于将XML数据转换成其他格式,如HTML、PDF或纯文本,以便于展示或打印。XSLT通过匹配模板规则来实现转换,这些规则...

    发邮件所需的jar包下载

    例如,你可以使用Apache Commons Email轻松地添加图片、样式表或者脚本到你的邮件中,使其看起来更加专业和吸引人。 在Tomcat这样的Java应用服务器中使用这些库时,你需要将这些JAR文件放入服务器的`lib`目录下,...

    jsp 邮件客户端

    CKEditor是一种开源的Web富文本编辑器,它可以提供丰富的格式化选项,让用户在发送邮件时可以添加格式化的文本、图片、链接等元素。在本项目中,可能有一个名为"ckeditor"的目录,包含了CKEditor的相关资源文件。 ...

    上传,邮件、excel导入数据库实例

    在实际应用中,你可以通过JavaMail发送带有附件的邮件,甚至实现邮件模板和HTML格式的邮件。为了使用JavaMail,我们需要添加对应的依赖库,并配置SMTP服务器的相关参数。 最后,"poi"是Apache的一个开源项目,专门...

    jsp邮件收发系统源码项目

    【JSP邮件收发系统源码项目】是一个基于Java服务器页面技术(JSP)构建的邮件应用程序,它允许用户收发电子邮件而无需依赖外部数据库或创建特定的数据表。这个项目的特点在于其简洁性和实用性,适合初学者学习和快速...

    java mail邮件和创建excel操作Demo

    这两个Java应用示例展示了如何利用JavaMail发送邮件和使用Apache POI创建Excel文件。在实际项目中,可以根据需求进行扩展,比如添加错误处理、邮件模板、自定义Excel样式等功能。理解并掌握这些基本操作,对于开发...

    模拟邮件收发订阅系统

    数据库设计时,可能需要创建用户表、邮件表、订阅表等,以确保数据的有效管理和查询。 页面HTML引用模板之家的资源,这意味着开发者可能利用了现成的前端模板来快速构建用户界面,提高了开发效率,同时也保证了界面...

    jsp邮箱(文档+源码)

    解压后,我们可以看到项目的目录结构,包括JSP页面、Servlet类、JavaBean、配置文件(如web.xml)、样式表(CSS)、脚本(JavaScript)等。通过分析源码,可以深入学习JSP的编程实践,例如控制流程、数据绑定、JSTL...

    SSM电子邮件系统.rar

    SSM电子邮件系统是一个基于Java技术栈的Web应用项目,它整合了Spring、Spring MVC和MyBatis这三大流行框架,用于实现高效的电子邮件发送功能。在这个项目中,开发者利用了SSM框架的优势,提供了灵活的数据访问、强大...

    [其他类别]MeyboMail Web开源简化版_meybomailweb.zip

    3. **静态资源**:如图片、CSS样式表和JavaScript文件,用于构建用户界面。 4. **库文件**:包含JavaMail API和其他依赖库,如Apache Commons库,用于提供额外的功能支持。 5. **数据库脚本**:创建数据库和初始化...

    登录、注册、找回密码.zip

    在Java中,这可能涉及发送邮件或短信的服务,如使用JavaMail API发送邮件。收到邮件或短信后,用户访问特定URL,通过安全机制(如一次性令牌)来修改密码。这个过程必须严谨,以防止他人冒领或篡改。 压缩包内的...

    emailWeb

    【标题】"emailWeb"可能指的是一个与电子邮件相关的Web应用程序,它可能包含了处理邮件发送、接收、管理等功能的代码和资源。在这个项目中,我们主要关注的是如何在Web环境中实现邮件服务。 【描述】虽然提供的描述...

    吉大15春学期《脚本语言和互动网页设计》在线作业一试卷试卷.pdf

    1. HTML元素:在HTML文档中,`&lt;html&gt;`是文档的根元素,`&lt;body&gt;`表示文档的主体部分,而`&lt;head&gt;`则是包含元数据(如标题、样式表链接等)的部分,`&lt;title&gt;`用于设置页面标题。 2. Servlet生命周期:Servlet的生命...

    TestMail2.zip

    2. **JavaMail API**:在JSP中发送邮件,需要使用JavaMail API,包括`javax.mail`和`javax.mail.internet`包中的类,如`Session`、`Message`、`Transport`等。 3. **SMTP服务器配置**:设置邮件服务器的主机名、端口...

    java编程常见50例

    通过JavaMail,开发者可以实现发送、接收邮件,包括添加附件、设置HTML内容、处理多部分消息等。 4. **异常处理**:Java中的异常处理是程序健壮性的重要保障,使用`try-catch-finally`语句块可以捕获并处理运行时...

    javaweb开发要学习的所有技术和框架总结:.docx

    - **概念**:CSS(Cascading Style Sheets),即层叠样式表,是一种用来表现HTML或XML等文件样式的计算机语言。 - **功能**:CSS允许开发者控制页面布局、颜色、字体等视觉元素,使得内容与表现分离,提高了网页的可...

    (完整)javaweb开发要学习的所有技术和框架总结:,推荐文档.pdf

    - **JavaMail**:提供处理电子邮件的API,用于发送、接收邮件。 学习这些技术需要时间和实践,熟练掌握它们将使你在JavaWeb开发领域具备坚实的基础。同时,了解并熟悉相关开发工具(如IDEA、Eclipse等)和服务器...

Global site tag (gtag.js) - Google Analytics