一、 首先需要通过spring boot进行自动的邮箱发送的话,需要对你的邮箱进行相应的授权,进入你的邮箱后,点击设置选择如图中的选项:
点击进入后,直接选择开启就可以了,此处我已经开启了,就不方便截图了,此时记住授权的密码,当我们在spring boot中进行密码配置时,指的就是这个密码。
顺便提一下我使用的是126邮箱。
二、当我们的邮箱授权开启后,我们就开始准备使用spring boot建立一个简易的邮件系统了。首先我们利用idea添加一个spring boot项目,然后我们在pom.xml中添加我们发送邮件所需要的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
此时,我们所需要的依赖已经引入,现在我们还需要在application.properties中添加我们邮件相关的配置信息。所需要的配置信息如下:
spring.mail.host=smtp.126.com //这是我们的邮箱的协议
spring.mail.username=你的邮箱名@126.com //这里填写的你邮箱名
spring.mail.password=密码 //这里填写你授权时所设定的密码
spring.mail.default-encoding=utf-8 //这里设置邮件发送的字符编码为utf-8
好了,至此我们正式开发之前的配置也弄好了,下面我们将开始正式开发了。
三、首先我们建立一个名为service的包,我们的邮箱的业务层类将在写在此包中。在service包中建立一个MailService类,首先我们在这个类中定义两个所有方法都需要用到的变量,他们分别是:
@Value("${spring.mail.username}")
private String from; //这里表示发件人是谁,一般都是你的邮箱名,所以我们就取邮箱名
@Autowired
private JavaMailSender mailSender; //这里是声明一个邮件发送的对象,并使用注解,将其变成bean
然后我们在test的文件夹下写一个MailServiceTest类,该类就是用来测试我们的邮件发送的。下面我们将写三个典型的类别的邮件发送,一种是纯文本的邮件发送,一种是HTML的邮件发送,还有最后一种是带附件的邮件发送。
1)纯文本的邮件发送
public void SimpleSend(String to,String subject,String content){
SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); //声明一个简单的邮件发送的对象
simpleMailMessage.setTo(to); //这是表示邮件发送给谁
simpleMailMessage.setSubject(subject); //这是表示邮件的主题
simpleMailMessage.setText(content);//这是表示邮件的内容
simpleMailMessage.setFrom(from); //这是设置邮件发送人
mailSender.send(simpleMailMessage);//利用邮件发送类进行邮件的发送
}
至此,我们的一个简单的纯文本邮件发送方法写完了,下面我们在test的那个类中写一个test方法,来测试这个方法是否能够执行成功:
@Test
public void simpleMailsendTest(){
mailService.SimpleSend("目的邮箱","第一封邮件","大家好,这是我的第一封邮件");
}
直接执行这个方法,很快你就能看到这个方法是否执行成功,正常来说,这封邮件无论发给谁都会成功的。这是什么意思呢?后面的测试中你会发现,有些邮件的发送方法执行后没有报错,可是目的邮箱并没有接收到,后面我再解释如何解决部分的这种问题!
好了现在纯文本邮件发送完毕了,是不是非常简单??那我们再继续往下走吧!
2)HTML邮件发送
HTML邮件发送就稍微比纯文本的邮件发送在方法内部要多几个步骤了,但是同样也是不复杂,我们还是直接上代码,然后再代码中的注释给出解释:
public void HtmlSend(String to,String subject,String content) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage(); //这时候我们就不能声明上一个那个类的对象了,必须声明这个对象,也即用邮件发送对象创建的一个邮件对象
MimeMessageHelper helper = new MimeMessageHelper(message,true);
helper.setText(content,true);//这是跟文本邮件的核心区别,他必须在后面声明为true类型,它默认是false,也就是说默认是纯文本的
helper.setTo(to);
helper.setFrom(from);
helper.setSubject(subject);
mailSender.send(message);
}
大家可以看到,其实差别并不大,也不过多了几个弯弯而已,那个设置文本内容方法的第二个参数才是真正的核心。
下面我们来看看我们的测试方法:
@Test
public void htmlSendTest() throws MessagingException {
String content = "<html>\n"+
"<body>\n"+
"<h3>hello world 这是第一封HTML文件</h3>\n"+
"</body>\n"+
"<html>";
mailService.HtmlSend("目的邮箱","这是第一封HTML邮件",content);
}
大家可以很明显的看出,我这里的文本内容其实就是一段HTML代码,大家可以发送成功后接收一下看看,它会自动解析这个HTML代码,变成你想呈现的内容。因此有一个很简单的应用,你可以在这个HTML中写一个图片标签,路径什么的设置好,看看你收到的邮件中图片是否会显示正常。
3)带附件的邮件发送
发送一个带有附件的邮件,那么就必定会涉及到文件上传的问题,我们看看如何实现:
public void sendAttachmentsMail(String to,String subject,
String content,String filepath) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message,true);
helper.setTo(to);
helper.setFrom(from);
helper.setText(content,true);
helper.setSubject(subject);
FileSystemResource file = new FileSystemResource(new File(filepath)); //通过文件路径获取文件
String fileName = file.getFilename();//获取文件名
helper.addAttachment(fileName,file);//固定的方法,表示附件的名字和附件本身
mailSender.send(message);
}
大家可以看到,其实就是多了一个文件处理的过程。那么我们再看看测试方法:
@Test
public void sendAttachmentsMailTest() throws MessagingException {
String filepath = "C://Users/Administrator/Desktop/SpringBoot/abc.zip";
mailService.sendAttachmentsMail("目的邮箱名","这是第一封带附件的邮件",
"这是一封带附件的邮件",filepath);
}
好了,至此我们三种类别的邮件应该说已经发送完毕了。那么我想应该有一些同学不是一帆风顺吧,有没有需要邮件发送失败??有没有遇到邮件发送被打回??
首先,我们在做这些测试的时候,最好将我们发送邮箱也作为接收邮箱,一般来说,这样的话测试时不会有问题的,但是确实不是很符合现实生活的实际场景,那么,如何解决邮件发送的554问题和回退问题呢???
我们可以首先给邮件添加一个马甲:
message.addHeader("X-Mailer","Microsoft Outlook Express 6.00.2900.2869");
但是往往这样可能还不行,应该还是会报错说发送的邮件不合法,这时候你就需要改改你的题目和内容了,非常有趣的是,我随便弄了一个名字和内容竟然真的就成功了,可以说十分有趣了!