java ssl发送邮件_JavaMail实现收发邮件(五)使用SSL实现加密传输

  • Post author:
  • Post category:java


一 概念简介

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

69b1e46afd87b231b266be01859d8310.png
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 recipients = new ArrayList(); // 收件人地址集合

private String subject; // 邮件主题

private String content; // 邮件正文

private List p_w_uploadNames = new ArrayList(); // 附件路径信息集合

public SendMailBySSL() {

}

public SendMailBySSL(String smtpServer, String port, String username,

String password, List recipients, String subject,

String content, List p_w_uploadNames) {

this.smtpServer = smtpServer;

this.port = port;

this.username = username;

this.password = password;

this.recipients = recipients;

this.subject = subject;

this.content = content;

this.p_w_uploadNames = p_w_uploadNames;

}

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 recipients) {

this.recipients = recipients;

}

public void setSubject(String subject) {

this.subject = subject;

}

public void setContent(String content) {

this.content = content;

}

public void setAttachmentNames(List p_w_uploadNames) {

this.p_w_uploadNames = p_w_uploadNames;

}

/**

* 进行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 : p_w_uploadNames) {

BodyPart adjunct = new MimeBodyPart();

FileDataSource fileDataSource = new FileDataSource(fileName);

adjunct.setDataHandler(new DataHandler(fileDataSource));

adjunct.setFileName(changeEncode(fileDataSource.getName()));

multipart.addBodyPart(adjunct);

}

// 清空收件人集合,附件集合

recipients.clear();

p_w_uploadNames.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 recipients = new ArrayList();

//recipients.add(“123456789@qq.com”);

recipients.add(“admin@zifangsky.cn”);

String subject = “这封邮件是为了测试SMTP的SSL加密传输”;

String content = “这是这封邮件的正文”;

List p_w_uploadNames = new ArrayList();

p_w_uploadNames.add(“C://Users//Administrator//Desktop//kali.txt”);

SendMailBySSL sendMailBySSL = new SendMailBySSL(“smtp.163.com”, “465”,

“youname@163.com”, “youpassword”, recipients, subject, content,

p_w_uploadNames);

sendMailBySSL.sendMail();

}

}

三 测试结果如下

ed6d15c8629377679b35535adfc470fe.png

011de507ec150fd82a3078b818b3c90d.png

附:其他的几篇相关文章:



版权声明:本文为weixin_42433470原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。