0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于SpringBoot实现邮件发送

汽车电子技术 来源:Java烂笔头 作者:小週 2023-02-28 14:58 次阅读

应用场景

发送邮件验证码等,定时发送、同时发送多封邮件等。

功能简介

本项目通过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服务:

pYYBAGP9peiAafy9AAFvFeQIL9s479.png

点击“开启”-->验证密保-->获取授权码:

poYBAGP9pe-ADc0dAAETZCPr79A963.png

核心代码

@Service
public 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烂笔头”,回复“邮件

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 邮件
    +关注

    关注

    0

    文章

    28

    浏览量

    18749
  • HTML
    +关注

    关注

    0

    文章

    273

    浏览量

    29270
  • spring
    +关注

    关注

    0

    文章

    332

    浏览量

    14161
  • SpringBoot
    +关注

    关注

    0

    文章

    172

    浏览量

    106
收藏 人收藏

    评论

    相关推荐

    在Java中如何使用API来完成邮件的接收与发送

    的接收与发送。 通过该篇文章我们可以有如下收获: 了解基于Java的电子邮件客户端的实现方式 了解常见的邮箱如何集成 认识邮箱中的IMAP与POP协议 适用场景 邮件和短信很像,将信息
    的头像 发表于 09-30 14:09 1322次阅读
    在Java中如何使用API来完成<b class='flag-5'>邮件</b>的接收与<b class='flag-5'>发送</b>

    LV发送邮件

    求解:为什么LV发邮件的程序在 私人电脑可以实现发送,但是公司的电脑发送不了呢?且出现如下错误
    发表于 08-15 08:23

    [ARM linux平台] 如何实现发送邮件功能?

    如题,ARM已经正常跑linux系统了,但是如何设计发送邮件功能?
    发表于 03-06 13:43

    基于SpringBoot mybatis方式的增删改查实现

    SpringBoot mybatis方式实现增删改查
    发表于 06-18 16:56

    用SpringMVC发送邮件

    1、SpringMVC实现发送邮件  今天来试着用SpringMVC发送邮件,主要需要依赖以下两个包;  《!--spring
    发表于 10-21 14:47

    采用BCB实现具有身份认证功能的邮件发送l程序

    本文介绍了如何增强BCB中发送电子邮件的NMSMTP控件的功能,实现具有身份认证功能的邮件发送程序。  
    发表于 08-10 17:21 9次下载

    C#教程之调用Outlook发送邮件

    C#教程之调用Outlook发送邮件,很好的C#资料,快来学习吧。
    发表于 04-20 15:27 4次下载

    C#教程之调用SMTP发送有附件的邮件

    C#教程之调用SMTP发送有附件的邮件,很好的C#资料,快来学习吧。
    发表于 04-20 15:27 16次下载

    如何向您选择的某人发送电子邮件

    您可以通过单击左侧的“发送”选项卡来确认您的电子邮件是否已发送。它将显示您发送的所有电子邮件。如果未显示最近
    的头像 发表于 12-13 16:35 4770次阅读
    如何向您选择的某人<b class='flag-5'>发送电子邮件</b>

    SpringBoot实现多线程

    SpringBoot实现多线程
    的头像 发表于 01-12 16:59 1292次阅读
    <b class='flag-5'>SpringBoot</b><b class='flag-5'>实现</b>多线程

    怎么用Python构建一个自动发送邮件的脚本

    自动发送邮件能应用于许多场景,比如我想要知道股票策略中的股票池是否有实时的更新,这时候如果再拉一遍数据,跑一遍脚本,实在是太浪费时间了。为什么不把这一套流程放到服务器上,然后到点自动运行并发送
    的头像 发表于 10-21 14:47 439次阅读
    怎么用Python构建一个自动<b class='flag-5'>发送</b><b class='flag-5'>邮件</b>的脚本

    【开源获奖案例】基于T5L的smtp邮件发送

    ——来自迪文开发者论坛本期为您推送一个非常实用的迪文开发者论坛获奖开源案例——基于T5L的smtp邮件发送器。工程师采用T5L智能屏,通过WiFi模块访问smtp服务器,实现发送
    的头像 发表于 10-31 08:14 427次阅读
    【开源获奖案例】基于T5L的smtp<b class='flag-5'>邮件</b><b class='flag-5'>发送</b>器

    怎么用Python构建一个自动发送邮件的脚本

    自动发送邮件能应用于许多场景中,比如我想要知道股票策略中的股票池是否有实时的更新,这时候如果再拉一遍数据,跑一遍脚本,实在是太浪费时间了。为什么不把这一套流程放到服务器上,然后到点自动运行并发送
    的头像 发表于 10-31 16:36 295次阅读
    怎么用Python构建一个自动<b class='flag-5'>发送</b><b class='flag-5'>邮件</b>的脚本

    如何用Python批量定制化发送邮件

    现实生活中,如果只是发邮件给自己,像上一篇文章那样简陋的格式是可以接受的,但若要针对每个人进行邮件的定制化,群发给公司客户、内部员工、亲戚朋友,则需更加高级的邮件发送方式。 我们可以通
    的头像 发表于 11-01 11:32 314次阅读

    利用Python发送邮件的 3 种方式

    1. 前言 邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到 我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本、富文本、HTML 等格式的邮件 本文将聊聊利用
    的头像 发表于 11-02 11:37 656次阅读