【SpringBoot】发送简单邮件

news2024/11/19 18:52:47

在Spring Boot中发送邮件是一个常见的需求,通常使用JavaMail API结合Spring的邮件抽象来实现。Spring Boot提供了一个简单的配置和使用邮件发送的方法。

简单使用

添加依赖

首先,你需要在你的pom.xml文件中添加Spring Boot Starter Mail依赖。

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-mail</artifactId>  
</dependency>

如果你使用的是Gradle,请添加相应的依赖。

implementation 'org.springframework.boot:spring-boot-starter-mail'

配置邮件属性

在application.properties或application.yml文件中配置你的邮件服务器属性。

spring:  
  mail:  
    host: smtp.example.com  
    port: 587  
    username: your-email@example.com  
    password: your-email-password  
    properties:  
      mail:  
        smtp:  
          auth: true  
          starttls:  
            enable: true

163邮箱配置如下:

spring:
  mail:
    host: smtp.163.com
    port: 465
    username: morris131@163.com
    password: xxxxxxxx
    # 注意开启smtps
    protocol: smtps
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
    

配置文件中需要配置protocol: smtps,否则会抛出如下异常:

javax.mail.MessagingException: Got bad greeting from SMTP host: smtp.163.com, port: 465, response: [EOF]
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2198) ~[jakarta.mail-1.6.7.jar:1.6.7]
	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:722) ~[jakarta.mail-1.6.7.jar:1.6.7]

创建一个类来发送邮件

创建一个类来封装邮件发送的逻辑。你可以使用JavaMailSender接口来发送邮件。

package com.morris.spring.boot.module.email;


import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

/**
 * 发送邮件测试
 */
@Slf4j
@RestController
@RequestMapping("/email")
public class EmailController {

    @Resource
    private JavaMailSender javaMailSender;

    /**
     * 发送简单的邮件
     *
     * @return "sendSingle"
     */
    @GetMapping("sendSingle")
    public String sendSingle() {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo("1508787838@qq.com"); // 收件人
        message.setSubject("sendSingle"); // 主题
        message.setText("sendSingle Text"); // 内容
        message.setFrom("morris131@163.com");  // 发件人 Optional, if not set, it will use the username configured in application.properties
        javaMailSender.send(message);
        return "sendSingle";
    }
}

运行应用并测试

启动Spring Boot应用,然后访问http://localhost:8888/email/sendSingle来发送一封简单的邮件。

可以在收件人邮箱收到如下格式的邮件:

注意事项:

  • 安全性:不要在application.properties或application.yml中硬编码密码。考虑使用Spring Cloud Config或环境变量来管理敏感信息。
  • 异常处理:在生产环境中,你应该添加适当的异常处理逻辑来捕获和处理邮件发送过程中可能发生的错误。
  • 邮件内容:对于复杂的邮件内容(如带有附件或HTML格式),你可以使用MimeMessageHelper来构建邮件。

名词解释

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)

SMTP是一种提供可靠且有效的电子邮件传输的协议。它的主要作用是在系统之间传递邮件信息,并提供有关来信的通知。SMTP协议建立在FTP文件传输服务上,它独立于特定的传输子系统,只需要可靠有序的数据流信道支持。使用SMTP协议,可以实现相同网络处理进程之间的邮件传输,也可以通过中继器或网关实现某处理进程与其他网络之间的邮件传输。SMTP使用TCP端口25,通过一系列的命令和响应来建立连接、发送邮件和关闭连接。

POP3(Post Office Protocol 3,邮局协议第三版)

POP3是一种从邮件服务器下载邮件的协议。它属于TCP/IP协议族中的一员,默认端口是110。POP3协议主要用于支持使用客户端远程管理在服务器上的电子邮件。当邮件发送到服务器上后,电子邮件客户端会调用邮件客户端程序,连接服务器并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机器上(如PC机或MAC)。不过,很多POP3服务器都支持“下载邮件后服务器并不删除邮件”的功能,这是POP3协议的一个改进。但需要注意的是,使用POP3协议时,一旦邮件被下载到本地设备,服务器上的邮件副本通常会被删除(除非服务器设置了不删除副本的选项)。因此,POP3更适合在单一设备上管理邮件的用户。

IMAP(Internet Mail Access Protocol,互联网邮件访问协议)

IMAP是一种电子邮件协议,它允许用户从邮件服务器上读取邮件,并在多个设备之间同步邮件状态。IMAP协议运行在TCP/IP协议之上,使用的端口是143。与POP3不同,IMAP采用的是同步模式。使用IMAP协议时,用户可以在多个设备(如电脑、手机等)上访问和管理邮件,且这些设备上的邮件状态会保持同步。这意味着当你在一个设备上阅读或删除邮件时,这些更改会自动反映到其他设备上。IMAP的这种同步性使得它成为那些需要在多个设备上管理邮件的用户的理想选择。此外,IMAP还支持有选择地从邮件服务器接收邮件的功能、基于服务器的信息处理功能和共享信箱功能等。

POP3、SMTP和IMAP的协同工作

在实际应用中,POP3、SMTP和IMAP通常协同工作,为用户提供完整的邮件服务。例如:

  • 一个用户可能使用IMAP协议在多个设备上同步管理邮件,同时使用SMTP协议发送邮件。
  • 一个用户可能主要使用POP3协议在单一设备上接收邮件,但也需要使用SMTP协议发送邮件。

简单来说,POP3和IMAP是用来从服务器上下载邮件的。SMTP适用于发送或中转信件时找到下一个目的地。所以我们发送邮件应该使用SMTP协议。

邮箱客户端授权码

授权码是邮箱推出的,用于登录第三方客户端的专用密码。

适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。

QQ邮箱获取授权码

在设置->账号->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务中开启服务并获取授权码:

网易邮箱获取授权码

在设置->POP3/SMTP/IMAP菜单下开启服务并获取授权码:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python模块、迭代器与正则表达式day10

1、Python模块 1.1模块的简介 在编写代码的时候&#xff0c;创建的.py文件就被称为一个模块 1.2模块的使用 想要在a文件里使用b文件的时候&#xff0c;只要在a文件中使用关键字import导入即可 1.2.2 from ...import...语句 导入模块可以使用import&#xff0c;如果只导入模…

ABAP开发学习——SNRO

SAP凭证号码的指定分为外部给号和内部给号。 Internal number range即内部给号,指系统根据预先维护好的号码范围&#xff08;只能是阿拉伯数字&#xff09;依序给号,给出已有数字的下一个编号。 External number range即外部给号,后台配置时指指定一个号码范围&#xff08;可以…

数据科学与SQL:如何计算排列熵?| 基于SQL实现

目录 0 引言 1 排列熵的计算原理 2 数据准备 3 问题分析 4 小结 0 引言 把“熵”应用在系统论中的信息管理方法称为熵方法。熵越大&#xff0c;说明系统越混乱&#xff0c;携带的信息越少&#xff1b;熵越小&#xff0c;说明系统越有序&#xff0c;携带的信息越多。在传感…

CSS(8):盒子阴影与文字阴影

一&#xff1a;盒子阴影text-shadow属性 1.box-shadow&#xff1a;h-shadow v-shadow blur spread color inset; 默认的是外部阴影outset&#xff0c;不能写在代码上 2.鼠标经过盒子后的阴影 rgba透明度 3.文字阴影 text-shadow:水平偏移 垂直偏移 模糊度 阴影颜色; 注意点…

《Python编程实训快速上手》第七天--文件与文件路径

该章节将使用Python在硬盘上创建、读取和保存文件 一、文件与文件路径 1、Windows中使用\以及macOS和Linux中使用/ 使用pathlib模块中的Path()函数进行文件名和目录的拼接,返回文件路径字符串 from pathlib import Path print(Path("spam","bacon",&qu…

Springboot如何打包部署服务器

文章目的&#xff1a;java项目打包成jar包或war包&#xff0c; 放在服务器上去运行 一、编写打包配置 1. pom.xml 在项目中的pom.xml文件里面修改<build>...</build>的代码 >> 简单打包成Jar形式&#xff0c;参考示例&#xff1a; <build><fina…

Video Duplicate Finder 快速识别并去除重复的视频和图像!

文章目录 下载 后续升级 Video Duplicate Finder&#xff08;视频重复查找器&#xff09;是一款开源的跨平台视频&#xff08;以及图像&#xff09;去重软件&#xff0c;通过对比文件内容和特征&#xff0c;快速识别出重复的视频和图像文件&#xff0c;即使是被压缩裁剪过、…

Python实现基础到高级:语音验证码技术详解

目录 一、语音验证码基础 1.1 语音验证码概述 1.2 Python语音验证码库 二、Python生成语音验证码 2.1 使用captcha库生成语音验证码 2.2 使用第三方语音合成服务API生成语音验证码 三、Python识别语音验证码 3.1 语音识别技术概述 3.2 使用百度语音识别API识别语音验证…

(附项目源码)Java开发语言,215 springboot 大学生爱心互助代购网站,计算机毕设程序开发+文案(LW+PPT)

摘 要 在网络信息的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;企业只能以用户为导向&#xff0c;按品种分类规划&#xff0c;以产品的持续创新作为企业最重要的竞…

后端:Spring AOP原理--动态代理

文章目录 1. Spring AOP底层原理2. 代理模式3. 静态代理4. 动态代理4.1 jdk 实现动态代理4.2 cglib 实现动态代理4.3 jdk、cglib动态代理两者的区别 1. Spring AOP底层原理 创建容器 new applicationContext()&#xff1b;Spring把所有的Bean进行创建&#xff0c;进行依赖注入…

halcon3D gen_image_to_world_plane_map的图像高精度拼接技术

基于上一篇文章&#xff0c;对gen_image_to_world_plane_map有了深刻的理解 https://blog.csdn.net/Tianwen_running/article/details/143661157?fromshareblogdetail&sharetypeblogdetail&sharerId143661157&sharereferPC&sharesourceTianwen_running&s…

STM32 独立看门狗(IWDG)详解

目录 一、引言 二、独立看门狗的作用 三、独立看门狗的工作原理 1.时钟源 2.计数器 3.喂狗操作 4.超时时间计算 5.复位机制 四、独立看门狗相关寄存器 1.键寄存器&#xff08;IWDG_KR&#xff09; 2.预分频寄存器&#xff08;IWDG_PR&#xff09; 3.重载寄存器&…

《探索 Spring 核心容器:Bean 的奇妙世界》

一、Spring 核心容器与 Bean 的关系 Spring 核心容器是 Spring 框架的重要组成部分&#xff0c;负责管理和组织应用程序中的对象&#xff0c;而 Bean 则是构成应用程序主干并由 Spring IoC 容器管理的对象&#xff0c;二者紧密相连。 Spring 的核心容器由多个模块组成&#xf…

JFlash添加自定义MCU型号

1.打开安装路径 2.在Devices里创建你想添加的MCU的文件夹并把FLM文件放入 3.Jlink目录里找到JLinkDevices.xml文件 4.修改 <!-- --><!-- G32 --><!-- --><!-- --><!-- G32F103 --><!-- --><Device><ChipIn…

Linux中系统的延迟任务及定时任务

一、延时任务 at 命令&#xff0c;即用即消 如 at 11&#xff1a;30 rm -rf /mnt/* ctrld运行 &#xff08;过一秒即可执行&#xff09; -v 使用较明显的时间格式&#xff0c;列出at调度中的任务列表 -l 可列出目前系统上面的所有该用户的at调度 -c 可以列出后面接…

通过shell脚本分析部署nginx网络服务

通过shell脚本分析部署nginx网络服务 1.接收用户部署的服务名称 [rootlocalhost xzy]# vim 1.sh [rootlocalhost xzy]# chmod x 1.sh [rootlocalhost xzy]# ./1.sh2.判断服务是否安装 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&…

使用PSpice进行第一个电路的仿真

1、单击【开始】菜单&#xff0c;选择【OrCAD Capture CIS Lite】。 2、单击【File】>【New】>【Project】。 3、①填入Name下面的文本框&#xff08;提示&#xff1a;项目名称不要出现汉字&#xff09;&#xff1b; ②选择【Analog or Mixed A/D】&#xff1b; ③单击【…

CentOS网络配置

上一篇文章&#xff1a;VMware Workstation安装Centos系统 在CentOS系统中进行网络配置是确保系统能够顺畅接入网络的重要步骤。本文将详细介绍如何配置静态IP地址、网关、DNS等关键网络参数&#xff0c;以帮助需要的人快速掌握CentOS网络配置的基本方法和技巧。通过遵循本文的…

【unity小技巧】unity最全的性能优化方案分享以及如何进行性能测试(2024/11/11更新)

文章目录 前言一、性能分析软件1、Draw Call什么是Draw Call如何查看Draw Call数量 2、分析帧调试器3、Statistics统计面板 二、优化手段1、关于图集、材质、层级的处理&#xff0c;减少DrawCall2、批处理3、音乐处理4、减少沉余资源和重复资源5、渲染优化&#xff08;GPU&…

[STM32]从零开始的STM32 HAL库环境搭建

一、前言 之前在搭建STM32的标准库环境时就告诉过大家&#xff0c;开发STM32的方式主要有三种。一种是最原始但是效率最高的寄存器开发&#xff0c;另一种是效率仅次于寄存器难度相对较低的标准库开发&#xff0c;最后一种是最为简单但是程序效率最低的HAL库开发。如果对于初学…