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

简介:

一 概念简介

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,如需转载请自行联系原作者

相关文章
|
安全 算法 网络协议
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
|
安全 算法 网络安全
SSL/TLS:构建数字世界的加密长城
**协议演进:从网景实验室到全球标准** 1994年,网景公司推出SSL协议,首次实现40位密钥加密传输,开启网络安全新纪元。此后,SSL 3.0、TLS 1.0相继问世,至2018年TLS 1.3将握手速度提升60%,强制前向加密确保历史会话安全。TLS协议通过非对称加密、对称加密和证书信任链等多层架构保障通信安全。2014年POODLE漏洞促使全行业禁用SSL 3.0,催生防降级机制。
|
安全 搜索推荐 网络安全
免费SSL证书:一键加密,守护网站安全
在互联网时代,网站安全至关重要。SSL证书是保护网站数据传输安全的核心工具,提供数据加密、提升信任度、提高搜索引擎排名及避免“不安全”警告等多重优势。现在,您可以通过JoySSL官网免费获取SSL证书,只需注册并填写注策码(230907),即可一键加密,轻松守护网站安全,提升用户体验和品牌形象。立即行动,为您的网站穿上“安全防护衣”!
712 11
|
安全 算法 物联网
SSL/TLS:互联网通信的加密基石与安全实践
**简介:** 在数字化时代,互联网每天传输海量敏感数据,网络攻击频发。SSL/TLS协议作为网络安全的基石,通过加密技术确保数据安全传输。本文解析SSL/TLS的技术架构、密码学原理、应用场景及常见误区,探讨其在未来的发展趋势,强调持续演进以应对新型威胁的重要性。 SSL/TLS不仅保障Web安全,还广泛应用于API、邮件、物联网等领域,并遵循合规标准如PCI DSS和GDPR。
|
安全 数据建模 应用服务中间件
阿里云SSL证书价格、证书类型及免费版证书申请和证书部署教程参考
阿里云SSL证书有收费版也有免费版,收费版DV域名级SSL类型405元起,免费版证书为DV域名级SSL类型,每个实名个人和企业主体在一个自然年内可以一次性领取20张免费证书。本文为大家详细介绍阿里云SSL证书价格情况,包括不同域名类型、证书类型、证书等级和证书品牌的相关收费标准,以及免费版证书的申请和部署教程参考。
|
10月前
|
网络协议 应用服务中间件 网络安全
阿里云SSL证书申请具体操作流程,以申请免费SSL证书为例
阿里云免费SSL证书由Digicert提供,单域名可申请20张,有效期3个月。通过数字证书管理控制台,完成购买、域名验证(DNS或文件)、提交审核后下载,支持Nginx、Apache等多服务器格式。
2611 0
|
算法 应用服务中间件 网络安全
阿里云WoSign“国密RSA双SSL证书”应用实践
阿里云WoSign品牌SSL证书是阿里云平台热销的国产品牌证书之一,支持签发国密合规的SM2算法SSL证书以及全球信任的RSA算法SSL证书,能够满足平台用户不同的SSL证书应用需求,同时为用户提供国密模块支持,实现“国密/RSA双证书部署”。
1887 6
阿里云WoSign“国密RSA双SSL证书”应用实践
|
数据建模 网络安全
阿里云SSL证书不同类型DV、OV和EV如何收费?单域名和通配符SSL价格整理
阿里云SSL证书提供免费和收费版本,涵盖DV、OV、EV多种类型。收费证书品牌包括DigiCert、GlobalSign等,价格从238元/年起。免费SSL证书由Digicert提供,单域名有效3个月,每个实名主体每年可领取20个。具体价格和详情见阿里云SSL官方页面。
|
算法 安全 应用服务中间件
2025阿里云智惠采购季,WoSign SSL国产证书折上折满减优惠
**2025阿里云“智慧采购季,就上阿里云”活动火热进行中!** 3月1日至31日,阿里云WoSign品牌SSL证书新老用户同享折上折满减优惠。DV SSL证书低至220元/年起,轻松实现HTTPS加密,保障数据传输安全。领取“智惠采购季上云礼包”,先领券再下单,享受满减优惠。WoSign品牌SSL证书国密RSA双算法支持,确保广泛兼容与可靠部署。
1083 2
2025阿里云智惠采购季,WoSign SSL国产证书折上折满减优惠
|
运维 安全 网络安全
【运维实战分享】轻松搞定 SSL 证书管理,告别证书繁琐操作
Spug证书平台的最大亮点之一就是其极为简化的证书申请流程,无论是新手还是经验丰富的运维专家,都可以在几分钟内轻松完成证书的申请,通过微信扫码直接登录申请,无需复杂注册,整个过程既方便又快捷。
437 17