应用场景 发送邮件验证码等,定时发送、同时发送多封邮件等。
功能简介 本项目通过springboot发送email邮件,包括普通文本邮件 、html内容板式邮件 、包含静态资源邮件以及带附件邮件等。
一封邮件同时发送多人、异步多线程发送邮件、定时发送邮件等场景功能。
项目说明 核心maven依赖
org.springframework.boot
spring-boot-starter-mail
核心配置 如果是服务邮箱配置类似
#qq邮箱服务主机地址 spring.mail.host=smtp.qq.com #邮箱账号 spring.mail.username=2389323369@qq.com #邮箱授权码 spring.mail.password=qtglycyclomqgci#右键默认编码 spring.mail.default-encoding=utf-8
spring.mail.username=2289523269@qq.com
----需要修改成自己的邮箱账号(发送方邮箱) #邮箱授权码
spring.mail.password=qtglycyclomqgci
----需要修改成自己的邮箱授权码(下面会介绍如何获取)
qq邮箱授权码获取 如果授权码不正确会报错误
org.springframework.mail.mailauthenticationexception: authentication failed; nested exception is javax.mail.authenticationfailedexception: 535 login fail. please enter your authorization code to login. more information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
at org.springframework.mail.javamail.javamailsenderimpl.dosend(javamailsenderimpl.java:439)
at org.springframework.mail.javamail.javamailsenderimpl.send(javamailsenderimpl.java:322)
at org.springframework.mail.javamail.javamailsenderimpl.send(javamailsenderimpl.java:311)
at com.example.demo.service.impl.mailserviceimpl.sendsimplemail(mailserviceimpl.java:38)
1、什么是授权码?
授权码是qq邮箱推出的,用于登录第三方客户端的专用密码。适用于登录以下服务:pop3/imap/smtp/exchange/carddav/caldav服务。温馨提醒:为了你的帐户安全,更改qq密码以及独立密码会触发授权码过期,需要重新获取新的授权码登录。
2、怎么获取授权码?
进入qq邮箱主页-->设置-->帐户-->pop3/imap/smtp/exchange/carddav/caldav服务:
点击“开启”-->验证密保-->获取授权码:
核心代码@servicepublic class mailserviceimpl implements mailservice { /** * 日志 */ private static final org.slf4j.logger logger = loggerfactory.getlogger(mailserviceimpl.class); @value(${spring.mail.username}) private string from; //用于发送文件 @autowired private javamailsender mailsender; @override public void checkmail(emailmodel emailmodel) { assert.notnull(emailmodel,邮件模板不能为空); assert.notnull(emailmodel.getemail(), 邮件收件人不能为空); assert.notnull(emailmodel.getsubject(), 邮件主题不能为空); assert.notnull(emailmodel.getcontent(), 邮件内容不能为空); } @async(emailasync) @override public boolean sendsimplemail(emailmodel emailmodel) { try { simplemailmessage message = new simplemailmessage(); message.setfrom(from);//发信人 message.setto(emailmodel.getemail().split(;));//邮件收件人 1或多个 以;隔开 message.setsubject(emailmodel.getsubject());//主题 message.settext(emailmodel.getcontent());//内容 mailsender.send(message); logger.info(发送文本邮件成功); } catch (exception e) { e.printstacktrace(); logger.error(发送文本邮件失败); return false; } return true; } @async(emailasync) @override public boolean sendhtmlmail(emailmodel emailmodel) { string to = emailmodel.getemail(); string subject = emailmodel.getsubject(); string content = emailmodel.getcontent(); logger.info(发送html邮件开始:{},{},{}, to, subject, content); //使用mimemessage,mime协议 mimemessage message = mailsender.createmimemessage(); mimemessagehelper helper; //mimemessagehelper帮助我们设置更丰富的内容 try { helper = new mimemessagehelper(message, true); helper.setfrom(from); helper.setto(to.split(;)); helper.setsubject(subject); helper.settext(content, true);//true代表支持html mailsender.send(message); logger.info(发送html邮件成功); } catch (messagingexception e) { logger.error(发送html邮件失败:, e); return false; } return true; } @async(emailasync) @override public boolean sendattachmentmail(emailmodel emailmodel) { string to = emailmodel.getemail(); string subject = emailmodel.getsubject(); string content = emailmodel.getcontent(); string filepath = emailmodel.getattachfilepath(); logger.info(发送附件邮件开始:{},{},{},{}, to, subject, content, filepath); mimemessage message = mailsender.createmimemessage(); mimemessagehelper helper; try { helper = new mimemessagehelper(message, true); //true代表支持多组件,如附件,图片等 helper.setfrom(from); helper.setto(to.split(;)); helper.setsubject(subject); helper.settext(content, true); filesystemresource file = new filesystemresource(new file(filepath)); string filename = file.getfilename(); helper.addattachment(filename, file);//添加附件,可多次调用该方法添加多个附件 mailsender.send(message); logger.info(发送附件邮件成功); } catch (messagingexception e) { logger.error(发送附件邮件失败, e); return false; } return true; } @async(emailasync) @override public boolean sendinlineresourcemail(emailmodel emailmodel) { string to = emailmodel.getemail(); string subject = emailmodel.getsubject(); string content = emailmodel.getcontent(); string resourcepath = emailmodel.getresourcepath(); string resourcename = emailmodel.getresourcename(); logger.info(发送带图片邮件开始:{},{},{},{},{}, to, subject, content, resourcepath, resourcename); mimemessage message = mailsender.createmimemessage(); mimemessagehelper helper; try { helper = new mimemessagehelper(message, true); helper.setfrom(from); helper.setto(to.split(;)); helper.setsubject(subject); helper.settext(content, true); // 以绝对路径的方式读取文件 filesystemresource res = new filesystemresource(new file(resourcepath)); helper.addinline(resourcename, res);//重复使用添加多个图片 mailsender.send(message); logger.info(发送带图片邮件成功); } catch (messagingexception e) { logger.error(发送带图片邮件失败, e); return false; } return true; } @async(emailasync) @override public boolean sendhtmlimagemail(emailmodel emailmodel) { string to = emailmodel.getemail(); string subject = emailmodel.getsubject(); string content = emailmodel.getcontent(); string resourcepath = emailmodel.getresourcepath(); logger.info(发送带图片邮件开始:{},{},{},{}, to, subject, content, resourcepath); mimemessage message = mailsender.createmimemessage(); mimemessagehelper helper; try { helper = new mimemessagehelper(message, true); helper.setfrom(from); helper.setto(to.split(;)); helper.setsubject(subject); helper.settext(content, true); // cid是固定写法 helper.settext( hello world! + , true); filesystemresource img = new filesystemresource(new file(resourcepath)); helper.addinline(aaa, img); mailsender.send(message); logger.info(发送带图片邮件成功); return true; } catch (messagingexception e) { logger.error(发送带图片邮件失败, e); return false; } } } 源码下载地址获取 关注微信公众号“java烂笔头”,回复“邮件”
FPGA中定点数的处理方法
德州仪器(TI)的破损玻璃检测器解决方案
禾赛科技发布全新高性价比的32通道中端激光雷达解决方案
SCT51240—单通道下管IGBT/MOSFET栅极驱动器
5G通信系统将突出“以用户为中心”,更加重视用户的个性化服务和用户体验
基于SpringBoot实现邮件发送
今日看点丨提高 20%,郭明錤称华为 Mate 60 Pro下半年出货量 600 万台;丰田下一代电动汽车将于 2026 年上市,续
13位权威专家深度解析2017年物联网九大领域新趋势
互联网巨头的智能家居布局大起底
创意电子5纳米测试芯片设计定案已在3月完成 将于第4季完成验证
气体脉冲放电电源的组成电路图
荣泰天猫旗舰店双十一超级大牌日即将震撼开启
苹果推出九年后 智能手机蓬勃发展时代宣告结束
延长流量计电池寿命的5个优秀实践
什么是手机制式
如何理解数字化转型的真正意义
什么是差分探头?差分探头的工作原理及用途介绍
微源低噪声LDO – LP3982优势分析
海信“大容量+新美学”真空冰箱实力圈粉,行业潮流新标杆
沁恒股份PCI总线接口芯片:CH365概述