vhr 使用freemark模板邮件发送 ,rabbitmq使用

该博客介绍了如何结合Freemarker模板和RabbitMQ实现邮件发送。首先,通过引入依赖、配置参数和编写发送信息来实现基本的邮件发送。接着,整合Freemarker创建邮件模板,并在template文件夹中创建mail.ftl,通过Freemarker的语法结构构造邮件内容。最后,整合RabbitMQ,配置消息队列对象,设置发送端和接收端,将模板邮件通过消息队列发送出去,测试成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现邮件发送

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));

    }
}

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值