广告位联系
返回顶部
分享到

JavaMail实现带附件的邮件发送的方法

java 来源:互联网 作者:秩名 发布时间:2022-08-11 14:54:47 人浏览
摘要

发送纯文本的邮件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 package com.haiwen.test; import java.util.Date; import java.util.Proper

发送纯文本的邮件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

package com.haiwen.test;

  

import java.util.Date;

import java.util.Properties;

  

import javax.mail.Message.RecipientType;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

  

import org.junit.Test;

  

public class MessageDemo1 {

  

    @Test

    public void testSend() throws Exception {

  

        // 0. 邮件参数

        Properties prop = new Properties();

        prop.put("mail.transport.protocol", "smtp"); // 协议

        prop.put("mail.smtp.host", "smtp.163.com"); // 主机

        // prop.put("mail.smtp.port", 25); // 端口

        prop.put("mail.smtp.auth", "true"); // 用户密码认证

        prop.put("mail.debug", "true"); // 调试模式

  

        // 1. 创建一个邮件的会话

        Session session = Session.getDefaultInstance(prop);

        // 2. 创建邮件体对象 (整封邮件对象)

        MimeMessage message = new MimeMessage(session);

        // 3. 设置邮件体参数:

        // 3.1 标题

        message.setSubject("我的第一封邮件");

        // 3.2 邮件发送时间

        message.setSentDate(new Date());

        // 3.3 发件人

        message.setSender(new InternetAddress("xxx@163.com"));

        // 3.4 接收人

        message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com"));

        // 3.5内容

        message.setText("你好,已经发送成功!  正文...."); // 简单纯文本邮件

        message.saveChanges(); // 保存邮件(可选)

  

        // 4. 发送

        Transport trans = session.getTransport();

        trans.connect("xxx@163.com", "xxx");

        // 发送邮件

        trans.sendMessage(message, message.getAllRecipients());

        trans.close();

    }

}

MIME组合关系

  • multipart/mixed类型

如果一封邮件中含有附件,那邮件的Content-Type域中必须定义multipart/mixed类型,邮件通过multipart/mixed类型中定义的boundary标识将附件内容同邮件其它内容分成不同的段。

  • multipart/related类型

MIME邮件中除了可以携带各种附件外,还可以将其它内容以内嵌资源的方式存储在邮件中。比如我们在发送html格式的邮件内容时,可能使用图像作为html的背景,html文本会被存储在alternative段中,而作为背景的图像则会存储在multipart/related类型定义的段中。

  • multipart/alternative类型

MIME邮件可以传送超文本内容,但出于兼容性的考虑,一般在发送超文本格式内容的同时会同时发送一个纯文本内容的副本,如果邮件中同时存在纯文本和超文本内容,则邮件需要在Content-Type域中定义multipart/alternative类型,邮件通过其boundary中的分段标识将纯文本、超文本和邮件的其它内容分成不同的段。

邮件结构

JAF框架

JAF(JavaBeans Activation Framework,JavaBeans激活框架)是一个专用的数据处理框架,它用于封装数据,并为应用程序提供访问和操作数据的接口。

JAF的主要作用在于让Java应用程序知道如何对一个数据源进行查看、编辑和打印等操作。对于通过JAF封装的数据,应用程序通过JAF提供的接口可以完成如下功能:

  • 访问数据源中的数据
  • 获知数据源的数据类型
  • 获知可对数据进行的各种操作
  • 用户对数据执行某种操作时,自动创建执行该操作的软件部件的实例对象

JavaMail API可以利用JAF从某种数据源中读取数据和获知数据的MIME类型,并用这些数据生成MIME消息中的消息体和消息类型。

发送带文本、图片的邮件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

package com.haiwen.test;

  

import java.io.File;

import java.util.Date;

import java.util.Properties;

  

import javax.activation.DataHandler;

import javax.activation.DataSource;

import javax.activation.FileDataSource;

import javax.mail.Message.RecipientType;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeBodyPart;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMultipart;

  

import org.junit.Test;

  

public class MessageDemo2 {

  

    // 初始化参数

    private static Properties prop;

    // 发件人

    private static InternetAddress sendMan = null;

    static {

        prop = new Properties();

        prop.put("mail.transport.protocol", "smtp"); // 协议

        prop.put("mail.smtp.host", "smtp.163.com"); // 主机

        // prop.put("mail.smtp.port", 25); // 端口

        prop.put("mail.smtp.auth", "true"); // 用户密码认证

        prop.put("mail.debug", "true"); // 调试模式

        try {

            sendMan = new InternetAddress("xxx@163.com");

        } catch (AddressException e) {

            throw new RuntimeException(e);

        }

    }

  

    @Test

    public void testSend() throws Exception {

        // 1. 创建邮件会话

        Session session = Session.getDefaultInstance(prop);

        // 2. 创建邮件对象

        MimeMessage message = new MimeMessage(session);

        // 3. 设置参数:标题、发件人、收件人、发送时间、内容

        message.setSubject("带图片邮件");

        message.setSender(sendMan);

        message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com"));

        message.setSentDate(new Date());

  

        /*************** 设置邮件内容: 多功能用户邮件 (related) *******************/

        // 4.1 构建一个多功能邮件块

        MimeMultipart related = new MimeMultipart("related");

        // 4.2 构建多功能邮件块内容 = 左侧文本 + 右侧图片资源

        MimeBodyPart content = new MimeBodyPart();

        MimeBodyPart resource = new MimeBodyPart();

  

        // 设置具体内容: a.资源(图片)

        String filePath = MessageDemo2.class.getResource("mm.png").getPath();

        DataSource ds = new FileDataSource(new File(filePath));

                //使用到了JAF框架把磁盘上的文件加到resource

        DataHandler handler = new DataHandler(ds);

        resource.setDataHandler(handler);

        resource.setContentID("mm.png"); // 设置资源名称,给外键引用

  

        // 设置具体内容: b.文本

        content.setContent("<img src='cid:mm.png'/>  好哈哈!", "text/html;charset=UTF-8");

  

        related.addBodyPart(content);

        related.addBodyPart(resource);

  

        /******* 4.3 把构建的复杂邮件快,添加到邮件中 ********/

        message.setContent(related);

  

        // 5. 发送

        Transport trans = session.getTransport();

        trans.connect("xxx@163.com", "xxx");

        trans.sendMessage(message, message.getAllRecipients());

        trans.close();

    }

}

发送带文本、图片、附件的邮件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

package com.haiwen.test;

  

import java.io.File;

import java.util.Date;

import java.util.Properties;

  

import javax.activation.DataHandler;

import javax.activation.DataSource;

import javax.activation.FileDataSource;

import javax.mail.Message.RecipientType;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeBodyPart;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMultipart;

  

import org.junit.Test;

  

public class MessageDemo3 {

  

    // 初始化参数

    private static Properties prop;

    // 发件人

    private static InternetAddress sendMan = null;

    static {

        prop = new Properties();

        prop.put("mail.transport.protocol", "smtp"); // 指定协议

        prop.put("mail.smtp.host", "smtp.163.com"); // 主机 stmp.qq.com

        // prop.put("mail.smtp.port", 25); // 端口

        prop.put("mail.smtp.auth", "true"); // 用户密码认证

        prop.put("mail.debug", "true"); // 调试模式

        try {

            sendMan = new InternetAddress("xxx@163.com");

        } catch (AddressException e) {

            throw new RuntimeException(e);

        }

    }

  

    @Test

    public void testSend() throws Exception {

        // 1. 创建邮件会话

        Session session = Session.getDefaultInstance(prop);

        // 2. 创建邮件对象

        MimeMessage message = new MimeMessage(session);

        // 3. 设置参数:标题、发件人、收件人、发送时间、内容

        message.setSubject("带图片邮件");

        message.setSender(sendMan);

        message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com"));

        message.setSentDate(new Date());

  

        /*

         * 带附件(图片)邮件开发

         */

        // 构建一个总的邮件块

        MimeMultipart mixed = new MimeMultipart("mixed");

        // ---> 总邮件快,设置到邮件对象中

        message.setContent(mixed);

        // 左侧: (文本+图片资源)

        MimeBodyPart left = new MimeBodyPart();

        // 右侧: 附件

        MimeBodyPart right = new MimeBodyPart();

        // 设置到总邮件块

        mixed.addBodyPart(left);

        mixed.addBodyPart(right);

  

        /****** 附件 ********/

        String attr_path = this.getClass().getResource("a.docx").getPath();

        DataSource attr_ds = new FileDataSource(new File(attr_path));

        DataHandler attr_handler = new DataHandler(attr_ds);

        right.setDataHandler(attr_handler);

        right.setFileName("a.docx");

  

        /*************** 设置邮件内容: 多功能用户邮件 (related) *******************/

        // 4.1 构建一个多功能邮件块

        MimeMultipart related = new MimeMultipart("related");

        // ----> 设置到总邮件快的左侧中

        left.setContent(related);

  

        // 4.2 构建多功能邮件块内容 = 左侧文本 + 右侧图片资源

        MimeBodyPart content = new MimeBodyPart();

        MimeBodyPart resource = new MimeBodyPart();

  

        // 设置具体内容: a.资源(图片)

        String filePath = MessageDemo3.class.getResource("mm.png").getPath();

        DataSource ds = new FileDataSource(new File(filePath));

        DataHandler handler = new DataHandler(ds);

        resource.setDataHandler(handler);

        resource.setContentID("mm.png"); // 设置资源名称,给外键引用

  

        // 设置具体内容: b.文本

        content.setContent("<img src='cid:mm.png'/>  好哈哈!", "text/html;charset=UTF-8");

  

        related.addBodyPart(content);

        related.addBodyPart(resource);

  

        // 5. 发送

        Transport trans = session.getTransport();

        trans.connect("xxx@163.com", "xxx");

        trans.sendMessage(message, message.getAllRecipients());

        trans.close();

    }

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/lovecuidong/article/details/92658140
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计