发送邮件

在日常工作和生活中经常会用到电子邮件。例如,当注册一个新账户时,系统会自动给注册邮箱发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等。邮箱的使用基本包括这几步:先打开浏览器并登录邮箱,然后创建邮件再发送邮件。在这个过程中有大量的重复性工作且不能批量发送邮件,说明手动的方式效率太低。本节就介绍如何通过代码完成发送邮件的功能。

SMTP与发送一封邮件的步骤

电子邮件在网络中传输时需要遵从协议,常用的电子邮件协议包括SMTP、POP3、IMAP。其中,邮件的创建和发送只需要使用SMTP(Simple MailTransfer Protocol,简单邮件传输协议)。

如果需要给客户发送邮件,可以直接使用Java代码发送。发送邮件的过程是先登录指定的邮箱,然后再给用户发送邮件,因此需要配置邮箱的权限或者SMTP。本小节以QQ邮箱作为收件人,介绍怎么配置163邮箱发送邮件。首先登录163邮箱,选择“设置”标签,就会看到设置页面如图6.14所示。

必须开启IMAP/SMTP服务和POP3/SMTP服务,开启后可以看到服务器的地址,然后就可以使用Java配置163邮箱发送邮件了,这个很重要。

在网页上创建并发送一封电子邮件的步骤如下:

(1)创建一个邮件对象(MimeMessage)。

(2)设置发件人、收件人,可以增加多个收件人、抄送人。

(3)设置邮件的主题(标题)。

(4)设置邮件的正文(内容)。

(5)设置邮件的发送时间。

(6)发送邮件。

同理,在Java中发送邮件的步骤和上面相似,完成上述步骤就能成功发送邮件,具体的代码实现后面会详细介绍。

实战:使用Java Mail发送邮件

前面简述了邮件的发送过程,下面使用Java的API完成邮件的发送。

(1)在pom.xml中添加E-mail的依赖坐标:

<dependency>

<groupId>com.sun.mail</groupId>

<artifactId>javax.mail</artifactId>

<version>1.6.2</version>

</dependency>

(2)编写发送邮件的代码:

package com.example.springextenddemo.email;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import java.util.Date;

import java.util.Properties;

/**

* Java 发送邮件

*/

public class JavaSendMailDemo {

/**

* 邮箱账户

*/

public static String emailAddress = "changhe626@163.com";

/**

* 授权码 */

public static String emailPassword = "OTLXYXXOELTJRMSO";

// 发件人邮箱的SMTP服务器地址

public static String smtpHost = "smtp.163.com";

public static void main(String[] args) throws Exception {

// 1. 创建参数配置,用于连接邮件服务器的参数配置

Properties props = new Properties();

// 使用的协议(JavaMail规范要求)

props.setProperty("mail.transport.protocol", "smtp");

// 发件人邮箱的SMTP服务器地址

props.setProperty("mail.smtp.host", smtpHost);

// 是否需要请求认证

props.setProperty("mail.smtp.auth", "true");

// 2. 根据配置创建会话对象,用于和邮件服务器进行交互

Session session = Session.getInstance(props);

// 设置为debug模式,观察详细的发送日志

session.setDebug(true);

// 3. 创建一封邮件

MimeMessage message = createMimeMessage(session,

emailAddress,"1507775353@qq.com");

// 4. 根据 Session 获取邮件传输对象

Transport transport = session.getTransport();

//5. 输入邮箱账号和密码连接邮件服务器,这里认证的邮箱必须与message中的发

件人邮箱一致,否则会报错

transport.connect(emailAddress, emailPassword);

// 6.给所有的收件地址发送邮件,message.getAllRecipients() 获取的是在

创建邮件对象时添加的所有收件人、抄送人、密送人

transport.sendMessage(message, message.getAllRecipients());

// 7. 关闭连接

transport.close();

System.out.println("完成邮件的发送");

}

/**

* 创建一封只包含文本的简单邮件

* @param session 和服务器交互的会话

* @param sendMailAddress 发件人邮箱

* @param receiveMailAddress 收件人邮箱

* @return * @throws Exception

*/

public static MimeMessage createMimeMessage(Session session,

String sendMailAddress,

String receiveMailAddress) throws Exception {

// 1. 创建一封邮件

MimeMessage message = new MimeMessage(session);

// 2. From: 发件人

message.setFrom(new InternetAddress(sendMailAddress, "紫龙

神","UTF-8"));

// 3. To: 收件人(可以增加多个收件人、抄送和密送)

message.setRecipient(MimeMessage.RecipientType.TO, new

Internet Address(receiveMailAddress, "你好", "UTF-8"));

// 4. Subject: 邮件主题

message.setSubject("你好,请问你吃饭了没有啊", "UTF-8");

// 5. Content: 邮件正文(可以使用HTML标签)

message.setContent("你好,许久不见,想问问你吃饭了没有啊",

"text/html; charset=UTF-8");

// 6. 设置发件时间

message.setSentDate(new Date());

// 7. 保存设置

message.saveChanges();

return message;

}

}

上述代码演示了邮件从创建到发送的过程。运行代码,控制台上打印的发送邮件的日志如图6.15所示,发件箱的发送记录如图6.16所示,收件箱的收件记录如图6.17所示。可以看到,已经成功发送邮件。

说明:在实际开发中,一般会把邮件发送封装成一个工具类,然后再配置一个只发送邮件的邮箱,最后直接调用工具类完成邮件的发送。

实战:Spring Boot集成邮件发送

Spring Boot为邮件发送功能提供了自动配置类,开发者只需要加入相关依赖,然后再配置邮箱的基本信息就可以发送邮件了,相较于邮件发送工具,类更加简便。

下面介绍在Spring Boot项目中如何实现邮件发送的功能。

(1)在application.properties中添加E-mail配置文件,内容如下:

#email config

spring.mail.host=smtp.163.com

spring.mail.port=25

spring.mail.username=changhe626@163.com

spring.mail.password=OTLXYXXOELTJRMSO

spring.mail.default-encoding=UTF-8

spring.mail.properties.mail.debug=true

(2)编写邮件发送的服务类和具体方法:

package com.example.springextenddemo.email;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.mail.SimpleMailMessage;

import org.springframework.mail.javamail.JavaMailSender;

import org.springframework.stereotype.Service;

import java.util.Date;

@Service

public class SpringEmailService {

@Autowired

private JavaMailSender javaMailSender;

/**

* 输入发件人的邮箱地址

*/

@Value("${spring.mail.username}")

private String from;

public void sendSimpleMail() {

SimpleMailMessage message = new SimpleMailMessage();

message.setSubject("Spring 邮件发送");

message.setFrom(from);

message.setTo("1507775353@qq.com");

message.setSentDate(new Date());

message.setText("这是使用Spring发送邮件");

javaMailSender.send(message);

}

}

(3)新建一个邮件发送的Controller作为Web入口,其中包括发送邮件的方法:

package com.example.springextenddemo.controller;

import com.example.springextenddemo.email.SpringEmailService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class EmailController {

@Autowired

private SpringEmailService springEmailService;

@GetMapping("/sendEamil")

public String sendEmail(){

springEmailService.sendSimpleMail();

return "send success";

}

}

(4)启动当前项目,访问localhost:8080/sendE mail,在控制台能看到邮件发送成功的提示。查看控制台打印的日志,如图6.18所示,收件箱收到的邮件如图6.19所示。

在Spring Boot中添加完E-mail的依赖和E-mail的配置文件后,SpringBoot会自动把E-mail的配置注入邮件的发送配置类中,不需要再手动配置。

使用的配置类是MailSender- AutoConfiguration,其中的部分源码如下:

package org.springframework.boot.autoconfigure.mail;

@Configuration(

proxyBeanMethods = false

)

@ConditionalOnClass({MimeMessage.class, MimeType.class,

MailSender.class})

@ConditionalOnMissingBean({MailSender.class})

@Conditional({MailSenderAutoConfiguration.MailSenderCondition.class})

@EnableConfigurationProperties({MailProperties.class})

@Import({MailSenderJndiConfiguration.class, MailSenderProperties

Configuration.class})

public class MailSenderAutoConfiguration {

static class MailSenderCondition extends AnyNestedCondition {

MailSenderCondition() {

super(ConfigurationPhase.PARSE_CONFIGURATION);

}

@ConditionalOnProperty(

prefix = "spring.mail",

name = {"jndi-name"}

)

static class JndiNameProperty {

JndiNameProperty() {

}

}

@ConditionalOnProperty(

prefix = "spring.mail",

name = {"host"}

)

static class HostProperty {

HostProperty() {

}

}

}

}


MailSenderAutoConfiguration类中可以看到还导入了另外一个配置类,即Mail- SenderPropertiesConfiguration类,其部分源码如下:

@Configuration(

proxyBeanMethods = false

)

@ConditionalOnProperty(

prefix = "spring.mail",

name = {"host"}

)


MailSenderPropertiesConfiguration类获取application.properties中E-mail的配置文件,把application.properties中E-mail的相关配置组装成E-mail的配置对象,然后注入Spring容器中,这样用户就可以方便地发送Email,不需要再手动配置E-mail信息了。

扩展知识——邮件格式

电子邮件因为其传播的广泛性,所以必须具备公共认同的格式,以便于客户端邮箱软件识别、拆解相应的信息。

电子邮件本身是由ASCII字符构成,总体上分为邮件头和邮件体两部分,允许字符编码、附件和压缩等多样化的格式。邮件体实际上是由一行行的字符构成的简单序列,它和邮件头是靠一个空行(该行只有一个回车换行符CRLF)来区分的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87585.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87585.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/87585.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【html】iOS26 液态玻璃实现效果

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>液体玻璃效果演示</title><style>bo…

探索算法秘境:量子随机游走算法及其在图论问题中的创新应用

目录 ​编辑 一、量子随机游走算法的起源与原理 二、量子随机游走算法在图论问题中的创新应用 三、量子随机游走算法的优势与挑战 四、结语 在算法研究的浩瀚星空中&#xff0c;总有一些领域如同遥远星系&#xff0c;闪烁着神秘而诱人的光芒。今天&#xff0c;我们将一同深…

C# 一维数组和矩形数组全解析

在编程的世界里&#xff0c;数组是一种非常重要的数据结构。今天&#xff0c;我们就来详细了解一下一维数组和矩形数组。 数组基础认知 数组实例是从 System.Array 继承类型的对象。由于它从 BCL 基类派生而来&#xff0c;所以继承了许多有用的成员&#xff1a; Rank 属性&a…

WebStorm编辑器侧边栏

目录 编辑器侧边栏行号配置行号隐藏行号 代码折叠侧边栏图标书签添加匿名书签添加助记符书签 运行和调试管理断点配置断点图标 版本控制配置Git Blame注释 编辑器侧边栏 编辑器左侧的垂直区域。当编写代码时&#xff0c;提供重要信息和操作图标。外观和行为可以根据你的喜好进…

腾讯云TCCA认证考试报名 - TDSQL数据库交付运维工程师(PostgreSQL版)

数据库交付运维工程师-腾讯云TDSQL(PostgreSQL版)认证 适合人群&#xff1a; 适合从事TDSQL(PostgreSQL版)交付、运维、售前咨询以及TDSQL(PostgreSQL版)相关项目的管理人员。 认证考试 单选*40道多选*20道 成绩查询 70分及以上通过认证&#xff0c;官网个人中心->认证考…

attn_mask 为 (1, 1) 时什么意思? 7,7又是什么意思?

在深度学习中&#xff0c;特别是在 Transformer 模型和注意力机制&#xff08;Attention Mechanism&#xff09;中&#xff0c;attn_mask&#xff08;注意力掩码&#xff09;是一个用于控制注意力计算的张量。它决定了在计算注意力分数时&#xff0c;哪些位置应该被关注&#x…

Qt联合Halcon开发二:Halcon窗口绑定Qt控件显示Hobject图像【详细图解流程】

1. 项目准备 在本项目中&#xff0c;我们将使用Qt框架与Halcon库结合&#xff0c;展示图像并进行图像处理。首先&#xff0c;确保你已经配置好Qt和Halcon的开发环境。 环境配置可查看上篇文章 2. 创建Qt界面 在Qt中&#xff0c;创建一个窗口并拖入按钮和Graphics View控件。G…

Redis 持久化机制详解:RDB、AOF 原理与面试最佳实践(AOF篇)

在上一章我们深入学习了 Redis 中重要的数据持久化机制 ——RDB&#xff08;Redis Database&#xff09;&#xff0c;了解了其通过周期性快照将数据以二进制文件形式保存到磁盘的原理&#xff0c;包括触发条件、文件结构以及优缺点等核心内容。 Redis 持久化机制详解&#xff…

【GateWay】和权限验证

【GateWay】网关详解和权限验证 一、Gateway 核心概念与架构二、路由断言&#xff08;Route Predicates&#xff09;详解三、过滤器&#xff08;Filters&#xff09;机制四、权限认证的核心理论模型五、Spring Cloud Gateway Security OAuth2 集成方案六、OAuth2.0 集成 一、…

QSqlDatabase: QSQLITE driver not loaded

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言可能的原因解决办法1. 确认 SQLite 驱动插件文件2. 拷贝插件文件到应用程序目录3. 设置插件搜索路径4. 安装 SQLite 依赖库5. 解决 QCoreApplication 实例问题 …

20250619在荣品的PRO-RK3566开发板的Android13下解决海罗光电有限公司HL070T58C-05屏在启动的时候出现白色条纹的问题【时序】

20250619在荣品的PRO-RK3566开发板的Android13下解决海罗光电有限公司HL070T58C-05屏在启动的时候出现白色条纹的问题 2025/6/19 20:39 缘起&#xff1a;荣品的PRO-RK3566开发板的Android13下&#xff0c;点亮海罗光电有限公司HL070T58C-05屏。 在启动的时候会出现花屏/白色条纹…

docker使用Volume对Nginx进行挂载

需求&#xff1a; 需要将Nginx的欢迎页面也就是index.html文件进行修改。 原始方法&#xff1a;由于docker会为每一个容器创建其对应的文件信息&#xff0c;但是创建的信息内容只有其最基础的运行信息&#xff0c;所以想要直接去访问其index.html就无法做到。 使用volume&am…

基于springboot的宠物服务预约系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

idea 2025会在用户目录创建IdeaSnapshots文件夹

推荐一个api管理测试工具 一个简单的API测试和编写文档的工具 idea 2025会在用户目录创建IdeaSnapshots文件夹 解决方案 打开 Profiler 点击 setting 参考 https://youtrack.jetbrains.com/articles/SUPPORT-A-1086/How-to-change-or-turn-off-the-IdeaSnapshots-folder-…

【Mini-F5265-OB开发板试用测评】2、PWM驱动遥控车RX2接收解码带马达驱动控制IC

手头有带转向电机和动力电机小车底盘&#xff0c;买了很久一直在吃灰。 最近查了一下小车的驱动IC是富满微的8D420L,是一款传统的RX2接收解码芯片&#xff0c;带马达驱动。 手头没有TX2发送芯片&#xff0c;所以考虑用MCU直接发送PWM直接接入RX2&#xff0c;可能可以驱动。 一…

Tcpdump网络抓包工具详解!

一、简介 tcpdump就是&#xff1a;dump the traffic on a network&#xff0c;根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump是一个用于截取网络分组&#xff0c;并输出分组内容的工具。凭借强大的功能和灵活的截取策略&#xff0c;使其成为类UNIX系统下用…

Spring Boot的Security安全控制——应用SpringSecurity!

应用Spring Security 前面介绍了在项目开发时为什么选择Spring Security&#xff0c;还介绍了它的原理。本节开始动手实践Spring Security的相关技术。 实战&#xff1a;Spring Security入门 现在开始搭建一个新项目&#xff0c;实践一个Spring Security的入门程序。 &…

FPGA基础 -- Verilog行为级建模之alawys语句

Verilog 中的 always 语句块&#xff0c;这是行为级建模的核心结构之一&#xff0c;在 RTL 级设计中广泛用于时序逻辑和组合逻辑的建模。 一、什么是 always 语句&#xff1f; ✅ 定义&#xff1a; always 语句用于描述可综合的硬件行为逻辑&#xff0c;表示一个**“事件驱动…

【力扣 简单 C】704. 二分查找

目录 题目 解法一&#xff1a;二分查找 题目 解法一&#xff1a;二分查找 int find(const int* nums, int size, int target) {int left 0, right size - 1;while (left < right){int mid (left right) / 2;if (nums[mid] < target)left left 1;else if (nums[m…

Java并发编程实战 Day 30:并发编程未来展望与最佳实践总结

【Java并发编程实战 Day 30】并发编程未来展望与最佳实践总结 文章简述 经过30天的系统学习&#xff0c;我们从Java并发编程的基础知识逐步深入到高并发系统的架构设计与性能优化。本文作为“Java并发编程实战”系列的收官之作&#xff0c;将全面回顾整个系列的核心内容&#…