千家信息网

怎么使用spring boot发邮件

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"怎么使用spring boot发邮件",在日常操作中,相信很多人在怎么使用spring boot发邮件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎
千家信息网最后更新 2026年11月03日怎么使用spring boot发邮件

这篇文章主要介绍"怎么使用spring boot发邮件",在日常操作中,相信很多人在怎么使用spring boot发邮件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么使用spring boot发邮件"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、最简版spring boot发邮件

spring boot发邮件还是挺简单的,首先把发邮件的start加到pom里面:

                                org.springframework.boot                        spring-boot-starter-mail                

然后在application.properties里面配置好关于发邮件的参数

spring.mail.host=smtp.163.comspring.mail.port=25spring.mail.username=yourmail@163.comspring.mail.password=yourpassword

其中spring.mail.host和spring.mail.username是一一对应的,哪里的邮箱就要用哪里的smtp服务器

然后我写了一个controller来接收留言板的内容:

    @Value("${spring.mail.username}")        private String fromMail;        @Autowired    private JavaMailSender mailSender;    @RequestMapping(value = "/getNote", method = RequestMethod.POST)        public String getNote(Note note) {                MimeMessage mimeMessage = mailSender.createMimeMessage();        MimeMessageHelper helper;                try {                        helper = new MimeMessageHelper(mimeMessage, true);                        //发件人                helper.setFrom(fromMail,note.yourName);                //收件人(留言内容最终发往的邮箱地址)                helper.setTo("recieve@mail.com");                //标题                helper.setSubject(note.yourSubject);                //文本                helper.setText("from email:"+note.yourEmail+"\n"+note.yourMessage);                mailSender.send(mimeMessage);                } catch (MessagingException | UnsupportedEncodingException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                }                               return "redirect:return.htm";        }
public class Note {        String yourName;        String yourEmail;        String yourSubject;        String yourMessage;//getter,setter省略}
  • note对象是留言板的内容

  • JavaMailSender和MimeMessageHelper是官方推荐的好基友,一般配套使用

  • fromMail就是在application.properties里面配置的spring.mail.username属性,也就是发邮件的一方,用helper.setTo(...)配置

  • 额外说一下,由于填留言板时一般也会留邮件地址,但那个邮件地址和这里的任何一个设置邮件的地方毫无关系,只需要在邮件的文本里面做记录就好了,我之前就弱智了一把,把留言板里面的邮件地址填到helper.setTo(...),结果浪费了我半个小时查这种bug,真是一言难尽...

2、授权码发邮件

很多时候,按照上面的方法发邮件会出现下面的错误:

javax.mail.AuthenticationFailedException: 535 Error: authentication failed

其中的一个原因是邮件服务器使用了授权码登录方式,也就是第三方登录不能直接使用账号密码,而需要使用一种授权码的方式,比如上面的163.com邮箱,就可以设置授权码登录,设置界面如下:

QQ邮箱更是默认就需要用授权码登录,QQ邮箱的授权登录操作文档请看这里

使用授权码登录后,需要把之前application.properties里面spring.mail.password的内容从密码换成授权码,就能够正常发邮件了。

3、简单聊下JavaMailSender和MimeMessageHelper

我们查下JavaMailSender的代码就知道,它其实背景比较复杂。首先它继承了org.springframework.mail.MailSender接口。

public interface JavaMailSender extends MailSender {...}

而它本身也是一个接口,实现类只有一个,JavaMailSenderImpl

我们再来翻JavaMailSenderImpl的代码,发现spring并没有自己来做发送邮件的功能,而是直接用了java自身的邮件发送功能,核心是这一段

protected void doSend(MimeMessage[] mimeMessages, @Nullable Object[] originalMessages) throws MailException {                Map failedMessages = new LinkedHashMap<>();                Transport transport = null;                try {                        for (int i = 0; i < mimeMessages.length; i++) {                                // Check transport connection first...                                if (transport == null || !transport.isConnected()) {                                        if (transport != null) {                                                try {                                                        transport.close();                                                }                                                catch (Exception ex) {                                                        // Ignore - we're reconnecting anyway                                                }                                                transport = null;                                        }                                        try {                                                transport = connectTransport();                                        }                                        catch (AuthenticationFailedException ex) {                                                throw new MailAuthenticationException(ex);                                        }                                        catch (Exception ex) {                                                // Effectively, all remaining messages failed...                                                for (int j = i; j < mimeMessages.length; j++) {                                                        Object original = (originalMessages != null ? originalMessages[j] : mimeMessages[j]);                                                        failedMessages.put(original, ex);                                                }                                                throw new MailSendException("Mail server connection failed", ex, failedMessages);                                        }                                }                                // Send message via current transport...                                MimeMessage mimeMessage = mimeMessages[i];                                try {                                        if (mimeMessage.getSentDate() == null) {                                                mimeMessage.setSentDate(new Date());                                        }                                        String messageId = mimeMessage.getMessageID();                                        mimeMessage.saveChanges();                                        if (messageId != null) {                                                // Preserve explicitly specified message id...                                                mimeMessage.setHeader(HEADER_MESSAGE_ID, messageId);                                        }                                        Address[] addresses = mimeMessage.getAllRecipients();                                        transport.sendMessage(mimeMessage, (addresses != null ? addresses : new Address[0]));                                }                                catch (Exception ex) {                                        Object original = (originalMessages != null ? originalMessages[i] : mimeMessage);                                        failedMessages.put(original, ex);                                }                        }                }                finally {                        try {                                if (transport != null) {                                        transport.close();                                }                        }                        catch (Exception ex) {                                if (!failedMessages.isEmpty()) {                                        throw new MailSendException("Failed to close server connection after message failures", ex,                                                        failedMessages);                                }                                else {                                        throw new MailSendException("Failed to close server connection after message sending", ex);                                }                        }                }                if (!failedMessages.isEmpty()) {                        throw new MailSendException(failedMessages);                }        }

doSend方法中调用的核心类就是Transport类,这个类的包名是javax.mail。spring不愧是集成大师,java自带的mail功能经过spring的标准化包装就成了spring自身功能的一部分,再通过spring boot的包装,用starter的方式再次做简化,我们就能够直接通过极简的方式使用了。

当然,简化的方法多种多样,另外的一种形式的包装就是使用helper类的方法,spring使用的就是MimeMessageHelper。在javax.mail在处理邮件的方式上,使用的是分而治之的办法,不同的类处理不同的问题,所以看到很多的类在处理各种问题和情况。

这种做法在实现功能上是很好的,把一个复杂的问题分解成若干个小问题,分别实现。但对使用的开发人员就谈不上友好了,容易出现以下几个问题:

  • 不直观,调用者不知道从何下手

  • 查找麻烦,类太多而且功能分散,不容易找到对应的功能类

  • 关系复杂,经常对要引用哪个类会很没有把握,因为太多处理单一问题的类

  • 没有统一的入口,上手难,很难脱离文档直接使用

针对上述情况,spring通过MimeMessageHelper,把几乎所有邮件发送需要处理的问题就集中到了这个类里面,使用方便又好找。下面是这个类所有的方法。

到此,关于"怎么使用spring boot发邮件"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

邮件 功能 问题 方法 登录 方式 邮箱 处理 内容 地址 就是 留言板 学习 复杂 面的 包装 配置 不同 也就是 代码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网高科技 互联网科技行业发展 腾讯阿里互联网科技 关于新基建和互联网科技 贷财互联网科技 科技创新互联网企业 火传媒上海互联网科技 互联网高科技企业 互联网科技大会案例 互联网科技类展会 老年人脱离互联网科技的作文 济南华为互联网科技产业总部基地 新兴科技互联网创新大赛颁奖典礼 国大互联网教育科技有限公司工作 南博望互联网科技有限公司 山东子淼互联网科技有限公司 广州燕处互联网科技有限公司 互联网的科技体现在哪里 互联网企业和网络科技有限公司 株洲百竞科技的互联网营销顾问 互联网通讯科技 科技类互联网 深圳齐家互联网科技 汉立互联网科技有限公司联系电话 互联网科技博主是什么意思 阿里互联网科技公司 厦门比较好的科技互联网公司 科技类公司包括互联网吗 工业互联网展湾科技股份有限公司 中国新注册互联网科技
0