邮件推送SSL/TLS加密连接

邮件服务器使用的是未加密的连接,使用未加密网络发送敏感信息可能会被恶意攻击者通过拦截网络通信读取并修改信息。邮件发送加密通道分为SSL和TLS两种方式,SSL“安全套接层”协议,TLS“安全传输层”协议,都属于是加密协议(详细介绍 点击这里),加密模式下各协议端口也发生变化,不同的邮箱可能端口不同,基本上

stmp非SSL默认端口25   SSL加密端口465(网易加密多一个994) 
POP3非SSL端口是110   SSL加密端口995
imap非SSL端口是143     SSL加密端口993

注意网络策略的同步修改,详细端口可以查看https://www.cnblogs.com/shangdawei/p/4305989.html,我这里使用网易163发送

 

SSL加密

注意以下几个配置

        properties.put("mail.smtp.ssl.enable", "true");
        properties.put("mail.smtp.ssl.socketFactory", sf);

端口号:465

TLS加密

注意以下几个配置

        properties.put("mail.smtp.starttls.enable", "true"); //开启tls

端口号:25

示例代码:

如果需要邮件内识别html代码,在设置内容使用setContent并制定格式text/html;charset=utf-8,如果不需要识别html直接setText即可

            // 消息   消息内容,"text/html;charset=utf-8"让其识别html代码
            messageBodyPart.setContent(msg, "text/html;charset=utf-8");

package com.mail;

import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
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;

import com.sun.mail.util.MailSSLSocketFactory;

public class SendMailTestMain {

	public static void main(String[] args) {
		
		
		String ACCOUNT = "[email protected]";//发件人
		String MAILPASS = "xxxxx";//发件人,邮箱授权码
		String host = "smtp.163.com";
		//stmp非SSL加密默认端口25   SSL加密端口465(网易加密多一个994) 
		//POP3非SSL加密端口是110 SSL加密995
		//imap非SSL加密端口是143 SSL加密993
		//https://www.cnblogs.com/shangdawei/p/4305989.html
		int port = 465; 
		String receive = "[email protected]";
		String subject = "邮件发送";
		//指定内容格式"text/html;charset=utf-8"让其识别html代码
		String msg = "邮件内容<a href=\"https://blog.csdn.net/myfmyfmyfmyf\">支持标签</a>";
		String filename = "E:\\测试.doc";//附件
		
		try {
//			//SSL发送邮件
//			port = 465; 
//			boolean flag = SendMailTestMain.sendMailBySSL(ACCOUNT, MAILPASS, host, port,receive, subject, msg, filename);
			
			//TLS发送邮件
			port = 25;
			boolean flag = SendMailTestMain.sendMailByTLS(ACCOUNT, MAILPASS, host, port, receive, subject, msg, filename);
			System.out.println("邮件发送结果:"+flag);
		} catch (GeneralSecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//使用SSL加密通道
	public static boolean sendMailBySSL(String ACCOUNT,String MAILPASS,String host,int port, String receive, String subject, String msg, String filename) throws GeneralSecurityException {

        // 发件人电子邮箱
        final String from = ACCOUNT;
        // 发件人电子邮箱密码    这个密码是邮箱的客户端授权密码
        final String pass = MAILPASS;
        // 指定发送邮件的主机为 smtp.qq.com
        // 获取系统属性
        Properties properties = System.getProperties();
        // 设置邮件服务器      
        properties.setProperty("mail.smtp.host", host);
        // 端口号
        properties.put("mail.smtp.port", port);
        properties.put("mail.smtp.auth", "true");
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable", "true");
        properties.put("mail.smtp.ssl.socketFactory", sf);
        // 获取默认session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() { // qq邮箱服务器账户、第三方登录授权码
                return new PasswordAuthentication(from, pass); // 发件人邮件用户名、密码
            }
        });
        try {
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);
            // Set From: 头部头字段   发件人邮箱
            message.setFrom(new InternetAddress(from));
            // Set To: 头部头字段 收件人邮箱
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(receive));
            // Set Subject: 主题文字  主题
            message.setSubject(subject);
            // 创建消息部分
            BodyPart messageBodyPart = new MimeBodyPart();
            // 消息   消息内容,"text/html;charset=utf-8"让其识别html代码
            messageBodyPart.setContent(msg, "text/html;charset=utf-8");
            // 创建多重消息
            Multipart multipart = new MimeMultipart();
            // 设置文本消息部分
            multipart.addBodyPart(messageBodyPart);
            // 附件部分 添加附件
            messageBodyPart = new MimeBodyPart();
            // 设置要发送附件的文件路径   filename 是要添加的附件的路径   如 "E:\测试.doc"
            DataSource source = new FileDataSource(filename);
            messageBodyPart.setDataHandler(new DataHandler(source));
            // messageBodyPart.setFileName(filename);
            // 处理附件名称中文(附带文件路径)乱码问题
            messageBodyPart.setFileName(MimeUtility.encodeText(filename));
            multipart.addBodyPart(messageBodyPart);
            // 发送完整消息
            message.setContent(multipart);
            // 发送消息
            Transport.send(message);
            // System.out.println("Sent message successfully....");
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return false;
    }
	
	
	
	//使用TLS加密通道
	public static boolean sendMailByTLS(String ACCOUNT,String MAILPASS,String host,int port, String receive, String subject, String msg, String filename) throws GeneralSecurityException {

        // 发件人电子邮箱
        final String from = ACCOUNT;
        // 发件人电子邮箱密码    这个密码是邮箱的客户端授权密码
        final String pass = MAILPASS;
        // 指定发送邮件的主机为 smtp.qq.com
        // 获取系统属性
        Properties properties = System.getProperties();
        // 设置邮件服务器      
        properties.setProperty("mail.smtp.host", host);
        // 端口号
        properties.put("mail.smtp.port", port);
        properties.put("mail.smtp.auth", "true");
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.starttls.enable", "true"); //开启tls
        // 获取默认session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() { // qq邮箱服务器账户、第三方登录授权码
                return new PasswordAuthentication(from, pass); // 发件人邮件用户名、密码
            }
        });
        try {
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);
            // Set From: 头部头字段   发件人邮箱
            message.setFrom(new InternetAddress(from));
            // Set To: 头部头字段 收件人邮箱
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(receive));
            // Set Subject: 主题文字  主题
            message.setSubject(subject);
            // 创建消息部分
            BodyPart messageBodyPart = new MimeBodyPart();
            // 消息   消息内容,"text/html;charset=utf-8"让其识别html代码
            messageBodyPart.setContent(msg, "text/html;charset=utf-8");
            // 创建多重消息
            Multipart multipart = new MimeMultipart();
            // 设置文本消息部分
            multipart.addBodyPart(messageBodyPart);
            // 附件部分 添加附件
            messageBodyPart = new MimeBodyPart();
            // 设置要发送附件的文件路径   filename 是要添加的附件的路径   如 "E:\测试.doc"
            DataSource source = new FileDataSource(filename);
            messageBodyPart.setDataHandler(new DataHandler(source));
            // messageBodyPart.setFileName(filename);
            // 处理附件名称中文(附带文件路径)乱码问题
            messageBodyPart.setFileName(MimeUtility.encodeText(filename));
            multipart.addBodyPart(messageBodyPart);
            // 发送完整消息
            message.setContent(multipart);
            // 发送消息
            Transport.send(message);
            // System.out.println("Sent message successfully....");
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return false;
    }
}

 

 

版权声明:本文为myfmyfmyfmyf原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/myfmyfmyfmyf/article/details/91365995

智能推荐

使用kuiper基于tls/ssl连接emq全过程

关于EMQ的介绍,官方文档 https://docs.emqx.cn/cn/broker/latest/ 关于kuiper的介绍,官方文档 https://docs.emqx.cn/cn/kuiper/latest/ 本文将介绍如何使用kuiper基于tls连接emq的全过程。 准备两台服务器(一台也可以), 安装EMQ 一台安装EMQ,docker启动,启动命令如下 1883 MQTT 协议端口...

第三方库PNChart的使用

PNChart 是一个强大的带动画的图表库   要是用这个库可以使用pods,也可以直接将库导入项目中,必须引入"PNChart.h"头文件   下面我们来看一下代码!      转载于:https://www.cnblogs.com/aeronfay/articles/4929223.html...

LeetCode刷题笔记(10)-BFS广度优先搜索

LeetCode刷题笔记(10)-BFS广度优先搜索 127、单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则: 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典中的单词。 输入: beginWord = “hit”, endWord = &ldqu...

线性筛选素数的方法及基于线性筛选素数的欧拉函数筛选莫比乌斯函数筛选

欧拉筛法线性求素数 回忆一下经典的埃式筛法求素数。时间复杂度是为O(nloglogn)(我之前一直以为是O(n))O(nloglogn)(我之前一直以为是O(n)) 显然,当一个数是素数的时候,那么他的倍数肯定是合数,筛选标记即可 我们来举个列子 筛选2-10的素数 首先2是素数,然后把其倍数删去,我们标记下删去的次数用一个斜杠表示删去了一次 之后3是素数,继续删去倍数,这个时候发现6被重复删去两...

JEECG 页面多个用户选择器只显示最后一个

在一个页面当中,我们可能会需要有多个的用户选择器进行快速的录入,此时会发现所有的输入都会在最后一个用户选择器的地方显示 查看页面代码当中的ID也是不一致: 查看通过标签生成之后的源码,可以发现所有的用户选择器都会生成一个 点击输入框调用的js方法都是一样的,看到这里也就可以明白为什么都是只有最后一个用户选择输入框当中有数据了。 因此我们对后台当中标签代码生成部分进行改造,让其支持多个用户选择器: ...

猜你喜欢

力扣47 全排列ii 回溯加剪枝

 这题难点在于先排序,然后重复的数字112 used[i-1]= fase 代表之前我用过了,就是我俩 1前面的用过了现在这一个我就直接跳过去    ...

arp协议

arp协议叫做地址解析协议,通常与ip地址共同使用,将ip地址转换成硬件地址(MAC地址)。arp既可以放在网络层,也可以放在数据链路层,因为它做了两层的工作。 当一个主机向另一个主机发送数据报时,通过arp协议,向局域网中发送arp请求,所有在局域网中的主机都可以收到,但会在网络层丢弃,只有一台符合目的ip的主机会发送给源主机arp响应包含自己mac地址,因此源主机就可以向目的主机发送报文。 l...

模拟登陆改版后的知乎(最新版)

今天,想着看看视频,把模拟登陆这一块学习学习,以后弄把梯子,去爬爬FaceBook什么的。就拿知乎练练手吧,可曾想,知乎竟然改版了!!之前的教程书籍对现在的知乎来说,都是扯淡,连页面都找不到了。下面一起谈谈改版后的纸糊的模拟登陆吧。 页面分析 抓包 首先,打开页面:https://www.zhihu.com/signup?next=%2F(登录网址都变了…),F12,输入账号密码(记...

干货分享——比微信域名防封防举报更牛逼的防封方案

从微信兴起到现在,微信的流量就一直居高不下,在淘宝时代和传统的电商时代,只要把广告打出去,别人通过搜索就可以找到我们,所以,移动互联网的到来,在微信爆棚的今天,都想在微信里面推广自己的产品,借力微信,达到客户沉淀,营销宣传,传播影响的目的,可以由于微信种种机制,有人腾讯要维护自身的利益,也有人说是微信要营造一个健康的生态圈,种种限制,比如分享次数过多,域名会被微信拦截屏蔽封杀,还比如微信中的链接不...

mysql的事务提交(java)

个人理解的一个事务:是一个Connection一系列的操作过程,如果是两个Connection连接在操作,那就是两个事务。 事务的前提:数据库的存储引擎是innodb。 事务的目的:保证数据的安全性。 事务安全:  1.自动提交事务:每执行一条sql语句,就同步到数据库中。  2.手动提交事务:执行一系列的sql语句后一起同步到数据库中。 事务的四大特性:  A(at...