Java JavaMail通过SMPT发送邮件
概述
本讲讲述如何使用JavaMail工具包,通过SMPT协议,在Java代码中发送邮件。
一、JavaMail简介
JavaMail API提供了一个独立于平台且与协议无关的框架来构建邮件和消息传递应用程序。 JavaMail API提供了一组抽象类,用于定义组成邮件系统的对象。 它是一个可选包(标准扩展名),用于阅读,撰写和发送电子邮件。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。
JavaMail提供了用于构建消息传递系统接口的元素,包括系统组件和接口。 虽然此规范没有定义任何特定的实现,但JavaMail确实包含几个实现RFC822和MIME Internet消息传递标准的类。 这些类作为JavaMail类包的一部分提供。
以下是JavaMail API支持的一些协议:
- SMTP : Simple Mail Transfer Protocol缩写。 它提供了一种传递电子邮件的机制。
- POP : Post Office Protocol缩写。 POP是大多数人用来获取邮件的机制。 它定义了对每个用户的单个邮箱的支持。 RFC 1939定义了该协议。
- IMAP : Internet Message Access Protocol缩写。 它是用于接收消息的高级协议。 它为每个用户提供多个邮箱支持,此外,邮箱可以由多个用户共享。 它在RFC 2060中定义。
- MIME : Multipurpose Internet Mail Extensions缩写。 。 它不是邮件传输协议。 相反,它定义了传输内容:消息的格式,附件等。 这里有许多不同的文档:RFC 822,RFC 2045,RFC 2046和RFC 2047.作为JavaMail API的用户,您通常不需要担心这些格式。 但是,这些格式确实存在并由您的程序使用。
- NNTP and Others :第三方提供商提供了许多协议。 其中一些是网络新闻传输协议(NNTP),安全多用途Internet邮件扩展(S/MIME)等。
JavaMail包中用于处理电子邮件的核心类是:Session,Message,Address,Authenticator,Store,Transport, Folder等。Session定义了一个基本的邮件会话,它需要从Properties中读取类似于邮件服务器,用户名和密码等信息。不过JDK中并没有包含,使用JavaMail发送邮件需要使用Sun发布的mail.jar和activtion.jar两个包。
开启邮箱客户端的SMTP协议功能
通过邮箱服务供应商,使用SMTP协议发送邮件一般需要开启权限并获取SMTP用户认证信息。
以163邮箱为例,需要在163邮箱网页上设置,并申请开启功能。然后你将获取一个密钥(记录保存下来),你的邮箱账号加上这个密钥就是接下来用于SMTP用户认证的用户名和密码。
可以参考开启客户端协议的官方文档 。
代码
String username = "XXXXXXX@163.com(这是一个邮箱)";// TODO: 按需修改
String password = "这是一个密码(一般在邮箱服务商上申请)";// TODO: 按需修改
/******************************************** 第一步,设置邮箱服务器相关的链接和属性 **/
//协议的配置属性
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com");//邮箱服务区地址// TODO: 按需修改
//使用非ssl端口
props.put("mail.smtp.port", "25");
//使用ssl端口
// final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
// props.put("mail.smtp.socketFactory.port", "465");
// props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
// props.put("mail.smtp.socketFactory.fallback", "false");
// props.put("mail.smtp.starttls.enable", "true");
//上面的 ssl端口 和 非ssl端口 二选一
//开启smtp用户认证
props.put("mail.smtp.auth", "true");
//获取邮件session(此session不同于http session),传递Authenticator对象,用于用户身份认证
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
//开启session运行时的debug日志输出
session.setDebug(true);
/******************************************** 第二步,开始设置邮件的属性 **/
//Message对象,将存储我们实际发送的电子邮件信息
MimeMessage message = new MimeMessage(session);
//设置发件方地址
message.setFrom(new InternetAddress("一个邮件地址"));// TODO: 按需修改
/**
* 设置接受方地址(收件方地址的情况)
* Message.RecipientType.TO 表示主要的接收方
* Message.RecipientType.CC 表示抄送
* Message.RecipientType.BCC 表示密送
* 发送给单个或多个接收方可以自由组合,或者取其一种
*/
message.setRecipient(Message.RecipientType.TO, new InternetAddress("邮件地址1"));// TODO: 按需修改
//同时发给多个接收方的时候用这个
InternetAddress[] internetAddresses = new InternetAddress[2];
internetAddresses[0] = new InternetAddress("邮件地址1");// TODO: 按需修改
internetAddresses[1] = new InternetAddress("邮件地址2");// TODO: 按需修改
message.setRecipients(Message.RecipientType.CC, internetAddresses);
//设置邮件主题(标题)
message.setSubject("Hello Subject", "UTF-8");
/******************************************** 第三步,开始填充邮件的内容(邮件正文) **/
//////////第一种形式,纯文本正文(可以设置为html格式的字符串,邮件客户端会自动解析成html)
// String textBody = "hello, this email was sent via JavaMail.";
// message.setText(textBody, "UTF-8");
//////////第二种形式,MIME形式的正文(可以给邮件添加附件,或者给html添加关联的附件等)
Multipart multipart = new MimeMultipart();
BodyPart htmlTextpart = new MimeBodyPart();
//html中内嵌图片,通过网页urlimg方式(这种方式图片数据在互联网上)
String htmlImageUrl = "https://pic.cnblogs.com/avatar/2062798/20200614130312.png";// TODO: 按需修改
String body = "<h1>Hello</h1><p><img src=\"" + htmlImageUrl + "\" alt=\"图片加载失败,请尝试刷新页面\" referrerpolicy=\"no-referrer\"></p>";
//html中内嵌图片,通过附件附件方式(这种方式图片数据在邮件中)
body += "<h1>Hello2</h1><p><img src=\"cid:img01\" alt=\"图片加载失败,请尝试刷新页面\" referrerpolicy=\"no-referrer\"></p>";
htmlTextpart.setContent(body, "text/html;charset=utf-8");
multipart.addBodyPart(htmlTextpart);
//打开要嵌入的文件
File file = new File("C:\\Users\\user\\Pictures\\Camera Roll\\image.jpg");// TODO: 按需修改
InputStream inputStream = new FileInputStream(file);
BodyPart imagepart = new MimeBodyPart();
imagepart.setFileName("一张平平无奇的图片.jpg");//
imagepart.setDataHandler(new DataHandler(new ByteArrayDataSource(inputStream, "image/jpeg")));
imagepart.setHeader("Content-ID", "<img02>");//value要和图片的cid对应才能嵌入在html中,否则就会变成附件
multipart.addBodyPart(imagepart);
//邮件的附件(图片不设置header就是附件)
BodyPart attachment = new MimeBodyPart();
attachment.setFileName("一张平平无奇的图片.jpg");//
attachment.setDataHandler(new DataHandler(new ByteArrayDataSource(inputStream, "image/jpeg")));
multipart.addBodyPart(attachment);
//要调用setContent填入正文信息,和纯文本的形式不同
message.setContent(multipart);
//通过Transport类发送邮件(这时候才开始有网络连接)
Transport.send(message);
maven依赖
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
什么是SMTP
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件
的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件
时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程
只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。SMTP
是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。
什么是MIME
MIME, 全称为“Multipurpose Internet Mail Extensions”, 比较确切的中文名称为“多用途互联网邮件扩展”。它是当前广泛应用的一种电子邮件技术规范,基本内容定义于RFC 2045-2049
什么是MIME类型?-在把输出结果传送到浏览器上的时候,浏览器必须启动适当的应用程序来处理这个输出文档。这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成。在HTTP中,MIME类型被定义在Content-Type header中。
MIME不属于一个邮件传输协议,它只是对SMTP的一个扩展,不能替代SMTP协议,至于为啥要替换SMTP了。主要是因为SMTP协议在传输报文时,只能够传输7位的ASCII格式的报文,不支持那些不使用7位ASCII格式的语种,同时它也不支持语音和视频数据的传输,因此我们需要一个辅助性协议帮忙传输报文,它就是MIME。
参考
JavaMail - 教程
廖雪峰教程 - 发送email
SMTP增强状态代码注册表
JavaMail--基础类详解
使用JavaMail发送邮件,465端口开启ssl加密传输
JavaMail配置属性
SMTP协议介绍
如果有不对的地方感谢指出
Java JavaMail通过SMPT发送邮件的更多相关文章
- JavaMail SMTP服务器发送邮件程序示例 java通过dns服务器解析ip地址
/** * JavaMail SMTP服务器发送邮件程序示例 * 扮演SMTP服务器角色与邮件客户端软件最大的区别就是: * SMTP服务器需要解析不同接收人邮件地址主机名对应的SMTP服务器主机名 ...
- 【Mail】JavaMail介绍及发送邮件(一)
JavaMail介绍 JavaMail是SUN提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持常用的邮件协议,如SMTP.POP3.IMAP,开发人员使用JavaMail ...
- java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板
java 利用spring JavaMailSenderImpl发送邮件,支持普通文本.附件.html.velocity模板 博客分类: Java Spring 本文主要介绍利用JavaMailS ...
- Java 学习(18):Java 序列化& 网络编程& 发送邮件
--Java 序列化 -- 网络编程 -- 发送邮件 Java 序列化 Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据.有关对象的类型的信 ...
- (三)集成 JavaMail ,实现异步发送邮件
集成 JavaMail ,实现异步发送邮件 1.JavaMail的核心API 1.1 API功能图解 1.2 API说明 1.2.1 Message 类: 1.2.2 Transport 类 1.2. ...
- 【SSH网上商城项目实战25】使用java email给用户发送邮件
转自: https://blog.csdn.net/eson_15/article/details/51475046 当用户购买完商品后,我们应该向用户发送一封邮件,告诉他订单已生成之类的信息, ...
- java中使用javaMail工具类发送邮件
1.引入依赖 <!--javaMail--> <dependency> <groupId>javax.mail</groupId> <artifa ...
- 使用JavaMail创建邮件发送邮件
一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...
- [Java] JavaMail 发送带图片的 html 格式的邮件
JavaMail 发送的邮件正文和附件是相互独立的,但是内置图片需要定位图片在正文中的位置,所以内置图片和邮件正文是互相依赖的. 发送带附件的邮件可参考JavaMail 发送 html 格式.带附件的 ...
随机推荐
- 关于json对象的使用小结!
json是前后端数据交互的关键.后端提供的接口中的数据几乎都是通过json来表现的,所以,需要对这个json做一些小结: 这里要推进谷歌的插件Fehelp前端助手,这个可以清楚的看到json的数据: ...
- Water 2.5.8 发布,一站式服务治理平台
Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...
- Java习题
public class ClassTest{ String str = new String("hello"); char[] ch = {'a','b','c'}; publi ...
- MFC---视图和窗口
视类窗口 视类窗口是指程序运行后,显示信息的那一部分.对应的类是CTestOneView(TestOne表示项目名称)类,CTestOneView类是派生于CView类,而CView类又派生于CWnd ...
- python中faker模块的使用
Faker 安装 pip install Faker 基本使用 from faker import Faker #创建对象,默认生成的数据为为英文,使用zh_CN指定为中文 fake = Faker( ...
- Python夺命20问
1.请观看下列代码并回答问题: import collections from random import choice Card = collection.namedtuple('Card', [' ...
- vue学习day02
vue 指令 1. 内容渲染指令 v-text 指令的缺点:会覆盖元素内部原有的内容! {{ }} 插值表达式:在实际开发中用的最多,只是内容的占位符,不会覆盖原有的内容! v-html 指令的作用: ...
- 查找SQL SERVER卡顿语句
SELECT [session_id], [blocking_session_id] AS '正在阻塞其他会话的会话ID', DB_NAME([database_id]) AS '数据库名称', [r ...
- MATLAB R2019b超详细安装教程(附完整安装文件)
摘要:本文详细介绍Matlab的安装步骤,为方便安装这里提供了完整安装文件的百度网盘下载链接供大家使用.从文件下载到证书安装本文都给出了每个步骤的截图,按照图示进行即可轻松完成安装使用.本文目录如首页 ...
- Python识别图片中的文字
1 import os,glob 2 def photo_compression(original_imgage,tmp_image_path): 3 '''图片备份.压缩:param origina ...