JavaMail实现收发邮件(五)使用SSL实现加密传输

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

一 概念简介

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邮箱官方给出的相关配置信息:

wKioL1Zn1viwAgyiAAAwjTscizQ247.png

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();
     }
 
}

三 测试结果如下

wKioL1Zn10DgdSwiAACP2IcGRms800.png

wKioL1Zn10Gh2TNkAACae-ExFUs423.png





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

相关文章
|
2月前
|
安全 网络安全 数据安全/隐私保护
SSL/TLS证书**是一种用于加密网络通信的数字证书
SSL/TLS证书**是一种用于加密网络通信的数字证书
108 6
|
2月前
|
存储 安全 数据安全/隐私保护
Codota的数据加密技术包括静态数据加密和传输中的数据加密
Codota的数据加密技术包括静态数据加密和传输中的数据加密
60 4
|
5月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
3月前
|
应用服务中间件 网络安全 Apache
Discuz! X3.5 开启ssl证书加密后微信、公众号无消息、支付宝通讯中断等
Discuz! X3.5 开启ssl证书加密后微信、公众号无消息、支付宝通讯中断等、支付宝支付实际支付成功,显示未支付等,都属于通讯中断,需要联系DZ官方付费修改程序,屏蔽防CC!
68 4
|
5月前
|
网络协议 安全 网络安全
DNS服务器加密传输
【8月更文挑战第18天】
507 15
|
5月前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
459 0
|
5月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
558 0
|
6月前
|
安全 网络协议 网络安全
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
|
6月前
|
安全 算法 Java
Java中的数据加密与安全传输
Java中的数据加密与安全传输
|
7月前
|
存储 安全 算法
RSA非对称加密算法中的密钥对生成与传输
RSA非对称加密算法的密钥对生成与传输是信息安全领域的核心问题之一。密钥生成过程需要保证随机性和安全性,而密钥的传输则需要选择适当的方式来确保其保密性和完整性。通过合理的密钥管理和保护措施,可以有效地利用RSA算法保护通信安全,防止信息泄露和篡改。在实际应用中,用户和系统管理员需要结合具体情况选择最佳的密钥生成和传输策略,以达到最佳的安全性和效率。
105 0

热门文章

最新文章