博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaMail实现收发邮件(五)使用SSL实现加密传输
阅读量:5948 次
发布时间:2019-06-19

本文共 5971 字,大约阅读时间需要 19 分钟。

一 概念简介

Secure Socket Layer,为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境。只要3.0版本以上之I.E.或Netscape浏览器即可支持SSL。
当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。
(PS:来至百度百科)


二 在JavaMail中使用SSL对邮件发送进行加密

实际上大部分操作都跟普通的邮件发送是一样的,只是有两个地方有所变化。(1)传输端口从25改成465;(2)替换默认的socketFactory

下面我以163邮箱实现的SSL传输举例说明,下图是163邮箱官方给出的相关配置信息:

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
package 
javamail.zifangsky.com;
 
import 
java.io.UnsupportedEncodingException;
import 
java.util.ArrayList;
import 
java.util.Date;
import 
java.util.List;
import 
java.util.Properties;
 
import 
javax.activation.DataHandler;
import 
javax.activation.FileDataSource;
import 
javax.mail.Address;
import 
javax.mail.BodyPart;
import 
javax.mail.Multipart;
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;
 
public 
class 
SendMailBySSL {
    
private 
final 
String SSL_FACTORY = 
"javax.net.ssl.SSLSocketFactory"
;
    
private 
String smtpServer; 
// SMTP服务器地址
    
private 
String port; 
// 端口
    
private 
String username; 
// 登录SMTP服务器的用户名
    
private 
String password; 
// 登录SMTP服务器的密码
    
private 
List<String> recipients = 
new 
ArrayList<String>(); 
// 收件人地址集合
    
private 
String subject; 
// 邮件主题
    
private 
String content; 
// 邮件正文
    
private 
List<String> attachmentNames = 
new 
ArrayList<String>(); 
// 附件路径信息集合
 
    
public 
SendMailBySSL() {
 
    
}
 
    
public 
SendMailBySSL(String smtpServer, String port, String username,
            
String password, List<String> recipients, String subject,
            
String content, List<String> attachmentNames) {
        
this
.smtpServer = smtpServer;
        
this
.port = port;
        
this
.username = username;
        
this
.password = password;
        
this
.recipients = recipients;
        
this
.subject = subject;
        
this
.content = content;
        
this
.attachmentNames = attachmentNames;
    
}
 
    
public 
void 
setSmtpServer(String smtpServer) {
        
this
.smtpServer = smtpServer;
    
}
 
    
public 
void 
setPort(String port) {
        
this
.port = port;
    
}
 
    
public 
void 
setUsername(String username) {
        
this
.username = username;
    
}
 
    
public 
void 
setPassword(String password) {
        
this
.password = password;
    
}
 
    
public 
void 
setRecipients(List<String> recipients) {
        
this
.recipients = recipients;
    
}
 
    
public 
void 
setSubject(String subject) {
        
this
.subject = subject;
    
}
 
    
public 
void 
setContent(String content) {
        
this
.content = content;
    
}
 
    
public 
void 
setAttachmentNames(List<String> attachmentNames) {
        
this
.attachmentNames = attachmentNames;
    
}
 
    
/**
     
* 进行base64加密,防止中文乱码
     
* */
    
public 
String changeEncode(String str) {
        
try 
{
            
str = MimeUtility.encodeText(
new 
String(str.getBytes(), 
"UTF-8"
),
                    
"UTF-8"
"B"
); 
// "B"代表Base64
        
catch 
(UnsupportedEncodingException e) {
            
e.printStackTrace();
        
}
        
return 
str;
    
}
 
    
/**
     
* 正式发邮件
     
* */
    
public 
boolean 
sendMail() {
        
Properties properties = 
new 
Properties();
        
properties.put(
"mail.smtp.host"
, smtpServer);
        
properties.put(
"mail.smtp.auth"
"true"
);
        
properties.put(
"mail.smtp.socketFactory.class"
, SSL_FACTORY);  
//使用JSSE的SSL socketfactory来取代默认的socketfactory
        
properties.put(
"mail.smtp.socketFactory.fallback"
"false"
);  
// 只处理SSL的连接,对于非SSL的连接不做处理
                                                                 
        
properties.put(
"mail.smtp.port"
, port);
        
properties.put(
"mail.smtp.socketFactory.port"
, port);
 
        
Session session = Session.getInstance(properties);
        
session.setDebug(
true
);
        
MimeMessage message = 
new 
MimeMessage(session);
 
        
try 
{
            
// 发件人
            
Address address = 
new 
InternetAddress(username);
            
message.setFrom(address);
 
            
// 收件人
            
for 
(String recipient : recipients) {
                
System.out.println(
"收件人:" 
+ recipient);
                
Address toAddress = 
new 
InternetAddress(recipient);
                
message.setRecipient(MimeMessage.RecipientType.TO, toAddress); 
// 设置收件人,并设置其接收类型为TO
                
/**
                 
* TO:代表有健的主要接收者。 CC:代表有健的抄送接收者。 BCC:代表邮件的暗送接收者。
                 
* */
            
}
 
            
// 主题
            
message.setSubject(changeEncode(subject));
 
            
// 时间
            
message.setSentDate(
new 
Date());
 
            
Multipart multipart = 
new 
MimeMultipart();
            
// 添加文本
            
BodyPart text = 
new 
MimeBodyPart();
            
text.setText(content);
            
multipart.addBodyPart(text);
            
// 添加附件
            
for 
(String fileName : attachmentNames) {
                
BodyPart adjunct = 
new 
MimeBodyPart();
                
FileDataSource fileDataSource = 
new 
FileDataSource(fileName);
                
adjunct.setDataHandler(
new 
DataHandler(fileDataSource));
                
adjunct.setFileName(changeEncode(fileDataSource.getName()));
                
multipart.addBodyPart(adjunct);
            
}
            
// 清空收件人集合,附件集合
            
recipients.clear();
            
attachmentNames.clear();
 
            
message.setContent(multipart);
            
message.saveChanges();
 
        
catch 
(Exception e) {
            
e.printStackTrace();
            
return 
false
;
        
}
 
        
try 
{
            
Transport transport = session.getTransport(
"smtp"
);
            
transport.connect(smtpServer, username, password);
            
transport.sendMessage(message, message.getAllRecipients());
            
transport.close();
        
catch 
(Exception e) {
            
e.printStackTrace();
            
return 
false
;
        
}
 
        
return 
true
;
    
}
 
    
public 
static 
void 
main(String[] args) {
        
List<String> recipients = 
new 
ArrayList<String>();
//      recipients.add("123456789@qq.com");
        
recipients.add(
"admin@zifangsky.cn"
);
        
String subject = 
"这封邮件是为了测试SMTP的SSL加密传输"
;
        
String content = 
"这是这封邮件的正文"
;
        
List<String> attachmentNames = 
new 
ArrayList<String>();
        
attachmentNames.add(
"C://Users//Administrator//Desktop//kali.txt"
);
        
SendMailBySSL sendMailBySSL = 
new 
SendMailBySSL(
"smtp.163.com"
"465"
,
                
"youname@163.com"
"youpassword"
, recipients, subject, content,
                
attachmentNames);
        
sendMailBySSL.sendMail();
    
}
 
}

三 测试结果如下

本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1721164,如需转载请自行联系原作者

你可能感兴趣的文章
Dominating Patterns
查看>>
截取指定字符串
查看>>
metrics-server最新版本有坑,慎用
查看>>
linux虚拟文件系统浅析
查看>>
HBase数据压缩编码探索
查看>>
sprint计划会议总结
查看>>
团队项目冲刺1
查看>>
fon循环总是返回最后值问题
查看>>
Android新权限机制 AppOps
查看>>
“蓝桥杯”软件大赛入门训练4道题
查看>>
Unable to get the CMake version located at
查看>>
爬虫基本原理
查看>>
Heritage from father
查看>>
css选择器
查看>>
使用多线程
查看>>
Django--Uploaded Files以及Handlers
查看>>
在IIS(64位)上部署WCF服务访问Oracle数据库
查看>>
个人在 laravel 开发中使用到的一些技巧(持续更新)
查看>>
iOS之KVO
查看>>
数组的代替品
查看>>