springboot邮件发送

一、讲一下thymeleaf的简单使用

1.在根路径下写一个  resources/templates/good.html  文件

2. 在代码实现

记得 不要加 @RequestBody这个注解,因为它会把string当作普通 的字符串,而不是去渲染对应的good.html视图

3.看效果

关于图片的显示,我后面写的有,thymeleaf 可以使用 @{/} 来对图片进行匹配

4.拓展一下,在 代码中自定义文字,并在html渲染

这是要用到 Model , model.addAtrributes() 来对其中 th:txt 进行渲染

对应的good.html

对应的页面

二、在邮件发送时,不使用Model,而是用另一种方式

在往 邮件 中添加 图片,要用到 cid

我先举个示例代码,看不懂也没关系,摸索一会。。。。。。

下面这段代码,实现了发送 验证码,以及往邮件中添加图片。

@GetMapping("sendEmail/{to}")@ResponseBodypublic String sendEmail(@PathVariable  String to ,@RequestParam("username") String username){Context ctx=new Context();Map<String,Object> variables=new HashMap<>();variables.put("username",username);int codeLen=6;String code=getCode(codeLen);variables.put("code",code);ctx.setVariables(variables);//生成邮箱字符串String content = templateEngine.process("sendCode.html", ctx);MimeMessage mimeMessage = javaMailSender.createMimeMessage();try {MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);//设置发送人helper.setFrom(from);//设置收件人helper.setTo(to);//设置主题if (username==null){username="";}helper.setSubject(username+"的邮箱验证码!");helper.setText(content,true);
//从类加载路径中获得ResourceClassPathResource classPathResource=new ClassPathResource("static/wangkantian.jpg");helper.addInline("logoUrl",classPathResource);javaMailSender.send(mimeMessage);} catch (MessagingException e) {log.info("{邮件发送错误}");throw new RuntimeException(e);}log.info("验证码为{}",code);return "success";}

下面来往邮箱里添加一个附件,顺便实现群发 的功能。

还挺有意思的!

@ResponseBody@GetMapping("/sendBachEmail")public String sendBatchEmail(String[]to,String motto){String subject="展信佳";Context context = new Context();context.setVariable("motto",motto);String content = templateEngine.process("good.html", context);MimeMessage mimeMessage = javaMailSender.createMimeMessage();//使用helper 让 mimeMessage设置相关邮件配置更加简便try {//记得开启helper的multipartMimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);//设置主题内容helper.setSubject(subject);//设置正文内容helper.setText(content,true);//图片resourceClassPathResource imgResource = new ClassPathResource("static/wangkantian.jpg");//附件FileClassPathResource fileResource=new ClassPathResource("static/学习HTML.docx");//添加附件和图片helper.addInline("logoUrl",imgResource);helper.addAttachment("秘密.html",fileResource);//批量发送邮件,此时to是字符串数组helper.setTo(to);//设置发件人helper.setFrom(from);javaMailSender.send(mimeMessage);} catch (MessagingException e) {throw new RuntimeException(e);}return "success";}

三、易出错的点

1. 关于 @

对于我们服务器上的静态资源,比如下面这张图片,是可以直接访问到的。

因此,我们要想在theamleaf中达到同样的效果,就要使用@。

MimeMessage是JavaMail API中的一个类,用于表示电子邮件消息。它可以用来创建并设置邮件消息的各种属性,例如发件人、收件人、主题、内容和附件等。

MimeMessageHelper是Spring Framework中的一个类,它是对MimeMessage进行封装,提供了更加方便的API,以便于我们设置邮件的各种属性。例如,MimeMessageHelper可以帮助我们添加多个收件人、抄送、密送、内嵌图片和附件等。

因此,MimeMessage是JavaMail API中的一个基础类,而MimeMessageHelper是Spring Framework中对MimeMessage的封装,提供了更加便捷的API,使得我们可以更加方便地处理邮件消息。

错误汇总:

1. 遇见@ResponseBody与 String返回值的冲突

Error resolving template [success], template might not exist or might not be accessible by any of the configured Template Resolvers

一般来讲,模板解析时,会根据String类型的返回值,来返回是哪个html页面,但此时,我们只需要返回一个String 类型的数据,那么,我们就用用上@ResponseBody

templateEngine.process("index", ctx);  不奏效

  • TemplateEngine需要注入而不能使用new TemplateEngine()创建新实例,因为创建的新实例没有和TemplateResolver关联,使用process()方法读取文件时只显示文件名而不能解析文件内容。

如果有图片,那么一定要开启 multipart

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

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

相关文章

黑马程序员 Docker笔记

本篇学习笔记文档对应B站视频&#xff1a; 同学们&#xff0c;在前两天我们学习了Linux操作系统的常见命令以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的同学以外&#xff0c;大多数同学都会有相同的…

【动态规划】【滑动窗口】C++算法:3003 执行操作后的最大分割数量

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 C算法&#xff1a;滑动窗口总结 动态规划 LeetCode3003 执行操作后的最大分割数量 给你一个下标从 0 开始的字符串 s 和一个整数 k。 你需要执行以下分割操作&#xff0c;直到字符串 s 变为 空&#xff1…

四大会计假设

目录 一. 会计主体假设二. 持续经营假设三. 会计期间假设四. 货币计量假设 \quad \quad 一. 会计主体假设 \quad 会计主体: 会计工作为其服务的特定单位或组织。 会计主体的定义 1.具有一定数量的资金。 2.进行独立的生产经营或其他活动。 3.实行独立核算。 \quad 会计主体假设…

leetcode 125. 验证回文串

题目&#xff1a; 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &…

阅读文献-胃癌

写在前面 今天先不阅读肺癌的了&#xff0c;先读一篇胃癌的文章 文献 An individualized stemness-related signature to predict prognosis and immunotherapy responses for gastric cancer using single-cell and bulk tissue transcriptomes IF:4.0 中科院分区:2区 医学…

JFinal综合信息管理系统

项目地址&#xff1a;mendianyu/AdvancedManagement: 综合信息管理系统 (github.com) 项目演示地址&#xff1a;软件构造大作业演示视频_哔哩哔哩_bilibili 项目功能 一&#xff1a;基于Jfinal构建信息管理系统&#xff0c;要求包含用户管理&#xff0c;翻译业务模块管理&…

初识Spring

1.Spring官网&#xff1a; 2.官网学习的顺序&#xff1a;先学Spring,再学SpringBoot,然后SpringCloud,Spring Cloud Data Flow。 3.Spring Framework界面&#xff1a; 4.github上的源代码&#xff1a; 5.进入使用说明文档&#xff1a; 主要是根据这个进行学习的。 6.我们用mave…

Linux Debian12使用VSCode和Python搭建flask开发环境

一、安装VSCode 在Linux Debian12系统上安装VSCode教程可以参考网上相关教程。 二、安装Python 打开VSCode&#xff0c;安装python和python扩展包&#xff0c;如下图所示&#xff1a; 三、创建Python虚拟环境 1.新建文件夹testFlask 2.用vscode打开文件夹testFlask&#xf…

前端 TS 语法继承 多态 修饰符 readonly 抽象类 ts 基本写法 可选 剩余参数 函数重载 接口 类(3)

继承 继承之间的叫法 A类继承了B类&#xff0c;那么A类叫做子类&#xff0c;B类叫成基类 子类 ---》派生类 基类 ---》超类&#xff08;父类&#xff09; // 继承之间的叫法 // A类继承了B类&#xff0c;那么A类叫做子类&#xff0c;B类叫成基类 // 子类 ---》派生类 // 基类 …

阅读笔记lv.1

阅读笔记 sql中各种 count结论不同存储引擎计算方式区别count() 类型 责任链模式常见场景例子&#xff08;闯关游戏&#xff09; sql中各种 count 结论 innodb count(*) ≈ count(1) > count(主键id) > count(普通索引列) > count(未加索引列)myisam 有专门字段记录…

计算机体系结构----缓存一致性/多处理机

本文严禁转载&#xff0c;仅供学习使用。参考资料来自中国科学院大学计算机体系结构课程PPT以及《Digital Design and Computer Architecture》、《超标量处理器设计》、同济大学张晨曦教授资料。如有侵权&#xff0c;联系本人修改。 本文衔接上文计算机体系结构----存储系统 …

python爬虫,验证码识别,携带cookies请求

古诗词网案例!!! 识别验证码类型: # 此处用到的图片验证码识别网址为:http://ttshitu.com/ 图鉴 import base64 import json import requests # 一、图片文字类型(默认 3 数英混合): # 1 : 纯数字 # 1001:纯数字2 # 2 : 纯英文 # 1002:纯英文2 # 3 : 数英混合 # 1003:…

用通俗易懂的方式讲解:大模型微调方法总结

大家好&#xff0c;今天给大家分享大模型微调方法&#xff1a;LoRA,Adapter,Prefix-tuning&#xff0c;P-tuning&#xff0c;Prompt-tuning。 文末有大模型一系列文章及技术交流方式&#xff0c;传统美德不要忘了&#xff0c;喜欢本文记得收藏、关注、点赞。 文章目录 1、LoRA…

轻松查看WiFi密码的神奇脚本,让你忘记密码也不再是问题

说在前面 &#x1f388;本文介绍了一个便捷的脚本&#xff0c;可以帮助你获取电脑中保存的所有Wi-Fi网络的密码。不再需要担心忘记Wi-Fi密码或手动查找密码的麻烦&#xff0c;只需运行脚本即可一键获取。 一、引言 互联网的普及让我们离不开Wi-Fi网络&#xff0c;但忘记密码时…

怎么安装es、kibana(单点安装)

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&#xff0c;这个镜像体积非常大&#xff0c…

用C语言采集亚马逊amazon产品数据

上一篇文章我是用C写的一个爬取亚马逊的爬虫程序&#xff0c;相信大家已经看过了&#xff0c;这次呢&#xff0c;我依然使用C语言来写一个爬虫&#xff0c;大体上思路是和之前一样&#xff0c;只是支持的库以及语法有些区别&#xff0c;具体的呢我会一一解释出来&#xff0c;方…

android自定义来电秀UI

简单来电秀功能&#xff0c;效果如图&#xff1a; 底部附上demo 一、新建一个PhoneCallService服务&#xff0c;在服务中监听来电等状态&#xff0c;且控制UI显示 public class PhoneCallService extends InCallService {private final Call.Callback callback new Call.Ca…

仿真机器人-深度学习CV和激光雷达感知(项目2)day01

文章目录 前言项目介绍功能与技术简介硬件要求环境配置虚拟机运行项目demo 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;本文内容是我为复试准备的第二个项目 &#x1f4ab;欢迎大家的关注&#xff0c;我的博客主要关注…

如何给AI下达精准的指令,哪些提示词对于AI是有效的?

刚上手那会&#xff0c;我倾向于将 prompt 翻译为“指令”&#xff0c;但这并不精确。“指令”通常对应instructions&#xff0c;属于 prompt 中的纯指令部分&#xff0c;通常是一个动宾结构&#xff08;做什么&#xff09;。剩下的部分更多是描述&#xff08;describe&#xf…

stable-diffusion 学习笔记

从效果看Stable Diffusion中的采样方法 参考&#xff1a;Ai 绘图日常 篇二&#xff1a;从效果看Stable Diffusion中的采样方法_软件应用_什么值得买 大概示例&#xff1a;