老鬼的博客 来都来啦,那就随便看看吧~
Java_Email发送邮件
发布于: 2018-10-31 更新于: 2023-11-08 分类于:  阅读次数: 

1.开启SMTP服务

1
2
	进入邮箱设置,找到客户端SMTP服务,并开启此服务,有些邮箱开启
后,会提供一个独立密码,此时这个密码就是后面设置的password

1.png

2.pom配置jar

1
2
3
4
5
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.5</version>
</dependency>

3.编写EmailUtils

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
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
package com.umojo.tcm.utils;

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

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.apache.log4j.Logger;

import com.umojo.tcm.exception.BusinessException;

public class EmailUtils {


private static Logger log = Logger.getLogger(EmailUtils.class);



// 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
// PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”),
// 对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
public final static String MY_EMAIL_COUNT = "xxx@sohu.com";
public final static String MY_EMAIL_PASSWORD = "xxx";
// 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
// 网易126邮箱的 SMTP 服务器地址为: smtp.126.com
// 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
// 搜狐邮箱: smtp:sohu.com
//Gamil邮箱 : smtp:gmail.com
//QQ邮箱: smtp:qq.com
public final static String MY_EMAIL_SMTP_HOST = "smtp.sohu.com";
public final static Integer OUT_TIME = 1000;
public final static String PROTOCOL_SMTP = "smtp";
public final static String PROTOCOL_SMTPS = "smtps";
public final static Integer SMTP_DEFAULT_PORT = 25;
public final static Integer SMTPS_DEFAULT_PORT = 465;


/**
* 使用smtp协议和默认发件人发送邮件,只有一个收件人,无抄送人和密送人
* @param subject 主题
* @param text 正文
* @param toEmail 收件人邮箱
*/
public static void sendEmailSmtp(String subject,String text,String toEmail){
sendEmailSmtp(subject, text, new String[]{toEmail}, null, null, MY_EMAIL_COUNT, MY_EMAIL_PASSWORD, MY_EMAIL_SMTP_HOST);
}

/**
* 使用smtps协议和默认发件人发送邮件,只有一个收件人,无抄送人和密送人
* @param subject 主题
* @param text 正文
* @param toEmail 收件人邮箱
*/
public static void sendEmailSmtps(String subject,String text,String toEmail){
sendEmailSmtps(subject, text, new String[] {toEmail}, null, null, MY_EMAIL_COUNT, MY_EMAIL_PASSWORD, MY_EMAIL_SMTP_HOST);
}


/**
* 使用smtps协议和默认邮箱发送邮件
* @param subject 主题
* @param text 正文
* @param toEmail 收件人邮箱列表
* @param ccEmail 抄送人邮箱列表
* @param bccEmail 密送人邮箱列表
*/
public static void sendEmailSmtps(String subject,String text,String[] toEmail,String[] ccEmail,String[] bccEmail) {
sendEmailSmtps(subject, text, toEmail, ccEmail, bccEmail, MY_EMAIL_COUNT, MY_EMAIL_PASSWORD, MY_EMAIL_SMTP_HOST);
}

/**
* 使用smtp协议和默认邮箱发送邮件
* @param subject 主题
* @param text 正文
* @param toEmail 收件人邮箱列表
* @param ccEmail 抄送人邮箱列表
* @param bccEmail 密送人邮箱列表
*/
public static void sendEmailSmtp(String subject,String text,String[] toEmail,String[] ccEmail,String[] bccEmail) {
sendEmailSmtp(subject, text, toEmail, ccEmail, bccEmail, MY_EMAIL_COUNT, MY_EMAIL_PASSWORD, MY_EMAIL_SMTP_HOST);
}



/**
* 使用smtps协议发送邮件
* @param subject 邮件标题
* @param text 邮件正文
* @param toEmail 收件人邮箱列表
* @param ccEmail 抄送人邮箱列表
* @param bccEmail 密送人邮箱列表
* @param fromEmail 发件人邮箱
* @param password 发件人邮箱密码
* @param smtpHost SMTP的服务器地址
* @throws MessagingException
*/
public static void sendEmailSmtps(String subject,String text,String[] toEmail,String[] ccEmail,String[] bccEmail,String fromEmail,String password,String smtpHost) {
sendEmail(subject, text, toEmail,ccEmail,bccEmail, fromEmail, password, PROTOCOL_SMTPS, smtpHost, SMTPS_DEFAULT_PORT, OUT_TIME, false);
}


/**
* 使用smtp协议发送邮件
* @param subject 邮件标题
* @param text 邮件正文
* @param toEmail 收件人邮箱列表
* @param ccEmail 抄送人邮箱列表
* @param bccEmail 密送人邮箱列表
* @param fromEmail 发件人邮箱
* @param password 发件人邮箱密码
* @param smtpHost SMTP的服务器地址
* @throws MessagingException
*/
public static void sendEmailSmtp(String subject,String text,String[] toEmail,String[] ccEmail,String[] bccEmail,String fromEmail,String password,String smtpHost) {
sendEmail(subject, text, toEmail,ccEmail,bccEmail,fromEmail, password, PROTOCOL_SMTP, smtpHost, SMTP_DEFAULT_PORT, OUT_TIME, false);
}

/**
* 使用简单的形式发送邮件
* @param subject 邮件主题
* @param text 邮件正文
* @param toEmail 收件人邮箱列表
* @param ccEmail 抄送人邮箱列表
* @param bccEmail 密送人邮箱列表
* @param fromEmail 发件人邮箱
* @param password 发件人邮箱密码
* @param protocol 协议:smtp或者smtps
* @param smtpHost 发件人的邮箱的 SMTP 服务器地址
* @param port SMTP 服务器的端口
* @param outTime 超时时间
* @param debug 是否开启debug模式
* @throws MessagingException
*/
public static void sendEmail(String subject,String text,String[] toEmail,String[] ccEmail,String[] bccEmail,String fromEmail,String password,String protocol,String smtpHost,Integer port,Integer outTime,Boolean debug) {

try {
log.info("主题:"+ subject);
log.info("正文:"+text);
log.info("toEmail:"+toEmail);
log.info("fromEmail:"+fromEmail);
//1.创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");// 必须 普通客户端
props.setProperty("mail.transport.protocol", protocol);// 必须选择协议
props.put("mail.smtp.connectiontimeout", outTime);//超时时间
props.put("mail.debug", debug);//debug模式

//2. 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getDefaultInstance(props);
session.setDebug(debug);// 设置debug模式 在控制台看到交互信息

//3.建立一个要发送的信息
Message msg = createMimeMessage(session, subject, text, fromEmail, toEmail, ccEmail, bccEmail);

//4.根据 Session 获取邮件传输对象
Transport transport = session.getTransport();// 发送信息的工具
// 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
//
// PS_01: 如果连接服务器失败, 都会在控制台输出相应失败原因的log。
// 仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接,
// 根据给出的错误类型到对应邮件服务器的帮助网站上查看具体失败原因。
//
// PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
// (1) 邮箱没有开启 SMTP 服务;
// (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
// (3) 邮箱服务器要求必须要使用 SSL 安全连接;
// (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
// (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
// PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
// 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接, //
// 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
//QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
transport.connect(smtpHost, port, fromEmail, password);

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

//7. 关闭连接
transport.close();
} catch (Exception e) {
log.info("发送邮件失败...");
e.printStackTrace();
}

}


/**
* 创建邮件
* @param session 和服务器交互的会话
* @param subject 主题
* @param text 正文
* @param fromEmail 发件人邮箱
* @param toEmail 收件人邮箱
* @param ccEmail 抄送人邮箱
* @param bccEmail 密送人邮箱
* @return
* @throws Exception
*/
public static MimeMessage createMimeMessage(Session session,
String subject, String text, String fromEmail,
String[] toEmail, String[] ccEmail,
String[] bccEmail) throws Exception {
MimeMessage message = new MimeMessage(session); // 创建邮件对象

/*
* 也可以根据已有的eml邮件文件创建 MimeMessage 对象 MimeMessage message = new
* MimeMessage(session, new FileInputStream("myEmail.eml"));
*/

// 2. From: 发件人
// 其中 InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码
// 真正要发送时, 邮箱必须是真实有效的邮箱。
// message.setFrom(new InternetAddress("email@send.com", "USER_AA",
// "UTF-8"));
message.setFrom(new InternetAddress(fromEmail));

// 3. To: 收件人
if (toEmail != null && toEmail.length > 0) {
for (int i = 0; i < toEmail.length; i++) {
if(i == 0){
message.setRecipient(MimeMessage.RecipientType.TO,
new InternetAddress(toEmail[i]));
}else{
message.addRecipient(MimeMessage.RecipientType.TO,
new InternetAddress(toEmail[i]));
}
}
} else {
throw new BusinessException("收件人为空");
}

// 4. CC: 抄送(可选)
if (ccEmail != null && ccEmail.length > 0) {
for (int i = 0; i < ccEmail.length; i++) {
if(i == 0){
message.setRecipient(MimeMessage.RecipientType.CC,
new InternetAddress(ccEmail[i]));
}else{
message.addRecipient(MimeMessage.RecipientType.CC,
new InternetAddress(ccEmail[i]));
}
}
}

// 5. BCC:密送(可选)
if (bccEmail != null && bccEmail.length > 0) {
for (int i = 0; i < bccEmail.length; i++) {
if(i == 0){
message.setRecipient(MimeMessage.RecipientType.BCC,
new InternetAddress(bccEmail[i]));
}else{
message.addRecipient(MimeMessage.RecipientType.BCC,
new InternetAddress(bccEmail[i]));
}

}
}

// 6. Subject: 邮件主题
message.setSubject(subject, "UTF-8");

// 7.. Content: 邮件正文(可以使用html标签)
message.setContent(text, "text/html;charset=UTF-8");

// 8. 设置显示的发件时间
message.setSentDate(new Date());

// 7. 保存前面的设置
// message.saveChanges();

// 8. 将该邮件保存到本地
// OutputStream out = new FileOutputStream("myEmail.eml");
// message.writeTo(out);
// out.flush();
// out.close();
return message;
}

public static void main(String[] args) throws MessagingException {
String subject = "测试多邮件发送,抄送,密送";//主题
String text = "这里是正文";//正文
String singleToEmail = "renjie@bluedeer.com.cn";//单收件人
String[] toEmail = {"renjie@bluedeer.com.cn","zhouhuadong@bluedeer.com.cn"};//收件人
String[] ccEmail = {"REN_ZHEN_YU@163.com"};//抄送人
String[] bccEmail = {"chenzhongwen@bluedeer.com.cn"};//米送人
String fromEmail = "xxx@sohu.com";//发件人
String password = "xxx";//发件人密码
String protocol = "smtp";//协议
String smtpHost = "smtp.sohu.com";//smtp的服务器地址
Integer port = 25;//smtp的服务器端口
Boolean debug = true;//是否开启debug模式
//原始的发送邮件
sendEmail(subject, text, toEmail, ccEmail, bccEmail, fromEmail, password, protocol, smtpHost, port, OUT_TIME, debug);
//默认发件人 smtps协议发送邮件
sendEmailSmtps(subject, text, singleToEmail);
//默认发件人 smtp协议发送邮件
sendEmailSmtp(subject, text, singleToEmail);
//使用smtp协议发送邮件
sendEmailSmtp(subject, text, toEmail,ccEmail, bccEmail, fromEmail, password, smtpHost);
//使用smtps协议发送邮件
sendEmailSmtps(subject, text, toEmail,ccEmail, bccEmail, fromEmail, password, smtpHost);

}


}

4.SMTP服务器对应地址

邮箱 SMTP服务器地址
QQ smtp.qq.com
Gmail smtp.gmail.com
163 smtp.163.com
126 smtp.126.com
搜狐 smtp.sohu.com

其他邮箱自行去查看

5.端口

1
2
3
	默认未开启SSL时端口默认是25,可以写可以不写,此时的protocol
协议是smtp,当开启SSL即protocol协议是smtps时,此时的端口465或587,
不同邮箱对应的端口号不一样,请自行查看。
*************感谢您的阅读*************