从spring boot发邮件聊到开发的友好性

Spring Boot 发邮件:一场关于邮件的奇妙之旅 🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀。 阅读详情

前些天帮一个朋友做网站,全站都是静态页面,唯一需要用到后端开发的是他需要一个留言板。传统的留言板一般都是提交后保存到数据库,然后提供一个后台的留言列表给管理人员看,我嫌麻烦,就决定留言提交到后台直接发邮件出去,这样就不用开发后台页面了,他也不需要登录一个什么后台才能看留言,两全其美,岂不美哉。
在这里插入图片描述
1、最简版spring boot发邮件
spring boot发邮件还是挺简单的,首先把发邮件的start加到pom里面:

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

然后在application.properties里面配置好关于发邮件的参数

spring.mail.host=smtp.163.com
spring.mail.port=25
spring.mail.username=yourmail@163.com
spring.mail.password=yourpassword

其中spring.mail.host和spring.mail.username是一一对应的,哪里的邮箱就要用哪里的smtp服务器

然后我写了一个controller来接收留言板的内容:

    @Value("${spring.mail.username}")
	private String fromMail;
	@Autowired
    private JavaMailSender mailSender;

    @RequestMapping(value = "/getNote", method = RequestMethod.POST)
	public String getNote(Note note) {
		MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper helper;
		try {
			helper = new MimeMessageHelper(mimeMessage, true);
			//发件人
	        helper.setFrom(fromMail,note.yourName);
	        //收件人(留言内容最终发往的邮箱地址)
	        helper.setTo("recieve@mail.com");
	        //标题
	        helper.setSubject(note.yourSubject);
	        //文本
	        helper.setText("from email:"+note.yourEmail+"\n"+note.yourMessage);
	        mailSender.send(mimeMessage);
		} catch (MessagingException | UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
               
		return "redirect:return.htm";
	}
public class Note {
	String yourName;
	String yourEmail;
	String yourSubject;
	String yourMessage;

//getter,setter省略
}

note对象是留言板的内容
JavaMailSender和MimeMessageHelper是官方推荐的好基友,一般配套使用

fromMail就是在application.properties里面配置的spring.mail.username属性,也就是发邮件的一方,用helper.setTo(…)配置

额外说一下,由于填留言板时一般也会留邮件地址,但那个邮件地址和这里的任何一个设置邮件的地方毫无关系,只需要在邮件的文本里面做记录就好了,我之前就弱智了一把,把留言板里面的邮件地址填到helper.setTo(…),结果浪费了我半个小时查这种bug,真是一言难尽…

2、授权码发邮件
很多时候,按照上面的方法发邮件会出现下面的错误:

javax.mail.AuthenticationFailedException: 535 Error: authentication failed

其中的一个原因是邮件服务器使用了授权码登录方式,也就是第三方登录不能直接使用账号密码,而需要使用一种授权码的方式,比如上面的163.com邮箱,就可以设置授权码登录,设置界面如下:
在这里插入图片描述
QQ邮箱更是默认就需要用授权码登录,QQ邮箱的授权登录操作文档请看这里

使用授权码登录后,需要把之前application.properties里面spring.mail.password的内容从密码换成授权码,就能够正常发邮件了。

3、简单聊下JavaMailSender和MimeMessageHelper
我们查下JavaMailSender的代码就知道,它其实背景比较复杂。首先它继承了org.springframework.mail.MailSender接口。

public interface JavaMailSender extends MailSender {
...
}

而它本身也是一个接口,实现类只有一个,JavaMailSenderImpl
在这里插入图片描述
我们再来翻JavaMailSenderImpl的代码,发现spring并没有自己来做发送邮件的功能,而是直接用了java自身的邮件发送功能,核心是这一段

protected void doSend(MimeMessage[] mimeMessages, @Nullable Object[] originalMessages) throws MailException {
		Map<Object, Exception> failedMessages = new LinkedHashMap<>();
		Transport transport = null;

		try {
			for (int i = 0; i < mimeMessages.length; i++) {

				// Check transport connection first...
				if (transport == null || !transport.isConnected()) {
					if (transport != null) {
						try {
							transport.close();
						}
						catch (Exception ex) {
							// Ignore - we're reconnecting anyway
						}
						transport = null;
					}
					try {
						transport = connectTransport();
					}
					catch (AuthenticationFailedException ex) {
						throw new MailAuthenticationException(ex);
					}
					catch (Exception ex) {
						// Effectively, all remaining messages failed...
						for (int j = i; j < mimeMessages.length; j++) {
							Object original = (originalMessages != null ? originalMessages[j] : mimeMessages[j]);
							failedMessages.put(original, ex);
						}
						throw new MailSendException("Mail server connection failed", ex, failedMessages);
					}
				}

				// Send message via current transport...
				MimeMessage mimeMessage = mimeMessages[i];
				try {
					if (mimeMessage.getSentDate() == null) {
						mimeMessage.setSentDate(new Date());
					}
					String messageId = mimeMessage.getMessageID();
					mimeMessage.saveChanges();
					if (messageId != null) {
						// Preserve explicitly specified message id...
						mimeMessage.setHeader(HEADER_MESSAGE_ID, messageId);
					}
					Address[] addresses = mimeMessage.getAllRecipients();
					transport.sendMessage(mimeMessage, (addresses != null ? addresses : new Address[0]));
				}
				catch (Exception ex) {
					Object original = (originalMessages != null ? originalMessages[i] : mimeMessage);
					failedMessages.put(original, ex);
				}
			}
		}
		finally {
			try {
				if (transport != null) {
					transport.close();
				}
			}
			catch (Exception ex) {
				if (!failedMessages.isEmpty()) {
					throw new MailSendException("Failed to close server connection after message failures", ex,
							failedMessages);
				}
				else {
					throw new MailSendException("Failed to close server connection after message sending", ex);
				}
			}
		}

		if (!failedMessages.isEmpty()) {
			throw new MailSendException(failedMessages);
		}
	}

doSend方法中调用的核心类就是Transport类,这个类的包名是javax.mail。spring不愧是集成大师,java自带的mail功能经过spring的标准化包装就成了spring自身功能的一部分,再通过spring boot的包装,用starter的方式再次做简化,我们就能够直接通过极简的方式使用了。

当然,简化的方法多种多样,另外的一种形式的包装就是使用helper类的方法,spring使用的就是MimeMessageHelper。在javax.mail在处理邮件的方式上,使用的是分而治之的办法,不同的类处理不同的问题,所以看到很多的类在处理各种问题和情况。
在这里插入图片描述在这里插入图片描述
这种做法在实现功能上是很好的,把一个复杂的问题分解成若干个小问题,分别实现。但对使用的开发人员就谈不上友好了,容易出现以下几个问题:

不直观,调用者不知道从何下手
查找麻烦,类太多而且功能分散,不容易找到对应的功能类
关系复杂,经常对要引用哪个类会很没有把握,因为太多处理单一问题的类
没有统一的入口,上手难,很难脱离文档直接使用
针对上述情况,spring通过MimeMessageHelper,把几乎所有邮件发送需要处理的问题就集中到了这个类里面,使用方便又好找。下面是这个类所有的方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个类不可谓不复杂,基本上涵盖了所有发邮件方面的功能,但因为都集成在一个类里面,非常方便好用,可以说是一个对程序员友好的典范了,值得大家在开发时做借鉴。

文章来源:https://blog.roncoo.com/article/1183685663080337409

Halcon实战:基于图像清晰度自动筛选最佳对焦图片 本文详细介绍了如何使用Halcon实现基于图像清晰度的自动筛选最佳对焦图片技术。通过分析灰度值统计和标准差等核心指标,结合实战代码示例,帮助开发者高效处理工业检测中的对焦问题,提升自动化检测的准确性和效率。 阅读详情

相关推荐

Diffusion Model原理详解

Diffusion Model(扩散模型 )对标的是生成对抗网络(GAN),本文将用通俗的语言和公式为大家介绍Diffusion Model,并且结合公式为大家梳理Diffusion Model的代码。

weixin_42620109的博客 6102

SpringBoot使用JavaMailSender发送邮件:com.sun.mail.smtp.SMTPSendFailedException: 451 MI:SFQ 163 smtp7

SpringBoot使用JavaMailSender发送邮件时,报错如下: 2020-08-08 07:32:21,237 ERROR --- [http-nio-8080-exec-1] cn.com.mail.MailService : send exception org.springframework.mail.MailSendException: Failed to close server connection after message failures; nested exceptio

跟着BOSS有肉吃 1万+

SpringBoot+Git+Jenkins+K8s容器化部署

SpringBoot+Git+Jenkins+K8s容器一套部署流程

可乐加.糖 472

org.springframework.mail.MailSendException: Failed to close server connection after message failures

这个原因是在配置SMTP服务的时候,需要进行身份认证,比如采用QQ邮箱作为SMTP服务提供方,这时就需要我们开启QQ邮箱的SMTP服务,获取授权码。然后我们使用我们的邮箱号和授权码进行认证。认证通过后,我们才可以将需要发送的邮件推送到QQ邮箱的服务器上面,让它帮我们找到接收方。并且在我的邮件工具类中使用@Value注入时,也注入不到。我的工具类已经注解为了组件。在debug中看到,赋值属性时,username和password均未读取到值。

不做菜虚困的博客 1249

【车辆仿真】从0开始建立dSPACE RT Simulink工程:CAN通信(RTICANMM方法)

【工程环境信息】:本文基于链接文章搭建SCALEXIO Rack RTPC总线节点,用于与AutoBox通信硬件:上位机:惠普台式PC(Windows 11专业版)下位机(实时机):AutoBox (DS1006)板卡:DS6342软件:本文所使用的DBC链接提示:以下是本篇文章正文内容,下面案例可供参考!!!的部分一定记得配置,其他的按需配置RTICANMM的灵活度非常高,尽可能参考Help文档,理解相应的配置内容官方有RTICANMM的样例工程,在下方路径。

winnizap的博客 2384

从理论到代码:蒙特卡洛法在光学散射模拟中的应用全解析(Matlab 2014a版)

本文详细解析了蒙特卡洛法在光学散射模拟中的应用,从数学原理到Matlab 2014a实现。通过模拟光子随机游走过程,精确描述光在浑浊介质中的传输特性,提供完整的源码实现和性能优化技巧,适用于生物医学光学、大气遥感等领域。

rum55的博客 630

发送邮件异常:Mail server connection failed; nested exception is javax.mail.MessagingException: 500 Error:

发送邮件异常:Mail server connection failed; nested exception is javax.mail.MessagingException: 500 Error: bad syntax . Failed messages: javax.mail.MessagingException: 500 Error: bad syntax 在windows

叮咚侠的博客 1万+

麒麟OS恢复出厂设置原理与实操:非重装的系统状态回滚

Linux操作系统中的‘恢复出厂设置’并非简单重装或镜像还原,而是一种基于状态快照、包管理与配置模板的可控回滚机制。其核心原理依赖LVM快照技术、RPM包签名验证和预置配置模板,兼顾系统稳定性与用户数据安全。该方案在政务、教育等国产化场景中具有显著技术价值——不格式化硬盘、不丢失/home文档、不重配驱动与授权,大幅降低运维复杂度。典型应用场景包括系统卡顿修复、软件冲突清理、桌面环境异常恢复等。本文深入解析银河麒麟V10的kylin-restore-cli工具链与麒麟管家集成逻辑,聚焦‘恢复出厂设置’这一高

weixin_30879169的博客 777

java发邮件_从spring boot发邮件聊到开发的友好性

前些天帮一个朋友做网站,全站都是静态页面,唯一需要用到后端开发的是他需要一个留言板。传统的留言板一般都是提交后保存到数据库,然后提供一个后台的留言列表给管理人员看,我嫌麻烦,就决定留言提交到后台直接发邮件出去,这样就不用开发后台页面了,他也不需要登录一个什么后台才能看留言,两全其美,岂不美哉。1、最简版spring boot发邮件spring boot发邮件还是挺简单的,首先把发邮件的st...

weixin_39933026的博客 182

YOLOv11改进 - 卷积Conv | PConv(Pinwheel-shaped Conv): 风车状卷积用于红外小目标检测 | AAAI 2025

本文介绍了风车状卷积(PConv)和基于尺度的动态(SD)损失在YOLOv11中的结合应用。PConv采用不对称填充,通过特殊结构设计、卷积运算和分组卷积技术,能更好地适应红外小目标的像素高斯空间分布,在少量增加参数的情况下极大扩展感受野。SD损失可根据目标大小动态调整尺度和位置损失的影响。我们将PConv集成到YOLOv11的主干网络低层,并在相关配置文件中进行设置。实验证明,YOLOv11 - PConv在IRSTD - 1K和SIRST - UAVB数据集上取得显著性能提升,验证了方法的有效性和泛化能

魔改工程师的博客 1336

进阶01:Labview与OPC UA设备通信

LabVIEW通过OPC UA实现高效设备通信方案 本文介绍了使用LabVIEW与OPC UA设备通信的完整实施方案。OPC UA协议具有跨平台兼容、高安全性和高效数据交换等优势。实施步骤包括:1)安装NI OPC UA工具包;2)搭建模拟测试环境,使用OPC UA Simulation Server创建测试变量;3)编写LabVIEW程序,实现连接服务器、事件订阅、数据读写等功能。重点展示了通过用户事件实现设备主动触发的机制,当模拟变量值改变时自动触发LabVIEW事件处理。该方案验证了OPC UA在工业

weixin_38637405的博客 1406

springboot controller接收参数_从spring boot发邮件聊到开发的友好性

前 些天帮一个朋友做网站,全站都是静态页面,唯一需要用到后端开发的是他需要一个留言板。传统的留言板一般都是提交后保存到数据库,然后提供一个后台的留言列表给管理人员看,我嫌麻烦,就决定留言提交到后台直接发邮件出去,这样就不用开发后台页面了,他也不需要登录一个什么后台才能看留言,两全其美,岂不美哉。1、最简版spring boot发邮件spring boot发邮件还是挺简单的,首先把发邮件的start...

weixin_39929793的博客 124

4.DJI-PSDK云台x-port控制:

使用PSDK 的“云台控制”功能,开发者需要先设计负载设备的云台并开发出控制云台的程序,将云台的控制函数注册到PSDK 指定的接口后,用户通过使用DJI Pilot、基于MSDK 开发的移动端App 及遥控器即可控制基于PSDK 开发的具有云台功能的负载设备,同时获得负载设备的相关信息,如姿态等。云台的姿态如 图2.云台姿态 所示,根据用户的控制指令,云台能够调整姿态;云台的关节如 图1.云台关节 所示,云台关节是云台上带动负载设备转动的结构件:云台电机,云台关节角即云台电机转动的角度。

哒宰的博客 859

spring boot发邮件

项目地址:https://gitee.com/indexman/spring_boot_in_action 在task模块下,我写了test类 邮件发送流程: 发件方:836491384@qq.com 收件方:indexman@126.com 配置pom.xml 添加mail依赖: <dependency> <groupId>o...

老徐的博客只有干货 3728

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

使用Spring Boot发邮件

一、环境准备 1. 2个邮箱账号,一个QQ账号,另外一个就本人的公司账号,需要QQ邮箱启用SMPT服 2.成功开启后,会给一个授权码的弹窗,该授权码为后面用到的password 二、 实现步骤 1.添加依赖: <!--邮件依赖--> <dependency> &l...

Dream_it_possible!的博客 514

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring boot 发邮件

我用的是qq邮箱,其他邮箱只需要改下配置文件一些内容即可。 1.导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> ...

Lucky的博客 431

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Spring Boot实现发邮件功能

《Spring Boot实现发邮件功能》 目的: 就是想实现邮箱接收验证码功能 实现: 前提:Spring Boot项目 + 数据库 pom.xml 引入 <!-- 邮件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-ma

qq_37577146的博客 586

Spring boot 发邮件攻略

Spring boot 发邮件攻略 项目场景: 给用户发送带附件的邮件,附件为本地资源或者可访问URL资源。 问题描述: 由于我们是定时任务发送邮件,突然发现发送邮件的线程处于无限等待的状态。导致新申请的邮件一直发送不出去。 原因分析: 通过排查代码发现没有任何地方指定sendAttachmentsMail函数的执行超时时间。 直接上代码。核心代码,可自行封装优化,测试 @Autowired private JavaMailSender mailSender; @Autowired privat

大飞的博客 431

Spring Boot 使用 QQ邮箱发邮件

一、登录QQ邮箱,点击【设置】后再点击【账户】,再往下翻,找到【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务】这一栏 开启如图所示中的三项(非强制,这三项是根据需要开通的),我这里要求开启第一个 注意图中圈出的【生成授权码】,点击后可以生成一个授权码,然后记录它,待会项目中配置需要 二、在配置文件【application.yml】写好配置,我的配置文件区分...

qq_20698983的博客 5108

Spring Boot 发邮件

核对无误请点击本链接激活邮箱</a>@ApiOperation(value = "freeMarker发送富文本")<a href="#">核对无误请点击本链接激活邮箱

qq_45250595的博客 717

spring boot整合发邮件

导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 增加配置类yml mail: host: smtp.qq.com port: 58.

允诺@晴天的博客 2489

spring boot--spring-boot-starter-mail发邮件

引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 配置 spring: mail: ...

小毛贼_哪里逃 416

Spring Boot (六):发邮件

Springboot 使用 JavaMailSender 发邮件发邮件功能,使用还是很普遍的,比如注册,找回密码,留言,推送………………….我们来看看springboot 是怎么发邮件的。1、添加依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-ma

帅大叔的博客 949

Spring Boot发邮件功能

发邮件(qq邮件为例) 1.在qq邮箱中找到 设置-账户-开启STMP服务,拿到客户端配置码 2.在yaml文件中配置 spring: mail: host: smtp.qq.com username: 11111111@qq.com password: 刚才拿到的配置码 # qq独有的开启加密验证 properties: mail: smtl: ssl: enable 3. @Autowired private JavaMailSenderImpl javaMailSender; // 发送

weixin_41626852的博客 301
上一篇: dubbo流量上线时的非平滑问题
下一篇: roncoo-education 5.0.0 发布,分布式在线教育系统开源项目
java_66666
博客等级 码龄10年 339粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值