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,今天的内容分享到这里就结束了,感谢读者的耐心阅读。如果有需要编程相关资源的可以关注我的公众号,全免费哦,只需要在后台输入关键词就能获取
每天进步一点点,开心也多一点点