一、依赖引入
1、maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、gradle
compile("org.springframework.boot:spring-boot-starter-mail")
二、spring boot配置文件(这里用的是yml方式,层级更加明确)
spring:
mail:
host: smtp.126.com #主机地址,这里已126邮箱为例(网易企业邮箱:smtp.ym.163.com)
username: *** #发件人邮箱地址
password: *** #这里不是邮箱登录密码,而是授权码,可以登录邮箱在设置里面获取授权码(企业邮箱可能是邮箱密码)
properties:
mail.smtp.socketFactory.fallback : true
mail.smtp.starttls.enable: true
mail.smtp.starttls.required: true
三、工具类编写
第一种写法:
@Component
public class MailUtil {
@Autowired
private JavaMailSender mailSender;
//获取yml配置文件的配置信息
@Value("${spring.mail.username}")
private String sender;
/**
* 发送邮件(不带附件)
* @param target 收件人邮箱地址
* @param subject 邮件主题
* @param toDoer 邮件正文标题
* @param contexts 邮件内容
*/
public void sendOneEmail(String target, String subject, String toDoer, String[] contexts) {
SimpleMailMessage message = new SimpleMailMessage();
//发件人
message.setFrom(sender);
//收件人
message.setTo(target);
//设置邮件主题
message.setSubject(subject);
//设置邮件内容
StringBuilder sb = new StringBuilder();
if (!StringUtils.isEmpty(toDoer)) {
sb.append(toDoer);
}
if (contexts != null && contexts.length >0) {
for (String context : contexts) {
if (!StringUtils.isEmpty(context)) {
//换行
sb.append(System.getProperty("line.separator"))
.append(context);
}
}
}
message.setText(sb.toString());
//发送邮件
mailSender.send(message);
}
/**
* 发送邮件(带附件)
* @param target 收件人邮箱地址
* @param subject 邮件主题
* @param toDoer 邮件正文标题
* @param contexts 邮件内容
* @param fileArray 附件路径数组
*/
public void sendFileEmail(String target, String subject, String toDoer, String[] contexts, String[] fileArray) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message,true);
//发件人
helper.setFrom(sender);
//收件人
helper.setTo(target);
//设置邮件主题
helper.setSubject(subject);
//设置邮件内容
StringBuilder sb = new StringBuilder();
if (!StringUtils.isEmpty(toDoer)) {
sb.append(toDoer);
}
if (contexts != null && contexts.length >0) {
for (String context : contexts) {
if (!StringUtils.isEmpty(context)) {
//换行
sb.append(System.getProperty("line.separator"))
.append(context);
}
}
}
helper.setText(sb.toString());
//邮件附件
//验证文件数据是否为空
if(null != fileArray){
FileSystemResource file=null;
for (int i = 0; i < fileArray.length; i++) {
//添加附件
file=new FileSystemResource(fileArray[i]);
helper.addAttachment(fileArray[i].substring(fileArray[i].lastIndexOf(File.separator)), file);
}
}
//发送邮件
mailSender.send(message);
}catch (Exception e){
e.printStackTrace();
}
}
}
注意:
1、工具类也是需要交给spring管理。需要在工具类上加上@Component注解。
2、JavaMailSender 变量加上@Autowired,将它注入进来,不可以使用static修饰,如果想写静态工具类方法,尝试以下第二种写法。
3、在Application.java启动类上面加上@ServletComponentScan(basePackages = {"com.demo"})注解,该工具类要在改扫描包下面。
第二种写法:
@Component
public class MailUtil {
@Autowired
private JavaMailSender mailSender;
public static MailUtil mailUtil;
@Value("${spring.mail.username}")
private String sender;
@PostConstruct
public void init() {
mailUtil = this;
mailUtil.mailSender = this.mailSender;
mailUtil.sender = this.sender;
}
/**
* 发送邮件(不带附件)
* @param target 收件人邮箱地址
* @param subject 邮件主题
* @param toDoer 邮件正文标题
* @param contexts 邮件内容
*/
public static void sendOneEmail(String target, String subject, String toDoer, String[] contexts) {
SimpleMailMessage message = new SimpleMailMessage();
//发件人
message.setFrom(mailUtil.sender);
//收件人
message.setTo(target);
//设置邮件主题
message.setSubject(subject);
//设置邮件内容
StringBuilder sb = new StringBuilder();
if (!StringUtils.isEmpty(toDoer)) {
sb.append(toDoer);
}
if (contexts != null && contexts.length >0) {
for (String context : contexts) {
if (!StringUtils.isEmpty(context)) {
//换行
sb.append(System.getProperty("line.separator"))
.append(context);
}
}
}
message.setText(sb.toString());
//发送邮件
mailUtil.mailSender.send(message);
}
/**
* 发送邮件(带附件)
* @param target 收件人邮箱地址
* @param subject 邮件主题
* @param toDoer 邮件正文标题
* @param contexts 邮件内容
* @param fileArray 附件路径数组
*/
public static void sendFileEmail(String target, String subject, String toDoer, String[] contexts, String[] fileArray) {
MimeMessage message = mailUtil.mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message,true);
//发件人
helper.setFrom(mailUtil.sender);
//收件人
helper.setTo(target);
//设置邮件主题
helper.setSubject(subject);
//设置邮件内容
StringBuilder sb = new StringBuilder();
if (!StringUtils.isEmpty(toDoer)) {
sb.append(toDoer);
}
if (contexts != null && contexts.length >0) {
for (String context : contexts) {
if (!StringUtils.isEmpty(context)) {
//换行
sb.append(System.getProperty("line.separator"))
.append(context);
}
}
}
helper.setText(sb.toString());
//邮件附件
//验证文件数据是否为空
if(null != fileArray){
FileSystemResource file=null;
for (int i = 0; i < fileArray.length; i++) {
//添加附件
file=new FileSystemResource(fileArray[i]);
helper.addAttachment(fileArray[i].substring(fileArray[i].lastIndexOf(File.separator)), file);
}
}
//发送邮件
mailUtil.mailSender.send(message);
}catch (Exception e){
e.printStackTrace();
}
}
四、工具类调用实现发送邮件
1、第一种工具类调用方式:
由于方法不是静态的,但是也不能直接用new对象调用,这样不会被spring容器创建bean,会报空指针异常。所以需要在调用的类上将该工具类注入进来
@Resource
private MailUtil mailUtil;
调用
//邮件内容
String[] strs = new String[]{"云想衣裳花想容","春风拂槛露华浓"};
//附件地址数组
String [] fileArray={"F:\\360MoveData\\Users\\admin\\Desktop\\mailView.txt","F:\\360MoveData\\Users\\admin\\Desktop\\a.jpg"};
//发送不带附件的
mailUtil.sendOneEmail("收件人邮箱", "主题:测试邮件", "To: asd", strs);
//发送带附件的
mailUtil.sendFileEmail("收件人邮箱", "主题:测试邮件", "To: asd", strs, fileArray);
2、第二种工具类调用方式:
这种方式由于其中的方法是静态的,直接可以类名.方法调用实现
//邮件内容
String[] strs = new String[]{"云想衣裳花想容","春风拂槛露华浓"};
//附件地址数组
String [] fileArray={"F:\\360MoveData\\Users\\admin\\Desktop\\mailView.txt","F:\\360MoveData\\Users\\admin\\Desktop\\a.jpg"};
//发送不带附件的
MailUtil.sendOneEmail("收件人邮箱", "主题:测试邮件", "To: asd", strs);
//发送带附件的
MailUtil.sendFileEmail("收件人邮箱", "主题:测试邮件", "To: asd", strs, fileArray);
五、测试效果
1、不带附件
2、带附件