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

    文章

    31

    浏览量

    18801
  • HTML
    +关注

    关注

    0

    文章

    278

    浏览量

    34643
  • spring
    +关注

    关注

    0

    文章

    338

    浏览量

    14319
  • SpringBoot
    +关注

    关注

    0

    文章

    173

    浏览量

    169
收藏 人收藏

    评论

    相关推荐

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

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

    SpringBoot实现多线程

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

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

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

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

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

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

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

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

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

    如何使用Python编写脚本来自动发送邮件

    Python是一种非常流行的编程语言,可以用于多种用途,包括自动化任务。其中一个常见的自动化任务是自动发送邮件。在本文中,我们将介绍如何使用Python编写脚本来自动发送邮件。 要使用
    的头像 发表于 12-07 11:36 1319次阅读