【SpringBoot必知必会 JavaMail踩坑记】

Email介绍

邮件服务在互联网早起就已经出现,如今已成为人们互联网生活中必不可少的一项服务。邮件发送与接收的过程如下:
(1)发件人使用SMTP协议传输邮件到邮件服务器A。
(2)邮件服务器A根据邮件中指定的接收者投送邮件至相应的邮件服务器B。
(3)收件人使用POP3协议从邮件服务器B接收邮件。
SMTP是一种提供可靠且有效的电子邮件传输的协议。默认使用25端口。
POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。
我们日常使用网站和App时,总会遇到忘记密码等情况,这时候发送邮件进行验证就派上用场了。SUN公司给广大JAVA开发人员提供一款邮件发送和接收的开源类库JavaMail,支持常用的邮件协议,如SMTP、POP3、IMAP等。JavaMail可以发送各种复杂的MIME格式的邮件内容,主义JavaMail仅支持JDK4及以上版本。虽然JavaMail是JDK的API,但它并没有直接加入JDK中,所以我们需要添加依赖。

引入依赖

要在SpringBoot中集成Mail,首先需要再pom.xml文件中引入所需的依赖,具体代码如下:

		<!--邮件Mail整合-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-mail</artifactId>
		</dependency>

在pom文件中引入Mail所需的依赖之后,我们需要在application.properties(或者application.yml)文件中添加如下配置信息(有的人喜欢用properties,而有的人喜欢yml。我个人比较喜欢yml的配置方式,所以下面给出的也是yml的):

spring:
  mail:
#  邮箱相关配置
    host: smtp.163.com
    username: superbond147@163.com
    password: 123456
#    默认编码
    default-encoding: UTF-8
    properties:
      smtp:
        auth: true
        starttls:
          enable: true
          required: true

邮件工具类

我们自定义一个邮件工具类,执行发送邮件的动作,具体代码如下:

public class SendMailUtil {
    @Autowired
    private JavaMailSender mailSender;
    @Value("${spring.mail.username}")
    private String from;
    public void sendMail(String to, String subject, String content) throws Exception {
        MimeMessage message = mailSender.createMimeMessage();
        //true代表是multipart类型
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        //邮件主题
        helper.setSubject(subject);
        //邮件发送方
        helper.setFrom(from);
        //邮件接收方
        helper.setTo(to);
        //true代表支持HTML
        helper.setText(content, true);
        mailSender.send(message);
    }
}
  • @Value:可以将配置文件中的配置设置到属性中。如上面的代码中,将spring.mail.username的值设置给from属性。

测试邮件是否能发送成功

我们编写完工具类之后,就可以动手编写我们的测试类了,具体代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloControllerTest {
    @Test
    public void sendMail()throws Exception{
       sendMailUtil.sendMail("timetasktest@163.com","321",
               "123");
    }
}

以为到这里大功告成了,殊不知这里才是噩梦的开始。我们运行一下我们的测试方法,这时候报了一个NoSuchBeanDefinitionException的问题,如图:
在这里插入图片描述
这个问题比较容易解决,我们只需要在我们的邮件工具类上加入@Component注解即可。

我们再运行一次,出现了另外一个错误(550 User has no permission):
在这里插入图片描述
这个问题的解决需要我们改一下163邮箱的设置,具体操作如下:

1.登录发送的网易云邮箱
2.点击设置---->POP3/SMTP/IMAP,开启SMTP服务(有两个可选择,我选择了第一个开启的)
3.手机短信验证一下,之后会给你一个授权码,务必要记住(找个文件保存起来吧)
在这里插入图片描述

OK,我们再运行一次吧。结果这次报了535Error:
在这里插入图片描述
还记得我们的授权码吧,其实那个配置文件的password并不是填写我们的邮箱密码,而是要填写这个获取到的授权码。我们将配置文件中的password里面的值更改为我们的授权码,此问题便可以顺利解决了。

OK,这次总不会再出问题了吧,我们再次运行我们的此时方法。第一次总不会那么的顺利的,果不其然,又爆出了一个提示垃圾文件的问题:
在这里插入图片描述

简单查找了一下,发现我们只需要在邮件工具类加上抄送给自己就可以了,具体增加的代码如下:

        //抄送给自己
        message.addRecipients(Message.RecipientType.CC,from);

改完之后我们重新运行一次,这次激动得我跳了起来,终于发送成功了,满满的成就感呀。
在这里插入图片描述
我这里测试的发送给的是163的邮箱,那么更改成其它类型的邮箱会不会不能发送呢。后面我实验了发送给其它的邮箱,依旧是可以的,下图是发送到QQ邮箱的:
在这里插入图片描述
OK,今天的内容分享到这里就结束了,感谢读者的耐心阅读。如果有需要编程相关资源的可以关注我的公众号,全免费哦,只需要在后台输入关键词就能获取
在这里插入图片描述

每天进步一点点,开心也多一点点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white_poland

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值