JavaMail| Apache Commons Email介绍

2024-06-09 12:38

本文主要是介绍JavaMail| Apache Commons Email介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Apache Commons Email简介

Apache Commons Email旨在提供一个用于发送电子邮件的API。它建立在JavaMail API之上,旨在简化它。

  • 官网:

http://commons.apache.org/proper/commons-email/

  • 版本选择:

Apache Commons Email 1.5 (最新版)

  • 下载地址:

Commons-Email:

http://commons.apache.org/proper/commons-email/download_email.cgi

JavaMail:

https://github.com/javaee/javamail/releases

  • Maven依赖
<dependencies>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-email</artifactId><version>1.5</version>
</dependency>
<dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.5.6</version>
</dependency>
</dependencies>
  • API:

http://commons.apache.org/proper/commons-email/javadocs/api-release/index.html

TLS和SSL协议介绍

SSL协议

SSL(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。

SSL协议提供的服务主要有:

  1. 认证用户和服务器,确保数据发送到正确的客户机和服务器;

  2. 加密数据以防止数据中途被窃取;

  3. 维护数据的完整性,确保数据在传输过程中不被改变。

TLS协议

TLS(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。

SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。

SSL协议与TLS协议关系

最新版本的TLS(Transport Layer Security,传输层安全协议)是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。

TLS与SSL的差异,简单的理解就是并列关系,其主要的差异体现在一下几个方面:

1)版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0使用的版本号为SSLv3.1。

2)报文鉴别码:SSLv3.0和TLS的MAC算法及MAC计算的范围不同。TLS使用了RFC-2104定义的HMAC算法。SSLv3.0使用了相似的算法,两者差别在于SSLv3.0中,填充字节与密钥之间采用的是连接运算,而HMAC算法采用的是异或运算。但是两者的安全程度是相同的。

3)伪随机函数:TLS使用了称为PRF的伪随机函数来将密钥扩展成数据块,是更安全的方式。

4)报警代码:TLS支持几乎所有的SSLv3.0报警代码,而且TLS还补充定义了很多报警代码,如解密失败(decryption_failed)、记录溢出(record_overflow)、未知CA(unknown_ca)、拒绝访问(access_denied)等。

5)密文族和客户证书:SSLv3.0和TLS存在少量差别,即TLS不支持Fortezza密钥交换、加密算法和客户证书。

6)certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息计算MD5和SHA-1散列码时,计算的输入有少许差别,但安全性相当。

7)加密计算:TLS与SSLv3.0在计算主密值(master secret)时采用的方式不同。

8)填充:用户数据加密之前需要增加的填充字节。在SSL中,填充后的数据长度要达到密文块长度的最小整数倍。而在TLS中,填充后的数据长度可以是密文块长度的任意整数倍(但填充的最大长度为255字节),这种方式可以防止基于对报文长度进行分析的攻击。

Apache Commons Email使用介绍

Email类图结构:

这里写图片描述

简单文本电子邮件

public static void aliyun() throws EmailException {Email email = new SimpleEmail();email.setHostName("smtp.aliyun.com");email.setSmtpPort(465);email.setAuthenticator(new DefaultAuthenticator("yveshe@aliyun.com", "邮箱密码"));email.setSSLOnConnect(true);email.setCharset("UTF-8");email.setSubject("TestMail");email.setFrom("yveshe@aliyun.com");email.setMsg("你好,This is a test mail ... :-)");email.addTo("879838091@qq.com");email.send();System.out.println("Success!");}

注意:

Email 实例对象的setHostName(”mail.myserver.com”)的显示调用设置将用于发送邮件的传出SMTP服务器的地址。如果没有设置,将从系统属性“mail.host”中获得.

带附件的电子邮件

public static void attachmentsEmail() throws EmailException {// Create the attachmentEmailAttachment attachment = new EmailAttachment();attachment.setPath("resources/Yves.jpg");attachment.setDisposition(EmailAttachment.ATTACHMENT);attachment.setDescription("Picture of Yves"); // 附件描述,无实际意义attachment.setName("Yves.jpg"); // 设置附件名称// attachment.setURL(new URL("http://www.apache.org/images/asf_logo_wide.gif")); //附件可以是网络资源// Create the email messageMultiPartEmail email = new MultiPartEmail();email.setHostName("smtp.aliyun.com");email.addTo("879838091@qq.com", " QQ_Yves");email.setFrom("yveshe@aliyun.com", " Aliyun_Yves");email.setSubject("The picture");email.setMsg("Here is the picture you wanted");// Authenticatoremail.setSSLOnConnect(true);email.setSmtpPort(465);email.setAuthenticator(new DefaultAuthenticator("yveshe@aliyun.com", "邮箱密码"));// add the attachmentemail.attach(attachment);email.send();System.out.println("Success!");}

HTML格式的邮件

发送HTML格式的电子邮件是通过使用HtmlEmail类来完成的。该类的工作方式与MultiPartEmail类完全相同,其中包括用于设置html内容的方法,如果收件人不支持HTML电子邮件,则添加替代文本内容,并添加内嵌图像。

public static void htmlEmail() throws EmailException, MalformedURLException {// Create the email messageHtmlEmail email = new HtmlEmail();email.setHostName("smtp.aliyun.com");email.addTo("879838091@qq.com", "QQ_Yves");email.setFrom("yveshe@aliyun.com", "Aliyun_Yves");email.setSubject("Test email with inline image");email.setAuthenticator(new DefaultAuthenticator("yveshe@aliyun.com", "邮箱密码"));// embed the image and get the content idURL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");String cid = email.embed(url, "Apache logo"); // 该字符串是随机生成的标识符,必须用于引用图像标签中的图像。System.out.println(cid);// set the html messageemail.setHtmlMsg("<html>The apache logo - <img src=\"cid:" + cid + "\"></html>");// set the alternative messageemail.setTextMsg("Your email client does not support HTML messages");// 注意:setHtmlMsg或者setTextMsg// 而不是setMsg方法// send the emailemail.send();System.out.println("Success!");}

如果在我们的电子邮箱中,使用的内嵌图数量很少时,可以使用上面的方式,但是如果是大量的内嵌在线图片时,我们可以通过使用ImageHtmlEmail来解决每次输入全路径的URL问题.

public static void htmlEmailEmbeddedImg() throws EmailException, MalformedURLException {// load your HTML email templateString htmlEmailTemplate = ".... <img src=\"images/feather.gif\"> ...."; // 配置了URL可以写成images/feather.gif// define you base URL to resolve relative resource locationsURL url = new URL("http://www.apache.org");// create the email messageImageHtmlEmail email = new ImageHtmlEmail();email.setDataSourceResolver(new DataSourceUrlResolver(url));email.setHostName("smtp.aliyun.com");email.addTo("879838091@qq.com", "QQ_Yves");email.setFrom("yveshe@aliyun.com", "Aliyun_Yves");email.setSubject("Test email with inline image");// Authenticatoremail.setSSLOnConnect(true);email.setSmtpPort(465);email.setAuthenticator(new DefaultAuthenticator("yveshe@aliyun.com", "邮箱密码"));// set the html messageemail.setHtmlMsg(htmlEmailTemplate);// set the alternative messageemail.setTextMsg("Your email client does not support HTML messages");// send the emailemail.send();System.out.println("Success!");}

说明:我们创建一个引用一些图像的HTML电子邮件模板。所有引用的图像都通过指定的DataSourceResolver自动转换为内嵌图像。

调试

JavaMail API支持一个调试选项,如果遇到问题可能会非常有用。您可以通过调用setDebug(true)来激活任何邮件类的调试。调试输出将被写入System.out。如果是想尝试各种安全设置或commons-email的功能可以参考JavaMail项目中的 EmailLiveTest和EmailConfiguration,它们用于测试commons-email与真正的SMTP服务器。

认证

如果您需要向SMTP服务器进行身份验证,则可以在发送电子邮件之前调用 setAuthentication(userName,password)方法。这将创建一个DefaultAuthenticator的实例,在邮件发送时这个实例 将被JavaMail API使用。您的服务器必须支持RFC2554才能正常工作。

如果需要更复杂的身份验证方法,例如通过创建javax.mail.Authenticator对象的子类来向用户显示对话框 。需要重写getPasswordAuthentication()方法,将在其中处理收集用户的信息。要使用自定义的认证类,需要使用 Email.setAuthenticator(final Authenticator newAuthenticator)方法进行设置。

安全

在使用公共SMTP服务器时,不应使用普通的SMTP协议,而应该使用加密协议,下面是两种常见的加密协议:

  • STARTTLS on port 25

  • SSL on port 465

关于TLS和SSL协议的可以看第二小节的具体介绍.

通常在默认情况下会是不进行安全检查的()默认情况下是禁用),在编写程序时,我们可以通过代码设置来强制执行以下安全检查:

  • 使用安全传输(STARTTLS或SSL)时,可以通过调用Email.setSSLCheckServerIdentity(true)强制验证服务器的证书。

或者Email实例对象的setSSLOnConnect(true)方法来设置.

  • 通过调用Email.setStartTLSRequired(true)来强制使用STARTTLS。

或者Email实例对象的setStartTLSEnabled (true)方法来设置.

处理退回的邮件

通常情况下,无法传递给收件人的邮件将返回给发件人(使用from属性指定)。但是,在某些情况下,您需要将这些地址发送到不同的地址。要做到这一点,只需在发送电子邮件之前调用Email实例对象的 setBounceAddress(emailAddressString)方法即可。

说明:当SMTP服务器无法发送邮件时,他们不会注意邮件内容,以确定发送错误通知的位置。相反,他们引用SMTP“邮件发件人”值。JavaMail根据JavaMail Session中mail.smtp.from属性的值设置此值。(Commons Email 使用System.getProperties()初始化JavaMail Session)

如果这个属性mail.smtp.from没有被设置,那么JavaMail使用 "from" 的地址。如果您Email实例Bean 设置了bounceAddress属性,则Commons Email将使用它来设置mail.smtp.from的值, 当会话初始化时,它会覆之前所有设置的值.

注意事项

公网邮箱安全参数

Gmail的IMAP/SMTP/POP3地址

我们在客户端设置邮箱或者JavaMail编程的时候,我们都会去查找这些公网邮箱的 IMAP/SMTP/POP3 地址,这里总结了主流的邮件服务商关于IMAP/SMTP/POP3 地址和端口的参数设置。

Gmail的IMAP/SMTP/POP3 地址

服务器名称服务器地址SSL协议端口非SSL协议端口
IMAPimap.gmail.com993/
SMTPsmtp.gmail.com465/
POP3pop.gmail.com995/

QQMail的IMAP/SMTP/POP3地址

QQMail 的 IMAP/SMTP/POP3 协议默认是不开启的,你需要登陆到 QQ邮箱,然后到“设置” > “账户” 将其开启。

服务器名称服务器地址SSL协议端口非SSL协议端口
IMAPimap.qq.com993143
SMTPsmtp.qq.com465或58725
POP3pop.qq.com995110

163邮箱的IMAP/SMTP/POP3地址

服务器名称服务器地址SSL协议端口非SSL协议端口
IMAPimap.163.com993143
SMTPsmtp.163.com465或99425
POP3pop.163.com995110

阿里云邮箱的IMAP/SMTP/POP3地址

服务器名称服务器地址SSL协议端口非SSL协议端口
IMAPimap.aliyun.com993143
SMTPsmtp.aliyun.com46525
POP3pop3.aliyun.com995110

微软outlook邮箱的IMAP/SMTP/POP3地址

服务器名称服务器地址SSL协议端口非SSL协议端口
IMAPpod51003.outlook.com993/
SMTPpod51003.outlook.com/587(TLS)
POP3pod51003.outlook.com995/

邮箱授权码介绍

一些邮箱的服务商为了用户的使用安全推出了授权码,用于做为登录第三方客户端的专用密码。一般在邮箱账号的设置项中有开POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV的服务。然后通过平台验证就会获取该邮箱账号的授权码。

  • 这里以QQ邮箱获取授权码为例子介绍下,QQ邮箱的授权码基本操作如下:

QQ邮箱设置账户

我这里以开启IMAP/SMTP服务为例子

这里写图片描述

通过QQ的密密保验证后,我们可以看到下方的授权码

这里写图片描述

然后在我们的程序中将该授权码当做密码使用即可.

邮件图片不显示

一些邮箱服务商出于邮箱安全,将邮件内容中的图片未被显示。 出现这样的问题需要用户设置信任发件人,显示图片.

这里以QQ邮箱为例子:

这里写图片描述


这篇关于JavaMail| Apache Commons Email介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1045202

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数