Mail - 基于Springboot

Springboot整合邮件服务

springboot版本 - 2.4.0

引入相关依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
	<groupId>javax.mail</groupId>
	<artifactId>javax.mail-api</artifactId>
</dependency>

配置邮件相关参数

spring:
   mail:
    host: smtp.qq.com
    username: xxxx@qq.com # 邮箱账号
    password: nbproigvuoyybbdd # 邮箱账号授权码: 设置-账户-生成授权码

password不是邮箱真正的登陆密码,而是该邮箱的授权码。

 

代码

package com.example.demo.dto;

import java.io.File;
import java.util.Map;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Mail {

	private String to;
	
	private String text;
	
	private String subject;
	
	private boolean attached;
	
	private Map<String, File> attachments;
	
}
package com.example.demo.service;

import com.example.demo.dto.Mail;
import com.example.demo.exception.MyException;

public interface MailService {

	void sendMail(Mail mail) throws MyException;
}
package com.example.demo.service.impl;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import com.example.demo.constant.MyExceptionMessage;
import com.example.demo.dto.Mail;
import com.example.demo.exception.MyException;
import com.example.demo.service.MailService;

@Service
public class MailServiceImpl implements MailService {
	
	@Autowired
	private JavaMailSender javaMailSender;
	
	private static final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);
	
	@Override
	@Async // 标记这是一个异步任务。
	/**
	 * controller调用service后立即返回,不会等service的代码执行结束后才返回,
	 * @Async 注解可用来标记一个耗时操作为异步任务
	 */
	public void sendMail(Mail mail) throws MyException{
		if (mail.isAttached()) {
			sendMimeMailMessage(mail);
		} else {
			sendSimpleMailMessage(mail);
		}
	}
	
	
	private void sendSimpleMailMessage(Mail mail) {
		SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
		simpleMailMessage.setFrom("from@qq.com"); // 发送者的邮箱
		simpleMailMessage.setTo(mail.getTo());
		simpleMailMessage.setSubject(mail.getSubject());
		simpleMailMessage.setText(mail.getText());
		javaMailSender.send(simpleMailMessage);
		logger.info("send simple mail message successfully.");
	}

	private void sendMimeMailMessage(Mail mail) throws MyException {
		
		// 手动添加附件内容
		Map<String, File> attachments = new HashMap<>();
		attachments.put("a.txt", new File("D:\\test\\a.txt"));
		attachments.put("b.txt", new File("D:\\test\\b.txt"));
		mail.setAttachments(attachments);
		
		MimeMessage mimeMessage = javaMailSender.createMimeMessage();
		
		try {
			MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
			mimeMessageHelper.setFrom(customConfig.getFrom());
			mimeMessageHelper.setTo(mail.getTo());
			mimeMessageHelper.setSubject(mail.getSubject());
			mimeMessageHelper.setText(mail.getText());
			Set<Entry<String, File>> entrySet = mail.getAttachments().entrySet();
			for (Entry<String, File> each : entrySet) {
				mimeMessageHelper.addAttachment(each.getKey(), each.getValue());
			}
			javaMailSender.send(mimeMessage);
			logger.info("send mime mail message successfully.");
		} catch (MessagingException e) {
			
			e.printStackTrace();
			logger.info(e.getMessage());
			throw new MyException(MyExceptionMessage.MailException);
		}
	}

}
package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.constant.ResponseMessage;
import com.example.demo.dto.Mail;
import com.example.demo.dto.ResponseObject;
import com.example.demo.exception.MyException;
import com.example.demo.service.MailService;

@RestController
@RequestMapping("/mail")
public class MailController {
	
	@Autowired
	private MailService mailService;
	
	@PostMapping
	public ResponseEntity<ResponseObject> sendMail(@RequestBody Mail mail) {
		
		try {
			mailService.sendMail(mail);
			return ResponseEntity.ok(new ResponseObject(ResponseMessage.SUCCESS));
		} catch (MyException e) {
			return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
		}
	} 
}
package com.example.demo.constant;

public enum ResponseMessage {
	
	SUCCESS("SUCCESS"), FAILED("FAILED"), EMPTY("No Record found");
	
	private String message;
	
	ResponseMessage(String message) {
		this.message = message;
	}

	public String getMessage() {
		return message;
	}
	
	@Override
	public String toString() {
		return message;
	}
	
	
	
}
package com.example.demo.dto;

import com.example.demo.constant.ResponseMessage;

import lombok.Data;

@Data
public class ResponseObject {
	
	private Object data;
	
	private String message;

	public ResponseObject(Object data, ResponseMessage responseMessage) {
		this.data = data;
		this.message = responseMessage.getMessage();
	}

	public ResponseObject(ResponseMessage responseMessage) {
		this.message = responseMessage.getMessage();
	}

}

运行项目,使用postman访问http://localhost:9090/dev/mail

访问API后会立即返回,而不会等到邮件发送后才返回。

邮件发送成功

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值