使用Java发送邮件

前言

在使用Java开发项目过程中我们通常会遇到发送邮件的需求,那么系统中是如何使用Java发送邮件的呢?今天我们来了解下使用Java发送邮件的两种方式。

它们分别是使用 apache-commons-email 包来发送邮件、使用javax.mail 包来发送邮件。

我们分别对它们进行了解。

正文

JavaMail

我们来看下使用JavaMail发送一封邮件的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
/**
* @author zwt
* @detail 使用JavaxMail 发送邮件
* @date 2019/1/23
* @since 1.0
*/
public class SendMail{

//SMTP主机设置
private static final String MAIL_HOST_NAME = "smtp.qq.com";
//发送邮件的邮箱用户名
private static final String MAIL_SYSTEM_USER = "test@qq.com";
//发送邮件的邮箱密码
private static final String MAIL_SYSTEM_PASSWORD = "SMTP授权码";

/**
* 发送邮件
* @param subject
* @param receivers
* @param copys
* @param msg
* @param attachName
* @return
*/
public static boolean sendMail(String subject, List<String> receivers, List<String> copys, String msg, String attachName){
if (CollectionUtils.isEmpty(receivers) || (subject == null) || (msg == null)) {
throw new SendMailException("Email receivers or subject or content must be not null");
}
boolean isSuccess = false;
try {
// 获取系统属性
Properties properties = System.getProperties();
// 设置邮件服务器
properties.setProperty("mail.smtp.host", MAIL_HOST_NAME);
//传输协议SMTP
properties.setProperty("mail.transport.protocol", "smtp");
//开启SMTP认证
properties.setProperty("mail.smtp.auth", "true");
//SMTP端口号
properties.setProperty("mail.smtp.port","465");
//开启ssl
properties.setProperty("mail.smtp.ssl.enable","true");
//用户名密码认证
properties.setProperty("mail.user",MAIL_SYSTEM_USER );
properties.setProperty("mail.password", MAIL_SYSTEM_PASSWORD);
// 获取默认的 Session 对象。
Session session = Session.getDefaultInstance(properties);
// 创建默认的 MimeMessage 对象。
MimeMessage message = new MimeMessage(session);
// 发信人
message.setFrom(new InternetAddress(MAIL_SYSTEM_USER));
// 收信人
for(String receiver:receivers){
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(receiver));
}
//抄送
if(!CollectionUtils.isEmpty(copys)){
for(String copy:copys){
message.addRecipient(Message.RecipientType.CC,
new InternetAddress(copy));
}
}
//邮件主题
message.setSubject(subject);

//有附件创建附件发送
if(!StringUtils.isEmpty(attachName)){
// 创建消息部分
BodyPart messageBodyPart = new MimeBodyPart();
// 消息
messageBodyPart.setText(msg);
// 创建多重消息
Multipart multipart = new MimeMultipart();
// 设置文本消息部分
multipart.addBodyPart(messageBodyPart);
// 附件部分
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(attachName);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName("附件");
multipart.addBodyPart(messageBodyPart);
// 发送完整消息
message.setContent(multipart); //setContent方法可以插入html标签生成Html邮件
}else{
message.setText(msg);
}

// 发送消息
Transport.send(message);

isSuccess = true;
}catch (MessagingException e){
e.printStackTrace();
throw new SendMailException(e.getMessage());
}

return isSuccess;
}

public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("test1@qq.com");
sendMail("test",list,null,"测试一下",null);
}

}

可以看到,要发送一封邮件,Java的处理主要有以下几步:

①系统参数及属性设置,包括使用的协议(Pop3、SMTP等),是否开启ssl加密、发送邮件邮箱的用户名和密码等

②设置邮件属性,比如主题、内容、附件、接收人、抄送人等等

③发送邮件

我这儿使用的是QQ邮箱,要注意使用SMTP传输协议时,要开启SMTP,使用SSL,邮箱的认证密码不是邮箱密码,而是授权码,需要在QQ邮箱进行设置,如下:

upload successful

PS:在发送邮件时,如果想插入图片,可以设置成Html的内联图片,然后通过message.setContent添加这个Html文档。还有一些其它的功能(比如给某个人发送回执等)都可以通过设置实现,有兴趣的可以看下。

整个发送邮件的代码基本如上,还是比较易于理解的,我们不再对此做过多介绍。

apache-commons-email

再来看看Apache提供的apache-commons-email这个包。

这个包就是对JavaMail进行了一层封装,我们可以看到这个工具包本质还是使用了JavaMail去发送邮件。

upload successful

我们来看一个使用apache-commons-email包去发送邮件的例子。

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
public class SendMail {

//SMTP主机设置
private static final String MAIL_HOST_NAME = "smtp.qq.com";
//发送邮件的邮箱用户名
private static final String MAIL_SYSTEM_USER = "test@qq.com";
//发送邮件的邮箱密码
private static final String MAIL_SYSTEM_PASSWORD = "SMTP授权码";

/**
* 发送邮件
* @param subject 邮件主题
* @param receivers 接受者邮件地址
* @param copys 要抄送的邮件地址
* @param msg 内容
* @param attachName 附件地址
* @return
* @throws Exception
*/
public static boolean sendMail(String subject, List<String> receivers,List<String> copys, String msg, String attachName){
if (CollectionUtils.isEmpty(receivers) || (subject == null) || (msg == null)) {
throw new SendMailException("Email receivers or subject or content must be not null");
}
boolean isSuccess = false;
try {
//SimpleEmail email = new SimpleEmail();//创建简单邮件,不可添加附件、HTML文本等
//MultiPartEmail email = new MultiPartEmail();//创建能加附件的邮件,可多个、网络附件亦可
//HtmlEmail email = new HtmlEmail();//创建能加附件内容为HTML文本的邮件、HTML直接内联图片但必须用setHtmlMsg()传邮件内容
MultiPartEmail email = new MultiPartEmail();
//设置smtp 主机
email.setHostName(MAIL_HOST_NAME);
email.setSmtpPort(465);
email.setSSL(true);
//邮箱登录认证(保证邮件服务器POP3/SMTP服务开启)
email.setAuthentication(MAIL_SYSTEM_USER,MAIL_SYSTEM_PASSWORD);
//收信人列表
for(String receiver:receivers){
email.addTo(receiver, receiver);
}
//抄送人列表
if(!CollectionUtils.isEmpty(copys)){
for(String copy:copys){
email.addCc(copy,copy);
}
}
//发信人
email.setFrom(MAIL_SYSTEM_USER, MAIL_SYSTEM_USER);
//邮件主题
email.setSubject(MimeUtility.encodeText(subject));
//邮件内容
email.setMsg(msg);
//邮件附件
if ((attachName != null) && (attachName.trim().length() > 0)) {
EmailAttachment attachment = new EmailAttachment();
attachment.setPath(attachName);
attachment.setDisposition("attachment");
email.attach(attachment);
}
//发送邮件
email.send();
isSuccess = true;
} catch (EmailException e) {
throw new SendMailException(e.getMessage());
} catch (UnsupportedEncodingException e) {
throw new SendMailException(e.getMessage());
}
return isSuccess;
}


public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("test1@qq.com");
sendMail("test",list,null,"测试一下",null);
}
}

对比两个程序,可以了解apache-commons-email这个包把JavaMail的Session给我们隐藏了,使得我们更专注于API调用,同时它分出了三种邮件类型,供我们使用。

使用apache-commons-email,要发送不同类型的邮件,可以创建不同的mail class,如下:

//SimpleEmail email = new SimpleEmail();//创建简单邮件,不可添加附件、HTML文本等
//MultiPartEmail  email = new MultiPartEmail();//创建能加附件的邮件,可多个、网络附件亦可
//HtmlEmail email = new HtmlEmail();//创建能加附件内容为HTML文本的邮件、HTML直接内联图片

上面基本上是使用Java发送邮件的两种方式。

我测试了一下发邮件的代码,可以成功收到邮件。如下图:

upload successful

总结

在后台应用系统中邮件系统还是比较常用的,可以用来提供系统邮件预警、发送客户邮件进行活动推广等等一系列的事情。
SpringBoot里整合了JavaMail,创建SpringBoot项目时可以直接引入,是十分方便的。

upload successful

在application.properties里的配置均以spring.mail开头。

1
2
3
4
5
6
7
8
9
10
11
# JavaMailSender 邮件发送的配置
spring.mail.host=smtp.qq.com
spring.mail.username=qq邮箱
#QQ邮箱的授权码
spring.mail.password=授权码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8
spring.mail.protocol=smtp
spring.mail.port=465



-------------文章结束啦 ~\(≧▽≦)/~ 感谢您的阅读-------------

您的支持就是我创作的动力!

欢迎关注我的其它发布渠道