java代码生成的带图片和附件的邮件发送实例

创建邮件—— MIME 协议
MIME 协议是对RFC822 文档的升级和补充,它描述了如何生成一封复杂邮件。通常我们把MIME 协议描述的邮件称之为 MIME 邮件 MIME 协议描述的数据称之为 MIME 消息
对于一封复杂邮件,如果包含了多个不同的数据,MIME 协议规定了要使用分隔线对多段数据进行分隔,并使用 Content-Type 头字段 对数据的类型、以及多个数据之间的关系进行描述。(
 
         Content-type :字段
     数据类型 
         主类型/ 子类型的形式出现,主类型有text image audio video application message 等,分别表示文本、图片、音频、视频、应用程序、组合结构、消息等。每个主类型下面都有多个子类型,例如text 主类型包含plain html xml css 等子类型。
     数据的关系
         multipart/mixed multipart/related multipart/alternative
         Content-Disposition 头字段
     Content-Disposition 头字段用于指定邮件阅读程序处理数据内容的方式,有inline attachment 两种标准方式,inline 表示直接处理,而attachment 表示当作附件处理。如果将Content-Disposition 设置为attachment ,在其后还可以指定filename 属性,如下所示:
   
Content-Disposition: attachment; filename=“1.bmp”
上面的MIME 头字段表示MIME 消息体的内容为邮件附件,附件名“1.bmp”
         Content-ID 头字段
     Content-ID 头字段用于为“multipart/related” 组合消息中的内嵌资源指定一个唯一标识号,在HTML 格式的正文中可以使用这个唯一标识号来引用该内嵌资源。例如,假设将一个表示内嵌图片的MIME 消息的Content-ID 头字段设置为如下形式:
    Content-ID: it315logo_gif
那么,在HTML 正文中就需要使用如下HTML 语句来引用该图片资源:
    <img src="cid:it315logo_gif">
注意,在引用Content-ID 头字段标识的内嵌资源时,要在资源的唯一标识号前面加上“cid:” ,以说明要采用唯一标识号对资源进行引用。
 
Message 类是创建和解析邮件的核心API ,它的实例对象代表一封电子邮件。
Session 类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session 对象根据这些信息构建用于邮件收发的Transport Store 对象,以及为客户端创建Message 对象时提供信息支持。
 
 
  带一个附件和一个图片的关系原理如上图所示 : 首先把正文和图片以 MimeMultipart 中 related 的关系相联,然后把他们这个整体存入 MimeBodyPart 中当作正文再次和附件以 MimeMultipart 中 mixed 的关系相联.
 
下面是一个可运行的实例:
 
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
public class AttchAndImgMail {
    //JavaMail 需要 Properties 来创建一个 session 对象。它将寻找字符串 "mail.smtp.host" ,属性值就是发送邮件的主机 .
    public static void main(String[] args) throws Exception{
        Properties properties = new Properties(); 
        properties.put( "mail.smtp.host" , "smtp.qq.com" ); // 设置 smtp 主机
        properties.put( "mail.smtp.auth" , "true" ); // 使用 smtp 身份验证
         /*
     * 在 JavaMail 中,可以通过 extends Authenticator 抽象类,在子类中覆盖父类中的 getPasswordAuthentication()
     * 方法,就可以实现以不同的方式来进行登录邮箱时的用户身份认证。JavaMail 中的这种设计是使用了策略模式(Strategy
     * */ 
       MimeMessage message = new MimeMessage(Session.getInstance(properties, new Authenticator() {
              public PasswordAuthentication getPasswordAuthentication() {
                  return new PasswordAuthentication( " 发件人的 QQ 邮箱的帐号 " , " 发件人的 QQ 邮箱密码 " );
                 }
               }));
        //设置邮件的属性
       //设置邮件的发件人
       message. setFrom ( new InternetAddress( " 收件人的邮箱 " ));
        //设置邮件的收件人   cc表示抄送   bcc 表示暗送
       message. setRecipient ( Message.RecipientType.TO , new InternetAddress( " 收件人邮箱 " ));
       //设置邮件的主题
       message. setSubject ( " 世界上最复杂的邮件有附件和图片 " );       
        //创建邮件的正文
       MimeBodyPart text = new MimeBodyPart();
       // setContent(“ 邮件的正文内容 ”,” 设置邮件内容的编码方式 ”)
       text. setContent ( " 世界上最复杂的邮件 <img src='cid:a'>" , "text/html;charset=gb2312" );
       // 创建图片
       MimeBodyPart img = new MimeBodyPart();
       /*JavaMail API 不限制信息只为文本 , 任何形式的信息都可能作茧自缚 MimeMessage 的一部分 .
        * 除了文本信息 , 作为文件附件包含在电子邮件信息的一部分是很普遍的 .
        * JavaMail API 通过使用 DataHandler 对象 , 提供一个允许我们包含非文本 BodyPart 对象的简便方法 .*/
       DataHandler dh = new DataHandler( new FileDataSource( "src// .jpg" ));
       img.setDataHandler(dh);
       // 创建图片的一个表示用于显示在邮件中显示
       img.setContentID( "a" );
      
       // 创建附件
       MimeBodyPart attch = new MimeBodyPart();
       DataHandler dh1 = new DataHandler( new FileDataSource( "src// 大海 .mp3" ));
       attch.setDataHandler(dh1);
       String filename1 = dh1.getName();
        // MimeUtility 是一个工具类, encodeText ()用于处理附件字,防止中文乱码问题
       attch.setFileName( MimeUtility . encodeText (filename1));
       // 关系    正文和图片的
       MimeMultipart mm = new MimeMultipart();
       mm.addBodyPart(text);
       mm.addBodyPart(img);
       mm.setSubType( "related" ); // 设置正文与图片之间的关系
       // 图班与正文的 body
       MimeBodyPart all = new MimeBodyPart();
       all.setContent(mm);
       // 附件与正文( text img )的关系
       MimeMultipart mm2 = new MimeMultipart();
       mm2.addBodyPart(all);
       mm2.addBodyPart(attch);
       mm2.setSubType( "mixed" ); // 设置正文与附件之间的关系
      
       message.setContent(mm2);
       message.saveChanges(); // 保存修改
       Transport.send(message); // 发送邮件
      
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值