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

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("[email protected]");
		recipients.add("[email protected]");
		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",
				"[email protected]", "youpassword", recipients, subject, content,
				attachmentNames);
		sendMailBySSL.sendMail();
	}

}

三 测试结果如下

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

JavaMail实现收发邮件(一)相关概念概述

JavaMail实现收发邮件(二)发送邮件

JavaMail实现收发邮件(三)接收邮件

JavaMail实现收发邮件(四)各大主流邮件服务器地址

时间: 2024-08-05 15:20:51

JavaMail实现收发邮件(五)使用SSL实现加密传输的相关文章

webservice 采用SSL实现加密传输

本文转自:http://book.51cto.com/art/200906/129770.htm http://yeweiyun868.blog.163.com/blog/static/563784432011112985215397/ 7.9.2  采用SSL实现加密传输(1) 在默认情况下,IIS使用HTTP协议以明文形式传输数据,Web Service就是使用HTTP协议进行数据传输的.Web Service传输的数据是XML格式的明文.没有采取任何加密措施,用户的重要数据很容易被窃取,如

JavaMail实现收发邮件——(一)相关概念概述

一.JavaMail概述:        JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: l         SMTP:简单邮件传输协议,用于发送电子邮件的传输协议: l         POP3:用于接收电子邮件的标准协议: l         IMAP:互联网消息协议,是POP3的替代协议. 这三种协议都有

JavaMail实现收发邮件——(三)接收邮件

JavaMail接收邮件和发送邮件基本一致,大体上是把Transport换成了Store.不过和发送相比,难点是对接收到的邮件进行解析,不然看起来就跟乱码一样.之所以解析这一块难,就在于一封未知的邮件你不知道它的结构是怎样的,因此需要我们通过判断一步步解析.对于这一点,我也不是很清楚,所以下面我就瞎写一点基础的. 一.首先连接POP3服务器获取邮件 (1)创建Properties对象以及Session对象 // 创建一个有具体连接信息的Properties对象   Properties prop

SSL/TLS加密传输与数字证书解读

什么是ssl? secure socket layer(ssl)协议最初由netscape企业发展,现已成为网络用来鉴别网站和网页浏览者身份,以及在浏览器使用者及网页服务器之间进行加密通讯的全球化标准.由于ssl技术已建立到所有主要的浏览器和web服务器程序中,因此,仅需安装数字证书,或服务器证书就可以激活服务器功能了. 什么是服务器证书? 服务器证书是安装在你的web服务器上,你可将服务器证书视为一种可以让访问者利用网页浏览器来验证网站真实身份的数字证明,且可以通过服务器证书进行具有ssl加密

使用JavaMail收发邮件

概述 邮件相关的标准 厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: SMTP(Simple Mail Transfer Protocol):即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. POP3(Post Office Protocol - Version 3):即邮局协议版本3,用于接收电子邮件的标准协议. IMAP(Internet Mail Access Protocol):即Internet邮件访问

JavaMail收发邮件介绍(包你会,能收发)

概述 邮件相关的标准 厂商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: SMTP(Simple Mail Transfer Protocol) :即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. POP3(Post Office Protocol - Version 3) :即邮局协议版本 3 ,用于接收电子邮件的标准协议. IMAP(Internet Mail Access Protocol) :即 Inte

JavaMail实现带附件的收发邮件

一.前言 参考博客: http://blog.csdn.net/xietansheng/article/details/51722660 http://www.cnblogs.com/HigginCui/p/5764509.html 关于JavaMail实现带附件的收发邮件网上的例子很多,自己兴趣来了,自己也动手尝试了一番. 其中问题大部分在代码注释中,这里也就不过多描述了,直接上代码作为记录,方便以后查阅. 二.工程目录 三.工程代码 1.Mail.java package com.xie.u

Android使用javamail收发邮件

Android里访问网络.收发短信都还是经常用到的功能,但是这次需求是可以收发邮件,网上搜了下,这里转一个,博主写的几个工具类确实非常好用,转帖过来,下面是需要用到的资源和工具类文件 http://pan.baidu.com/s/1hqejT7A 在发送多用户邮件中我添加了发送带附件的邮件的代码 1 发送邮件 今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题不用第三方邮件程序.为了以后使用方便,自己写了段代码. Javamail-Android配置步骤: 下载An

linux 下 搭建邮件邮件服务器(Postfix+Dovecot)(二)-基于mysql的虚拟账户登陆收发邮件

使用虚拟用户收发邮件安装九.安装Courier authentication library 1.courier简介courier-authlib 是Courier组件中的认证库,它是courier组件中一个独立的子项目,用于为courier的其它组件提供认证服务.其认证功能通常包括验证登录时的账号和密码.获取一个相关的家目录或邮件目录等信息.改变账号的密码.而其认证的实现方式也包括基于PAM通过/etc/passwd和/etc/shadow进行认证,基于GDBM或DB进行认证,基于LDAP/M