发送前准备
使用QQ邮箱发送邮件,首先要申请开通POP3/SMTP服务或者IMAP/SMTP服务。SMTP为简单邮件传输协议,它定义了邮件客户端软件与SMTP服务器之间,以及SMTP服务器与SMTP服务器之间的通信规则。也就是说,xxx@qq.com 用户先将邮件投递到腾讯的SMTP服务器,这个过程就使用了SMTP协议,然后腾讯的SMTP服务器就将邮件投递到网易的SMTP服务器,这个过程依旧使用了SMTP协议,SMTP服务器就是用来接收邮件的。而POP3是邮局协议,它定义了邮件客户端与POP3服务器之间的通信规则。
下面介绍QQ邮箱开通POP3/SMTP服务的步骤:
1、登录QQ邮箱,依次单击顶部的设置按钮和账号按钮。
2、在账户选项卡下方找到POP3/SMTP服务,单击后方的“开启”按钮。
3、单击开始按钮后,通过引导步骤发送短信,操作成功后,会获取一个授权码。拿到授权码后,准备工作就完成了。
发送
1、环境搭建
使用SpringBoot发送邮件,首先导入依赖:
<!-- 发送邮箱的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
项目创建成功后,在application.properties中完成邮件基本信息配置,如下:
spring.mail.host=smtp.qq.com
spring.mail.port=465
spring.mail.username=自己的邮箱
spring.mail.password=授权码
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.debug=true
这样基本的环境就搭建好了。
2、发送简单邮件
创建一个service用来封装邮件的发送,代码如下:
package com.learn.qqemail.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
@Component
public class MailService {
@Autowired
private JavaMailSender javaMailSender;
/**
*发送简单邮件
* @param from 邮件发送者
* @param to 邮件收件者
* @param cc 邮件抄送者
* @param subject 邮件主题
* @param content 邮件内容
*/
public void sendSimpleMail(String from,String to,String cc,String subject,String content){
SimpleMailMessage mailMessage=new SimpleMailMessage();
mailMessage.setFrom(from);
mailMessage.setTo(to);
mailMessage.setCc(cc);
mailMessage.setSubject(subject);
mailMessage.setText(content);
javaMailSender.send(mailMessage);
}
}
代码解释:
- JavaMailSender是SpringBoot在MailSenderPropertiesConfiguration类中 配置好的,该类在 Mail自动配置类MailSenderAutoConfiguration中导入,因此这里注入JavaMailSender就可以使用了。
- 简单邮件可以直接构建一个SimpleMailMessage对象进行配置,配置完成后,通过JavaMailSender将邮件发出去。
配置完成后,在单元测试中写一个测试方法进行测试,代码如下:
package com.learn.qqemail;
import com.learn.qqemail.service.MailService;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
@RunWith(SpringRunner.class)
@SpringBootTest
class QqemailApplicationTests {
@Autowired
MailService mailService;
//发送简单邮件
@Test
public void sendSimpleMail(){
mailService.sendSimpleMail("xxx@qq.com",
"xxx@qq.com",
"xxx@qq.com",
"大型认亲现场",
"我是你爸爸!!!");
}
}
3、发送带附件的邮件
要发送带附件的邮件也非常容易,通过调用Attachment方法即可添加附件,该方法调用多次即可添加多个附件。
/**
* 发送带附件的邮件
* @param from 邮件发送者
* @param to 邮件收件者
* @param subject 邮件主题
* @param content 邮件内容
* @param file 附件
*/
public void sendAttachFileMail(String from, String to, String subject, String content, File file){
try {
MimeMessage mimeMessage=javaMailSender.createMimeMessage();
MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content);
helper.addAttachment(file.getName(),file);
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
}
}
这里使用MimeMessageHelper简化了邮件配置,他的构造方法的第二个参数true表示构造一个multipart message类型的邮件,multipart message类型的邮件包含多个正文、附件以及内嵌资源,邮件的表现形式更加丰富。最后通过addAttachment方法添加附件。
在单元测试中添加如下方法进行测试:
//发送带附件的邮件
@Test
public void sendAttachFileMail(){
mailService.sendAttachFileMail("xxx@qq.com",
"xxx@qq.com",
"大型认亲现场",
"我是你爸爸!!!",
new File("E:\\rengongzhineng\\29.py"));
}
4、发送带图片资源的邮件
有的邮件正文中可能要插入图片,使用FileSystemResource可以实现这一功能,代码如下:
/**
*发送带图片资源的邮件
* @param from 邮件发送者
* @param to 邮件收件者
* @param subject 邮件主题
* @param content 邮件内容
* @param srcPath 图片资源路径
* @param resIds 资源id
*/
public void sendMailWithImg(String from, String to, String subject, String content,String[] srcPath,String[] resIds){
if(srcPath.length!=resIds.length){
System.out.println("发送失败!");
return;
}
try {
MimeMessage mimeMessage=javaMailSender.createMimeMessage();
MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content);
for(int i=0;i<srcPath.length;i++){
FileSystemResource res=new FileSystemResource(new File(srcPath[1]));
helper.addInline(resIds[i],res);
}
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
}
}
再发送邮件时分别传入图片资源和资源id,通过FileSystemResource构造静态资源,然后调用addInLine方法将资源加入到邮件对象中。
接下来在测试类中添加如下方法进行测试:
//发送带图片资源的邮件
@Test
public void sendMailWithImg(){
mailService.sendMailWithImg("xxx@qq.com",
"xxx@qq.com",
"大型认亲现场",
"我是你爸爸!!!"+ "这是图片一:<div><img src='cid:p01'/></div>"+"这是图片二:<div><img src='cid:p02'/></div>",
new String[]{"E:\\schoollearnspace\\image\\1234567891.jpg",
"E:\\schoollearnspace\\image\\1234567891.jpg"},
new String[]{"p01","p02"});
}