`
phoenix007
  • 浏览: 436226 次
  • 性别: 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>
就能在邮件中显示图片。

 

转自:http://blog.csdn.net/zhousen/

分享到:
评论

相关推荐

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

    在IT领域,特别是Java开发中,使用Java Mail API发送带有图片的HTML格式邮件是一项常见且实用的功能。本文将深入解析如何利用Java Mail实现这一需求,包括必要的知识点、代码示例及其实现细节。 ### 一、Java Mail ...

    JAVA 发送HTML格式并带图片的邮件实例

    在Java编程中,发送带有HTML格式和图片的邮件是一项常见的任务,这通常涉及到电子邮件API的使用,例如JavaMail API。以下是对这个主题的详细讲解: 首先,JavaMail API是Java平台上的一个开源库,用于处理电子邮件...

    用java mail发送包含图片的html

    标题中的“用Java Mail发送包含图片的HTML”指的是使用JavaMail API来发送带有嵌入式图像的HTML格式电子邮件。在电子邮件中,除了纯文本内容,我们有时需要包含图像以提高信息的可读性和视觉吸引力。JavaMail API是...

    java 发送附件mail

    总结一下,Java发送带有附件的邮件涉及到JavaMail API的使用,包括配置SMTP服务器、创建邮件对象、添加内容和附件,以及发送邮件等步骤。理解这些步骤和相关类的作用是实现此功能的关键。在处理不同类型的邮件时,...

    java发送邮件,可带图片

    在Java编程中,发送带有图片和样式的电子邮件是一项常见的任务,尤其对于自动化通知、报告或者营销活动来说。本文将详细讲解如何使用Java实现这个功能,主要涉及JavaMail API的使用和MIME(多用途互联网邮件扩展)...

    使用 java mail 发送邮件

    总之,Java Mail API为开发者提供了丰富的功能,能够实现复杂的邮件操作,如发送带有附件的邮件、设置HTML格式的邮件内容、处理邮件服务器的身份验证等。在Android开发中,通过正确配置和使用Java Mail,可以实现...

    Java发送带模版的邮件示例

    在Java编程中,发送带有模板的邮件是一项常见的任务,尤其对于企业级应用来说,通过电子邮件进行通知、报告或客户服务是必不可少的。JavaMail API提供了一种标准的方式来处理邮件的发送,而结合模板技术,我们可以...

    JAVA MAIL发送邮件带附件和图片

    在Java编程中,发送带有附件和图片的电子邮件是一项常见的任务,尤其在自动化通知、报告分发等场景下。本文将详细讲解如何使用Java Mail API来实现这一功能,同时参考提供的`TemplateMailMessage.java`和`...

    java实现邮件发送(三种发送方式都有)

    `普通邮件发送演示.java`应该展示了如何使用JavaMail API发送简单的文本邮件。JavaMail API是Java中用于处理电子邮件的标准库,包括了发送邮件、接收邮件等功能。要发送普通邮件,你需要设置SMTP服务器地址、端口、...

    基于Java的邮件发送模板

    在实际应用中,我们可能需要发送带有HTML格式的邮件或者包含附件。这时,可以使用`MimeBodyPart`和`MimeMultipart`来构造复杂的邮件内容: ```java MimeBodyPart textPart = new MimeBodyPart(); textPart....

    java发送邮件相关jar包

    在Spring中,`JavaMailSender`接口是发送邮件的核心接口,它定义了发送简单邮件、带有附件的邮件等方法。`AbstractJavaMailSender`和`JavaMailSenderImpl`类提供了具体的实现。配置邮件服务时,我们需要在Spring的...

    java mail 邮件发送

    在Java应用中实现邮件发送功能,Java Mail 提供了全面的支持,包括发送文本邮件、HTML邮件以及带有附件的邮件。 ### 基本概念 1. **Mail Server Host**:邮件服务器的主机名或IP地址,如 `smtp.gmail.com` 或 `...

    java 邮件发送 可带附件

    Java邮件发送功能是Java开发中常见的一项...通过以上步骤和代码,你可以实现使用Java发送带有附件的邮件。不过,实际开发中,你可能还需要考虑其他因素,如使用模板引擎生成邮件内容、批量发送邮件、错误重试策略等。

    利用Java并配置Foxmail发送邮箱(携带附件)

    本教程将深入探讨如何使用Java来配置Foxmail发送带有附件的邮件。首先,我们需要理解Java Mail API,它是Java中用于处理邮件的核心库。 Java Mail API提供了处理邮件的所有必要工具,包括创建、读取、发送和管理...

    java mail发送邮件(源代码+注释)

    本教程将详细介绍如何使用Java Mail API发送邮件,并提供带有注释的源代码供参考。 首先,你需要在项目中引入Java Mail的相关依赖。通常,这可以通过Maven或Gradle来完成。如果你使用Maven,可以在pom.xml文件中...

    java发邮件 带附件 多媒体邮件

    根据提供的文件信息,本文将详细解释如何使用Java发送带有附件及多媒体内容(如图片)的电子邮件。本示例代码及说明适用于希望利用Java Mail API发送包含丰富格式内容邮件的开发者。 ### Java 发送带有附件及多媒体...

    写java程序实现发邮件功能

    本篇文章将深入探讨如何使用Java编写程序来实现邮件的发送,包括发送纯文本邮件、带有附件的邮件、包含图片的邮件以及在邮件中显示图片。 首先,我们得知道JavaMail API是实现邮件发送功能的关键库。它提供了一系列...

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

    总结,使用Spring Mail发送带有附件的HTML邮件是一项常见的任务,特别是当需要支持多个账号时,需要精心设计和配置。通过理解Spring Mail的工作原理和JavaMail API,开发者可以有效地实现代理邮件发送,并确保邮件的...

    java一键发送邮件,封装好的工具类

    5. **添加附件**:发送带有附件的邮件也是常见需求,`EasyEmailUtil`应该提供一个方法来添加多个附件,例如文件路径或输入流,然后在邮件中一起发送。 6. **错误处理**:为了提高健壮性,工具类通常会包含异常处理...

    java email邮件发送所需mail相关jar包

    例如,`InternetAddress`用于处理电子邮件地址,`MimeMessage`扩展了`Message`,支持MIME标准,可以发送带有多种格式(如HTML、文本、图片等)的邮件;`MimeBodyPart`和`MimeMultipart`则用于创建多部分消息,支持...

Global site tag (gtag.js) - Google Analytics