实现邮件发送
1.找一个账号发送邮件(自行百度)
2.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
3.配置参数
spring:
mail:
host: smtp.qq.com
protocol: smtp
default-encoding: UTF-8
password: igkfxlwelvmkcbbi
username: 374267762@qq.com
port: 587
properties:
mail:
stmp:
socketFactory:
class: javax.net.ssl.SSLSocketFactory
debug: true
4.开始写发送信息
注入以下两个对象
@Autowired
JavaMailSender javaMailSender;//spring自带的mail发送器
@Autowired
MailProperties mailProperties;//邮件发送信息
构建邮件模板
public RespBean sendMail(String username ,String email){
//收到消息,发送邮件
Hr to = (Hr) hrService.loadUserByUsername1(username);
MimeMessage msg = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(msg);
try {
helper.setTo(email);//收件方
helper.setFrom(mailProperties.getUsername());//发件方
helper.setSubject("测试邮件");//主题
helper.setSentDate(new Date());//时间
String mail = "beibei(可爱):欢迎加入我们!";
helper.setText(mail, false);//设置内容
javaMailSender.send(msg);//发送邮件
logger.info(to.getName() + ":邮件发送成功");
return RespBean.ok("发送成功!");
} catch (MessagingException e) {
e.printStackTrace();
logger.error("邮件发送失败:" + e.getMessage());
return RespBean.ok("发送失败!");
} catch (ParseException e) {
e.printStackTrace();
} catch (MalformedTemplateNameException e) {
e.printStackTrace();
} catch (TemplateNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return RespBean.error("未知异常!");
}
测试(注意,测试路径药有权限访问)
@RequestMapping("/send/mail")
@ResponseBody
public RespBean sal( Principal principal){
return mailSenderService.sendMail(principal.getName(), "lianabei@163.com");
}
结果
到此为止,发送没问题了,但是感觉内容有点low,因此,整合freemark,发送模板文件。
整合freemark
1.依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2.freemark 配置
spring:
freemarker:
charset: UTF-8
cache: false
content-type: text/html
expose-request-attributes: true
expose-session-attributes: true
request-context-attribute: request
suffix: .flt
3.注入配置信息对象
MailProperties mailProperties;//邮件发送信息
@Autowired
FreeMarkerConfigurer freeMarkerConfigurer;
4.在template文件夹当中创建mail.ftl
freemark当中的语法结构自行百度。
<html lang="zh-CN">
<head>
<meta charset="UTF-8"/>
<title>title</title>
<style>
table {
width: 50%;
font-size: .938em;
border-collapse: collapse;/*边框合并*/
}
th {
text-align: left;
padding: .5em .5em;
font-weight: bold;
background: #66677c;color: #fff;
}
td {
padding: .5em .5em;
border-bottom: solid 1px #ccc;
}
table,table tr th, table tr td { border:1px solid #0094ff; }/*设置边框*/
</style>
</head>
<body>
<table>
<tr>
<th>Id</th>
<th>Name</th>
<th>Username</th>
<th>Phone</th>
</tr>
<tr>
<td>${id}</td>
<td>${name}</td>
<td>${username}</td>
<td>${phone}</td>
</tr>
</table>
</body>
</html>
5.修改发送信息
public RespBean sendMail(String username ,String email){
//收到消息,发送邮件
Hr to = (Hr) hrService.loadUserByUsername1(username);
MimeMessage msg = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(msg);
try {
helper.setTo(email);//收件方
helper.setFrom(mailProperties.getUsername());//发件方
helper.setSubject("测试邮件");//主题
helper.setSentDate(new Date());//时间
//整合freemarker,根据模板生成html文件进行发送
Template template = freeMarkerConfigurer.getConfiguration().getTemplate("mail.ftl");
String mail = FreeMarkerTemplateUtils.processTemplateIntoString(template, to);
helper.setText(mail, true);//设置内容
javaMailSender.send(msg);//发送邮件
logger.info(to.getName() + ":邮件发送成功");
return RespBean.ok("发送成功!");
} catch (MessagingException e) {
e.printStackTrace();
logger.error("邮件发送失败:" + e.getMessage());
return RespBean.ok("发送失败!");
} catch (ParseException e) {
e.printStackTrace();
} catch (MalformedTemplateNameException e) {
e.printStackTrace();
} catch (TemplateNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return RespBean.error("未知异常!");
}
主要变化为
创建模板
Template template = freeMarkerConfigurer.getConfiguration().getTemplate(“mail.ftl”);
制作模板(配置文件当中配置为text/html)
String mail = FreeMarkerTemplateUtils.processTemplateIntoString(template, to);
//填充进去
helper.setText(mail, true);//设置内容
启动,测试成功,这里仅仅只是用来测试,和vhr基本相同,不完全一样。
整合rabbitmq 通过消息队列发送邮件。
1.依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
2.配置文件
监听端
spring:
rabbitmq:
username: guest
password: guest
host: 127.0.0.1
port: 5672
publisher-confirms: true
publisher-returns: true
listener:
simple:
acknowledge-mode: manual
prefetch: 100
配置消息队列对象
@SpringBootApplication
public class MqlistenerApplication {
public static void main(String[] args) {
SpringApplication.run(MqlistenerApplication.class, args);
}
@Bean
Queue queue() {
return new Queue(ConstantParam.MAIL_QUEUE_NAME);
}
}
3.接受方法
@Component
public class mqListener {
@Autowired
JavaMailSender javaMailSender;//spring自带的mail发送器
@Autowired
MailProperties mailProperties;//邮件发送信息
@Autowired
FreeMarkerConfigurer freeMarkerConfigurer;
public static final Logger logger = LoggerFactory.getLogger(mqListener.class);
@RabbitListener(queues = ConstantParam.MAIL_QUEUE_NAME)
public void setJavaMailSender(Message message, Channel channel){
System.out.println("get");
Hr to = (Hr) message.getPayload();
MimeMessage msg = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(msg);
try {
helper.setTo("374267762@qq.com");//收件方
helper.setFrom(mailProperties.getUsername());//发件方
helper.setSubject("测试邮件");//主题
helper.setSentDate(new Date());//时间
//整合freemarker,根据模板生成html文件进行发送
Template template = freeMarkerConfigurer.getConfiguration().getTemplate("mail.ftl");
String mail = FreeMarkerTemplateUtils.processTemplateIntoString(template, to);
helper.setText(mail, true);//设置内容
javaMailSender.send(msg);//发送邮件
logger.info(to.getName() + ":邮件发送成功");
} catch (MessagingException e) {
e.printStackTrace();
logger.error("邮件发送失败:" + e.getMessage());
} catch (MalformedTemplateNameException e) {
e.printStackTrace();
} catch (TemplateNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
}
发送端配置
spring:
rabbitmq:
username: guest
password: guest
host: 127.0.0.1
port: 5672
publisher-confirms: true
publisher-returns: true
2. 类配置信息
@Configuration
public class RabitmqConfig {
public final static Logger logger = LoggerFactory.getLogger(RabitmqConfig.class);
@Autowired
CachingConnectionFactory cachingConnectionFactory;
/**
* 使用的路由模式,Routing
* 需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,
* 当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列
* @return
*/
@Bean
RabbitTemplate rabbitTemplate() {
/**
* 在配置文件当中开启对应的功能。
* publisher-confirms: true
* publisher-returns: true
*/
RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);
rabbitTemplate.setConfirmCallback((data, ack, cause) -> {//保存了消息的ID ack 是否收到
});
//如果根本没有投递出去,会执行这里
rabbitTemplate.setReturnCallback((msg, repCode, repText, exchange, routingkey) -> {
logger.info("消息发送失败");
});
return rabbitTemplate;
}
//声明队列
@Bean
Queue mailQueue() {
return new Queue(ConstantParam.MAIL_QUEUE_NAME, true);
}
//声明交换机 持久化
@Bean
DirectExchange mailExchange() {
return new DirectExchange(ConstantParam.MAIL_EXCHANGE_NAME, true, false);
}
//交换机与队列进行绑定,并且声明routing key
@Bean
Binding mailBinding() {
return BindingBuilder.bind(mailQueue()).to(mailExchange()).with(ConstantParam.MAIL_ROUTING_KEY_NAME);
}
}
4.使用模板发送给队列
@Component
public class MailSenderService {
public static final Logger logger = LoggerFactory.getLogger(MailSenderService.class);
@Autowired
HrService hrService;
@Autowired
RabbitTemplate rabbitTemplate;
public void sendMail(String username ,String email){
//收到消息,发送邮件
System.out.println("send");
Hr to = (Hr) hrService.loadUserByUsername1(username);
String id = UUID.randomUUID().toString()+to.getId();
rabbitTemplate.convertAndSend(ConstantParam.MAIL_EXCHANGE_NAME,ConstantParam.MAIL_ROUTING_KEY_NAME,to , new CorrelationData(id));
}
}
测试结果: