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

    技术2022-05-19  23

    创建邮件—— 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); // 发送邮件            } }

    最新回复(0)