基于JavaMail的Java邮件发送:复杂邮件发送

基于JavaMail的Java邮件发送:复杂邮件发送本文链接:http://blog.csdn.net/xietansheng/article/details/51722660上一篇文章基于JavaMail的Java邮件发送:简单邮件发送讲解了邮件的基本协议,JavaMail组件,创建并发送一封简单邮件的详细步骤。本文将介绍如何创建并发送一封包含图片和附件的复杂邮件。一封复杂的邮件内容可以看做是由很多节点(或者可以说是“片段”…

大家好,又见面了,我是你们的朋友全栈君。

本文链接: https://blog.csdn.net/xietansheng/article/details/51722660

上一篇文章 基于 JavaMail 的 Java 邮件发送:简单邮件发送 讲解了邮件的基本协议,JavaMail组件,创建并发送一封简单邮件的详细步骤。本文将介绍如何创建并发送一封包含图片和附件的复杂邮件。

一封复杂的邮件内容可以看做是由很多节点(或者可以说是“片段”/“部分”/“零件”)组成,文本、图片、附件等都可以看成是邮件内容中的一个节点。这些节点之间又可以相互关联组合成一个节点。最终组合成一个大节点就是邮件的正文内容。

完整代码演示:

package com.xiets.javamaildemo;

import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message.RecipientType;
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;

/** * 创建并发送一封包含文本、图片、附件的复杂邮件 * * JavaMail 版本: 1.6.0 * JDK 版本: JDK 1.7 以上(必须) * * @author xietansheng */
public class Main { 
   

    // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
    public static String myEmailAccount = "xxxxxxxx@163.com";
    public static String myEmailPassword = "xxxxxxxx";

    // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般格式为: smtp.xxx.com
    // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
    public static String myEmailSMTPHost = "smtp.163.com";

    // 收件人邮箱(替换为自己知道的有效邮箱)
    public static String receiveMailAccount = "xxxxxxxxx@qq.com";

    public static void main(String[] args) throws Exception { 
   
        // 1. 创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties();                    // 参数配置
        props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
        props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
        
        // 开启 SSL 连接, 以及更详细的发送步骤请看上一篇: 基于 JavaMail 的 Java 邮件发送:简单邮件发送

        // 2. 根据配置创建会话对象, 用于和邮件服务器交互
        Session session = Session.getInstance(props);
        session.setDebug(true);                                 // 设置为debug模式, 可以查看详细的发送 log

        // 3. 创建一封邮件
        MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);

        // 也可以保持到本地查看
        // message.writeTo(file_out_put_stream);

        // 4. 根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();

        // 5. 使用 邮箱账号 和 密码 连接邮件服务器
        // 这里认证的邮箱必须与 message 中的发件人邮箱一致,否则报错
        transport.connect(myEmailAccount, myEmailPassword);

        // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());

        // 7. 关闭连接
        transport.close();
    }

    /** * 创建一封复杂邮件(文本+图片+附件) */
    public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception { 
   
        // 1. 创建邮件对象
        MimeMessage message = new MimeMessage(session);

        // 2. From: 发件人
        message.setFrom(new InternetAddress(sendMail, "我的测试邮件_发件人昵称", "UTF-8"));

        // 3. To: 收件人(可以增加多个收件人、抄送、密送)
        message.addRecipient(RecipientType.TO, new InternetAddress(receiveMail, "我的测试邮件_收件人昵称", "UTF-8"));

        // 4. Subject: 邮件主题
        message.setSubject("TEST邮件主题(文本+图片+附件)", "UTF-8");

        /* * 下面是邮件内容的创建: */

        // 5. 创建图片“节点”
        MimeBodyPart image = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("FairyTail.jpg")); // 读取本地文件
        image.setDataHandler(dh);		            // 将图片数据添加到“节点”
        image.setContentID("image_fairy_tail");	    // 为“节点”设置一个唯一编号(在文本“节点”将引用该ID)

        // 6. 创建文本“节点”
        MimeBodyPart text = new MimeBodyPart();
        // 这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
        text.setContent("这是一张图片<br/><img src='cid:image_fairy_tail'/>", "text/html;charset=UTF-8");

        // 7. (文本+图片)设置 文本 和 图片 “节点”的关系(将 文本 和 图片 “节点”合成一个混合“节点”)
        MimeMultipart mm_text_image = new MimeMultipart();
        mm_text_image.addBodyPart(text);
        mm_text_image.addBodyPart(image);
        mm_text_image.setSubType("related");	// 关联关系

        // 8. 将 文本+图片 的混合“节点”封装成一个普通“节点”
        // 最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
        // 上面的 mm_text_image 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
        MimeBodyPart text_image = new MimeBodyPart();
        text_image.setContent(mm_text_image);

        // 9. 创建附件“节点”
        MimeBodyPart attachment = new MimeBodyPart();
        DataHandler dh2 = new DataHandler(new FileDataSource("妖精的尾巴目录.doc"));  // 读取本地文件
        attachment.setDataHandler(dh2);			                                    // 将附件数据添加到“节点”
        attachment.setFileName(MimeUtility.encodeText(dh2.getName()));	            // 设置附件的文件名(需要编码)

        // 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart )
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text_image);
        mm.addBodyPart(attachment);		// 如果有多个附件,可以创建多个多次添加
        mm.setSubType("mixed");			// 混合关系

        // 11. 设置整个邮件的关系(将最终的混合“节点”作为邮件的内容添加到邮件对象)
        message.setContent(mm);

        // 12. 设置发件时间
        message.setSentDate(new Date());

        // 13. 保存上面的所有设置
        message.saveChanges();

        return message;
    }

}

发送后查看收件人的收件箱:
demo.jpg

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146370.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 信息采集技术概述

    信息采集技术概述第一节、信息采集技术概述信息采集技术主要指将外部模拟世界的各种模拟量,通过各种传感元件进行转换后,再经信号调理、采样、编码、传输等操作,最后送到控制器进行信息处理或存储的操作。信息采集所遵循的原则——保证信息采集质量的基本要求(一)准:数据如果不准,这样的采集来的数据对于应用目标和工作需求是完全没有意义的。(二)快(实时):信息从发生到被采集的时间间隔越短越好,因为基本上目标的实现是有时间…

    2022年6月22日
    34
  • 多进程单线程模型与单进程多线程模型之争

    多进程单线程模型与单进程多线程模型之争

    2021年10月10日
    44
  • 【Tensorflow】Windows安装tensorflow错误原因查询、卸载tensorflow与重新安装

    【Tensorflow】Windows安装tensorflow错误原因查询、卸载tensorflow与重新安装Windows安装tensorflow错误原因查询、卸载tensorflow与重新安装深度学习这个大坑的苦与甜,谁踩谁知道。上文介绍了windows如何安装tensorflow点我:Windows(64)位安装tensorflow,但因为一般电脑上会有好几个版本的python,比如我电脑上装了从2.7各版到3.6等等(具体怎么查询电脑的python版本下面会介绍到),所以在安装的时候一定要确认…

    2022年6月22日
    32
  • PB 生成和解析JSON格式数据「建议收藏」

    PB 生成和解析JSON格式数据「建议收藏」一创建用户对象sailjsonforwardglobaltypesailjsonfromnonvisualobjectendtypetypejson_pairfromstructurewithinsailjsonendtypeendforwardtypejson_pairfromstructurestringnameanyvalueendtypeglobal

    2025年8月4日
    6
  • csgo新出的开箱网站_csgo网站开箱推荐

    csgo新出的开箱网站_csgo网站开箱推荐2021csgo开箱网站有哪些?2021最新收集的CSGO国内网页开箱子网站大全!##以下国内知名CSGO开箱网站大全官网直达链接优惠码/推广码网站状态incsgocsgogo直接取回skinsdogcsgogo直接取回npskinscsgogo直接取回fateskinscsgo直接取回box818csgo直接取回piggycasecsgogo可取回yskins暂无可取回88steamcsgo可取回c

    2022年10月5日
    3
  • 八皇后问题详解(四种解法)

    八皇后问题详解(四种解法)如果你去百度百科八皇后这个问题,你会发现人家也是历史上有头有脸的一个问题,最后一句“计算机发明后就有一万种方式解决这个问题”读起来也让程序猿们很快活。闲话少说,开始阐述我的思路:最无脑的解法一定是八个for遍历,浪费了太多的计算资源在各种无用功上面,我们稍微构思一下:首先如何决定下一个皇后能不能放这里可以有两种思路,第一种是尝试维护一个8*8的二维矩阵,每次找到一个空位放下一个皇后就把对应行列对

    2022年6月30日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号