前言
今天在一个小项目中要用到发送邮件时,我突然觉得邮件发送人只有一个,并且固定写在yml文件中,就是非常的不妥当,就想着怎么整成一个动态的。
在写之前已经翻过很多博客了,该踩的坑都踩的差不多了,我是实现之后写的文章,有问题大家可以一起交流。
于是就有了下面这篇文章啦....
一、需求分析默认大家都已经会 SpringBoot 集成 邮件发送啦哈,不行的,点一下上文的链接啦。
我先说说我想要达到什么样的效果:
邮件发送人可以是多个,yml文件中是兜底配置(即数据库中没有一个可用时,使用yml文件中配置的邮件发送人)
项目启动后,我也可以临时增加邮件发送人,或者禁用掉某个邮件发送人(操作完也无需重启项目即可生效)
发送邮件内容为html;另外异步发送邮件(可有可无,大家都会)
思路其实蛮简单的,就只要做到每次我们新添加或者修改邮件发送人配置的时候,对JavaSendMailImpl这个类重新初始化即可。这个地方没啥可讲的,就是不让框架给我们自动配置,我们手动来即可。
二、详细步骤2.1、编码1)yml配置文件
spring:mail:host:smtp.163.comusername:nxxxxxx@163.compassword:IXXXXXXXXXN(开启允许第三方登录后的授权码)default-encoding:utf-8protocol:smtpsproperties:mail:smtp:port:465auth:truestarttls:enable:truerequired:true注意:关于邮件的协议protocol:smtps的配置,我最开始也是配置的smtp,我当时报的错误是一个no provider for smtp错误,我之前也写过一直用的是这个smtp协议,但是报了这个错误,我就去搜索,然后找到有篇博客说,
SMTPS协议
SMTPS (SMTP-over-SSL)是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄密,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。端口465和587便是基于SMTPS协议开放的。
465端口(SMTPS)︰它是SMTPS协议服务所使用的其中一个端口,它在邮件的传输过程中是加密传输(SSL/TLS)的,相比于SMTP协议攻击者无法获得邮件内容,邮件在一开始就被保护了起来。
所以实际上我们使用的配置应该是stmps。
另外建个properties资源类 与 配置文件一一对应
/***@authorcrush*/@Data@Component@ConfigurationProperties(prefix="spring.mail")publicclassMailProperties{/***用户名*/privateStringusername;/***授权码*/privateStringpassword;/***host*/privateStringhost;/***端口*/privateIntegerport;/***协议*/privateStringprotocol;/***默认编码*/privateStringdefaultEncoding;}2.2、建表根据yml文件,我们大致知道了要建立张什么样的数据表了哈。
这些大家都可以自定义哈,根据自己需求来建哈。
根据数据表建一个pojo类。
/***@Author:crush*@Date:2021-11-2618:28*version1.0*/@Data@Accessors(chain=true)@TableName("tb_email")publicclassMailPO{privateStringemailHost;privateStringemailUsername;privateStringemailPassword;privateIntegeremailPort=465;/***协议*/privateStringprotocol="smtps";/***默认编码*/privateStringdefaultEncoding="utf-8";/***使用状态,1:正在使用,2:禁用,3:停用*TODO后期应该更改为枚举类来进行实现*/privateIntegerstate=1;/***创建时间*/@TableField(fill=FieldFill.INSERT)privateLocalDateTimecreateTime;/***修改时间*/@TableField(fill=FieldFill.INSERT_UPDATE)privateLocalDateTimeupdateTime;}如果不是用mybatis-plus 可以把创建时间和修改时间去掉@TableField(fill = FieldFill.INSERT)是Mybatis-plus中的注解。另外我主键是设置了自增,所以就空了。至于返回的类我用的vo包下的。
2.3、mapper、service层@RepositorypublicinterfaceMailMapperextendsBaseMapper<MailPO>{}service
/***@Author:crush*@Date:2021-11-2615:55*version1.0*/publicinterfaceMailService{voidsend(MailDTOmailDTO);booleanaddMailPerson(MailPOmailPO);}impl
importcn.hutool.core.util.IdUtil;/***@authorcrush*邮箱发送实现类*/@ServicepublicclassMailServiceImplimplementsMailService{@AutowiredMailSenderConfigsenderConfig;@AutowiredMailPropertiesmailProperties;@AutowiredMailMappermailMapper;//这里之前配置了一个线程池,上文的链接中有,就不说了哈//@Async("taskExecutor")@Overridepublicvoidsend(MailDTOmailDTO){Stringcontext="<!DOCTYPEhtml>\n" "<htmllang=\"en\">\n" "\n" "<head>\n" "<metacharset=\"UTF-8\"/>\n" "<metaname=\"viewport\"content=\"width=device-width,initial-scale=1.0\"/>\n" "<title>xxxx邮件</title>\n" "<style>\n" "body{\n" "margin:0;\n" "padding:0;\n" "}\n" "\n" ".email{\n" "position:relative;\n" "width:100%;\n" "/*background-color:rgba(0,0,0,1);*/\n" "}\n" "\n" ".main{\n" "left:0;\n" "right:0;\n" "margin:auto;\n" "width:80%;\n" "max-width:800px;\n" "box-sizing:content-box;\n" "}\n" "\n" ".main.title{\n" "/*color:white;*/\n" "display:inline-flex;\n" "align-items:center;\n" "}\n" "\n" ".main.titlespan{\n" "margin:010px;\n" "}\n" "\n" ".maintable{\n" "width:100%;\n" "}\n" "\n" ".maintabletbodytd{\n" "/*background-color:white;*/\n" "padding:20px;\n" "text-align:left;\n" "border-bottom:1pxsolidrgb(161,161,161);\n" "}\n" "\n" "tfoottdp{\n" "color:rgb(161,161,161);\n" "font-size:13px;\n" "}\n" "\n" "a{\n" "color:rgb(161,161,161);\n" "text-decoration:none;\n" "}\n" "\n" "a:hover{\n" "border-bottom:1pxsolidrgb(161,161,161);\n" "}\n" "</style>\n" "</head>\n" "\n" "<body>\n" "<divclass=\"email\">\n" "<divclass=\"main\">\n" "<table>\n" "<thead>\n" "<tr>\n" "<td>\n" "<h1class=\"title\">\n" "<imgwidth=\"60\"src=\"xxxxx\"alt=\"\"/>\n" "<span>" mailDTO.getTitle() "</span>\n" "</h1>\n" "</td>\n" "</tr>\n" "</thead>\n" "<tbody>\n" "<tr>\n" "<td>\n" "" mailDTO.getContent() "\n" "</td>\n" "</tr>\n" "</tbody>\n" "<tfoot>\n" "<tr>\n" "<td>\n" "<p>邮件由系统自动发送,请勿直接回复。</p>\n" "<p>官方网站:\n" "<ahref=\"" 这样此表单所填的资料将会发送到这个邮箱地址。method 是指传送信息给cgi等网络程序的方式。可选post方法, get方法,post方法容许传送大量信息。get方法只接受低于1k的信息。
申请表单用的是post搜索引擎用的是get
input元素
语法格式:<input type="">
type属性的可选值有:
text 单行文本框
属性:name 文本框名称
value 文本框的初始值
size 文本框的长度
maxlength 可输入字符串最大的长度
radio 单选框
属性:name 单选框名称
value 内部值
checked 默认选定
checkbox 复选框
属性:name 复选框名称
value 内部值
checked 默认选定
reset 重置按钮
submit 确定按钮
属性:name 按钮名称
value 显示在按钮上的文字
password 密码框
属性与文本框的属性完全相同
file 文件域
属性:name文件域名称
size 文件域的长度
maxlength 文件域可接受的字符数量的上限
hidden 隐藏域
属性:name 隐藏域名称
value 内定值
image 域
属性:name 所要代表的按钮,可以是submit,reset,或其他.
src 按钮的url 地址
列表框<select>
语法格式:
<select>
.....
<option>....</option>
.....
</select>
select元素
语法格式:<select name="" size=""multiple></select>
name 指定列表框的名字
size 指定列表框显示列表项的条数,如果指定了该参数,select元素是个列表,否则是一个下拉列表框
multiple 指定了这个参数,则表示该列表框可选择多项,否则只可选择一项
option属性
语法格式:<option value="" selected></option>
value 该列表项的值
selected 如果设定了这个参数,默认为选定这一项
多行文本框<textarea>
<textarea name="" cols="" rows="" wrap="off/physical/virtual"></textarea>
属性:
name文本框的名称
cols文本框的宽度
rows文本框的高度
wrap文本框的折行方式可选值有:
off不保存换行信息
physical强迫浏览器在发送信息到web服务器端时必须将多行文本框的文字一行一行的送出,
virtual送出连续成串的字除非使用者按回车。
css 层叠样式表
引入层叠样式表的方法包括:
1,外联式样式表
2,内嵌样式表
3,元素内定
4,导入样式表
外联式样式表
例:<head>
<link rel="stylesheet" href="/css/default.css">
</head>
<body>
....
</body>
</html>
属性:rel 用来说明<link>元素在这里要完成的任务是连接一个独立的css文件。而href属性给出了所要连接css文件的url地址
内嵌式样式表:
例:<html>
<head>
<style type="text/css">
<!--
td{font:9pt;color:red}
.font105{font:10.5pt;color:blue}
-->
</style>
</head>
<body>....</body>
</html>
元素内定
格式:<p style="font-size:10.5pt">
导入式样式表
〈html>
<head>
<style type="text/css">
<!--
@import url(css/home.css);
-->
</style>
<body>
....
</body>
</html>
css的优先级
越接近目标的样式定义优先级越高,高优先级样式将继承低优先级样式的未重叠定义但覆盖重叠的定义
如果4种样式表对同一元素定义了不同的样式,那么他们的优先级顺序从高到低是,元素内定,内嵌样式表,导入样式表,外联样式表。
css结构
例:td{font-size:10.5pt;color:#666666}
css样式包含两个基础部分,
选择符<td>和声明{font-size:10.5pt;color:#666666}
声明也有两部分组成:
属性font-size,color和值10.5pt,#666666
选择符分为6种
1元素选择符
当页面上多个元素的样式相同时,可以将多个元素放在一起定义,中间以逗号分开 例:td,p,li,input,select{font-size:12px;}
2class(类)选择符
例:〈head>
<title>.....</title>
<style type="text/css">
<!--
.red{font-size:10.5pt;color:#ff0000}
-->
</style>
</head>
<body bgcolor="#ffffff">
<p class="red">士大夫井冈山地方官</p>
<p>九连环离开计划</p>
</body>
还有一种方法就是限定可以应用它的页面元素
例:〈head>
<title>.....</title>
<style type="text/css">
<!--
h1.red{color:#ff0000}
-->
</style>
</head>
<body bgcolor="#ffffff">
<p class="red">士大夫井冈山地方官</p>
<h1 class="red">九连环离开计划</h1>
</body>
3 id选择符
与class选择附类似,只是把'.'换成'#'
例:<body>
<head>
<style type="text/css">
<!--
#select{font-size:18px;color:#0000ff}
-->
</style>
</head>
<body>
<table width="250" border="1" height="50">
<tr>
<td align="center" id="select">id选择符</td>
</tr>
</table>
</body>
</html>
我们看到在调用ID选择附时与CLASS选择附类似,只是将class=""换成了id="",方便页面脚本语言的调用
4 关联选择符
<body>
<head>
<style type="text/css">
<!--
td p{font-size:18px;color:#0000ff}
-->
</style>
</head>
<body>
<table width="250" border="1" height="50">
<tr>
<td align="center"><p>关联选择符</p></td>
</tr>
</table>
<p>关联选择符</p>
</body>
</html>
我们设定了在元素中<td>的元素<p>所包含文字的样式,只有在两个条件都满足是,样式在会起作用,
5伪类选择符
是只能用在css选择符里,而不能用在html代码中的选择符
例:
〈html>
<head>
<style type="text/css">
<!--
a:link{color:#000000}
a:visited{color:#cccccc}
a:hover{color:#ff0000}
a:active{color:#ooooff}
-->
</style>
</head>
<body>
<p><a href="#">关联选择符</a><p>
<p><a href="#">关联选择符</a><p>
<p><a href="#">关联选择符</a><p>
<p><a href="#">关联选择符</a><p>
〈/body>
</html>
正确的顺序是a:link\a:visited\a:hover否则会引起页面上连接颜色混乱
6伪元素选择符
与伪类选择符定义类似,目前被大多数浏览器支持的有两个:首行伪元素(first-line)和首字符伪元素(first-letter)是用来实现首行大写和首行下沉效果的
例:首行
<html>
<head>
<style>
<!--
p:first-line{color:red;font-size:20pt}
-->
</style>
</hesd>
<body>
<p>dfgsadfgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdf...</p>
</body>
</html>
长度随浏览器窗口大小而改变
首字
<html>
<head>
<style>
<!--
p:first-letter{color:red;font-size:50pt;float:left;}
-->
</style>
</hesd>
<body>
<p>dfgsadfgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdf...</p>
</body>
</html>
以上两种都只能应用于块状元素上
css规则
一继承
例:<html>
<head>
<style type="text/css">
<!--
td{font-size:12pt}
p{color:red}
-->
</style>
</hesd>
<body>
<table width="300" border="1" height="150">
<tr>
<td align="center">
<p>css规则</p>
</td>
</table>
</body>
</html>
<p>为最高级<td>次一级两种css用在一个属性元素上,相同的覆盖,不同的继承,
二组合
例:td{font-size:12pt}
p1{font-size:12pt}
组合后
td,.p1{font-size:12pt}
三层叠
在样式里定义过后,在表格属性中又定义一次
<html>
<head>
<style type="text/css">
<!--
red{color:#ff0000 limportant}
-->
</style>
</hesd>
<body>
<table width="300" border="1" height="150">
<tr>
<td align="center" style="color:#0000ff" class="red">决撒地方官</td>
</tr>
</table>
</body>
</html>
css单位
分四大类:
1 长度单位
数值可以是整数,小数,正数,负数,0,后加单位(负值不要轻易使用)
换算关系:
1in(英寸)=6pc(派)
1in(英寸)=72pt(磅)
1in(英寸)=2.54(厘米)
1cm(厘米)=10mm(毫米)
1cm(厘米)=0.3937(英寸)
1pt(磅)=1/72in(英寸)=0.2478mm(毫米)
1pc(派)=1/6in(英寸)=我国新四号铅字的尺寸
2 百分比单位
3 颜色单位
4 url单位
2024土木工程最吃香的三个专业
2024土木工程最吃香的3个专业是桥梁与隧道工程、市政工程、岩土工程。桥梁与隧道工程专业属于土木工程专业下就业率比较好的专业之一,只要能接受工作性质下一定的岗位环境的艰苦性,薪资待遇也会比较优厚。
2024土木工程最吃香的3个专业
1、桥梁与隧道工程专业
桥梁与隧道工程属土木工程的二级学科,是集设计、施工与工程管理为一体的具有很强实践性的工程学科,旨在培养与工程建设领域相关的各种高级技术与管理人才。
此专业属于土木工程专业下就业率比较好的专业之一,只要能接受工作性质下一定的岗位环境的艰苦性,薪资待遇也会比较优厚。
2、市政工程专业
在“城镇化”与城市现代化建设高速发展的情况下,市场上对于市政工程专业类型的岗位还有着大量的缺口,市政中心、各建筑设计院都在常年招聘相关的岗位。所以市政工程专业,也是未来就业前景与发展空间很好的选择。
3、岩土工程专业
岩土工程专业属于土木工程下面最重要的一个分支,毕业可以到建筑、市政、铁路、公路、水电、国防等行业中从事岩土工程领域的设计、施工、工程技术管理或工程监理等方面的工作。
<
序号 | 专业名 | 专业代码 | 修业年限 | 授予学位 |
1 | 土木工程 | 81001 | 四年 | 工学学士 |
2 | 建筑环境与能源应用工程 | 81002 | 四年 | 工学学士 |
3 | 给排水科学与工程 | 81003 | 四年 | 工学学士 |
4 | 建筑电气与智能化 | 81004 | 四年 | 工学学士 |
5 | 城市地下空间工程 | 081005T | 四年 | 工学学士 |
6 | 道路桥梁与渡河工程 | 081006T | 四年 | 工学学士 |
7 | 铁道工程 | 081007T | 四年 | 工学学士 |
8 | 智能建造 | 081008T | 四年 | 工学学士 |
9 | 土木、水利与海洋工程 | 081009T | 四年 | 工学学士 |
10 | 土木、水利与交通工程 | 081010T | 四年 | 工学学士 |
11 | 城市水系统工程 | 081011T | 四年 | 工学学士 |
12 | 智能建造与智慧交通 | 081012T | 四年 | 工学学士 |
13 | 工程软件 | 081013T | 四年 | 工学学士 |
施工单位
施工单位是土木工程专业的主要就业方向,毕业生就业机会较多。施工单位的工作环境比较复杂,需要处理复杂的工程问题,对土木专业的人才需求量大。此外,施工单位的工作强度较大,工作时间长,但工资待遇相对较好。
设计院
结构工程是土木工程专业的一个就业方向,毕业生可以在设计院、施工企业等企事业单位就业。他们主要就业岗位包括结构工程师、结构设计工程师等。随着我国工程建设的发展,对结构工程人才的需求越来越大。就业前景广阔。
随着城市建设的提速和公路建设的不断增加,土木工程专业的就业形势持续走高。找到一份工作,对大多数土木工程专业毕业生来讲并非难事,由于大环境的影响,找工作会更容易一些,因为施工对学历的要求不是很高,而且人员需求很多。所以,很好就业。
太阳穴凹陷有什么补救的办法嘛?怎么做才能让太阳穴恢复饱满呢?
<p>太阳穴凹陷的话,主要的补救方法就是进行填充了,主要的填充材料有以下几种:</p><p><span style=\"background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);\"><strong>1.玻尿酸填充太阳穴</strong></span></p><p>玻尿酸作为填充材料是整形手术中非常常见的了,主要的优势是微创,恢复快、创伤小,但是它也是有劣势的,因为玻尿酸是会被人体逐渐吸收,因此维持时间短是自然的,如果想长期维持效果的话,那就需要定期进行注射。</p><p><span style=\"background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);\"><strong>2.自体脂肪填充太阳穴</strong></span></p><p>自体脂肪是非常理想的填充材料,因为源于自身,也不会排异,并且同样是微创的方式,因此相比于玻尿酸填充太阳穴来说,自体脂肪填充的优势更为明显,重点是自体脂肪填充只要是脂肪存活之后,效果基本是能长期维持的。</p><p><img src=\"/uploadfile/image/20200330/1585532200224658.png\" title=\"1585529018657997.png\" alt=\"5.png\"/></p><p style=\"text-align: center;\">自体脂肪填充前后对比</p><p><span style=\"background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);\"><strong>3.假体填充</strong></span></p><p>假体填充虽然说在不排异且没有感染的前提下效果是能一直维持的,但是假体在手感上难免比不上自体脂肪,并且对于假体排异体质的人来说是不适合的。</p><p>当然,这三种材料都能让太阳穴恢复饱满,具体选择哪种方式就需要结合个人实际情况来进行综合选择了。</p><p><span style=\"color: rgb(192, 0, 0);\"><strong>其他网友正在关注的问题:</strong></span></p><p><a href=\"/mblk/1719594.html\" target=\"_self\">太阳穴凹陷还是颧骨高,怎么区别?</a></p><p><a href=\"/xb/1718385.html\" target=\"_self\">假体丰太阳穴多少年需要换假体?</a></p><p><a href=\"/stsx/1703416.html\" target=\"_self\">太阳穴填充用自体脂肪好还是注射好?</a></p><p><span style=\"color: rgb(192, 0, 0);\"><strong>猜你喜欢:</strong></span></p><p><a href=\"/yiyuan/898/gl_10212.html\" target=\"_self\">脂肪填充老了会怎样?自体脂肪填充的利弊分析!</a></p><p><a href=\"/yiyuan/36/gl_9963.html\" target=\"_self\">嗨体填充泪沟好不好?打完嗨体几天能见效?</a></p><p><a href=\"/yiyuan/70/gl_9358.html\" target=\"_self\">韩国TL整形医院脂肪填充效果怎么样?能维持多久?</a></p>
《2024土木工程最吃香的三个专业》拓展阅读
2024热门专业排名前十名和什么专业吃香
答:2024就业率高的热门专业有哪些 1.计算机科学与技术专业 计算机科学与技术专业毫无疑问会上榜,上榜的理由也非常的简单,社会和企业的发展都是离不开计算机的,很多行业都需要这方面的人才。2.土木工程专业 本专业培养掌握工程力学、流体力学、岩土力学和市政工程学科的基本理论和基本知识,具备从事土木工程的......更多详细2024土木工程专业主要学什么课程 就业前景及方向有哪些
答:土木工程专业学习的课程有高层建筑设计、建筑结构抗震设计、房屋建筑学、建筑制图、结构力学等,土木工程专业虽然就业前景比较广阔,但高考生们在选择的时候,还是要看自己是否喜欢这个专业,兴趣是最好的老师,无论专业是否是热门专业,自己喜欢才是最重要的。土木工程专业主要学习课程 序号课程名称1高层建筑......更多详细以上就是新高三网整理的关于2024土木工程最吃香的三个专业 2024热门专业排名前十名和什么专业吃香的全部内容,希望你在了解【
本页面文章2024土木工程最吃香的三个专业内容由互联网用户自发贡献,该文观点仅代表用户本人,并不代表新高三网立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容(包括不限于图片和视频等),请邮件至379184938@qq.com 举报,一经查实,本站将立刻删除。