基于JavaMail的Java实现复杂邮件发送功能

2025-05-29 0 33

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

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

完整代码演示:

?

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

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138
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.getDefaultInstance(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;

}

}

发送后查看收件人的收件箱:

基于JavaMail的Java实现复杂邮件发送功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://blog.csdn.net/xietansheng/article/details/51722660

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 基于JavaMail的Java实现复杂邮件发送功能 https://www.kuaiidc.com/114731.html

相关文章

发表评论
暂无评论