Java 发送邮件

代码示例:

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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;

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

import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONObject;

import java.util.List;


@Component
public class SendEmail {


public static void main(String[] args) {
SendEmail.sendEmail("邮件测试", new String[]{},"接收的邮箱", "主题");
}

/**
* 发送邮件
* @param string 邮件内容 receiveEmail收件人邮箱
* @return
*/
public static String sendEmail(String string,String[] fileurl,String receiveEmail,String theme){

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

// 收件人邮箱(替换为自己知道的有效邮箱)
String receiveMailAccount = receiveEmail;

// 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;
try {
message = createMimeMessage(session, myEmailAccount, receiveMailAccount,string,fileurl,theme);
// 也可以保持到本地查看
// 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();
} catch (Exception e) {

e.printStackTrace();
}


return "d";
}



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

// 2. From: 发件人
message.setFrom(new InternetAddress(sendMail, "Java程序", "UTF-8"));

// 3. To: 收件人(可以增加多个收件人、抄送、密送)
// message.addRecipient(RecipientType.TO, new InternetAddress(receiveMail, "收件人昵称收件人", "UTF-8"));
InternetAddress[] internetAddressTo = new InternetAddress().parse(receiveMail);
message.setRecipients(RecipientType.TO, internetAddressTo);
// 4. Subject: 邮件主题
message.setSubject(theme, "UTF-8");

/*
* 下面是邮件内容的创建:
*/
// 5. 创建图片“节点”

/*
MimeBodyPart image = new MimeBodyPart();
File f=new File("C:/Users/Administrator/Desktop/1.png");
DataHandler dh = new DataHandler(new FileDataSource(f)); // 读取本地文件
image.setDataHandler(dh); // 将图片数据添加到“节点”
image.setContentID("image_fairy_tail"); // 为“节点”设置一个唯一编号(在文本“节点”将引用该ID)
image.setFileName(MimeUtility.encodeText(f.getName()));//如果附件有中文通过转换没有问题了
*/

// 6. 创建文本“节点”
MimeBodyPart text = new MimeBodyPart();
//这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
text.setContent(content, "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. 创建附件“节点”
// 设置附件的文件名(需要编码)



// 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart )
MimeMultipart mm = new MimeMultipart();

if(fileurllist.length>0){
for (String string : fileurllist) {//循环添加多个附件
MimeBodyPart attachment = new MimeBodyPart();
DataHandler dh2 = new DataHandler(new FileDataSource(string)); // 读取本地文件
attachment.setDataHandler(dh2); // 将附件数据添加到“节点”
attachment.setFileName(MimeUtility.encodeText(dh2.getName()));
mm.addBodyPart(attachment);
}
}

mm.addBodyPart(text);
mm.setSubType("mixed"); // 混合关系

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

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

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

return message;
}




/**
* 获取系统邮箱
* @param id
* @return
*/
public static String getEmail(String id){
BufferedReader reader = null;
String laststr = "";
String email = null;
try {
FileInputStream fileInputStream = new FileInputStream(
PctJsonUtil.class.getResource("/").getFile().toString() + "/email.json");

InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
reader = new BufferedReader(inputStreamReader);
String tempString = null;
while ((tempString = reader.readLine()) != null) {
laststr += tempString;
}
JSONObject jsoncode = JSONObject.parseObject(laststr);
email = String.valueOf(jsoncode.get(id));

reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return email;
}


}

email.json:

1
{“EMAIL”:”product@XXX.com”,”myEmailAccount”:88888888@163.com”,”myEmailPassword”:666666}