springboot项目使用rabbitMQ发送邮件

首先想要实现springboot实现rabbitmq发送邮件,那肯定需要准备环境:

1、搭好springboot框架

2、本章内容rabbitmq是win安装的,也可以在Linux系统

3、使用一个没有用的qq,开启smtp服务,将授权码保存,下文需要用到

 

先下载rabbitmq的win版:

Installing on Windows — RabbitMQ

 安装步骤这里就不说了,直接来代码吧!

配置文件:

rabbitmq端口一定需要看好,与访问页面端口不一样

server.port=8888
server.address=localhost

#RabbitMQ
spring.rabbitmq.port=5672
spring.rabbitmq.host=localhost
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.publisher-confirm-type=correlated
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.virtual-host=TestHost

mybatis.mapper-locations=classpath:com/atxinxin/mapper/*.xml  #mybatis??

logging.file.name=log.log
logging.pattern.level=debug

 需要用到的依赖:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-parent</artifactId>
        <version>2.2.7.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.32</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

 接下来就是交换机、队列、路由key:

/**
 * @author weixinxin 2023-07-14
 **/
public class RabbitMqConst {

    //发送邮件交换机
    public static final String EXCHANGE_MAIL = "exchange.mail";
    //发送邮件路由key
    public static final String ROUTING_MAIL = "routing.mail";
    //发送邮件队列
    public static final String QUEUE_MAIL  = "queue.mail";
}

 controller层:

这里的参数都是直接设置了,一般在系统里,发件人等等都是数据库中获取

这里其实就是入口

/**
 * @author weixinxin_ext 2023-07-14
 **/

@RestController
@RequestMapping("/rabbitMq")
public class RabbitMqController {

    @Autowired
    private RabbitMqService rabbitMqService;

    private String user = "xinxin@xxx.com";//发件人
    private String userTo = "xinxin@xxx.com";//收件人
    
    //邮件内容参数
    private String userName = "采购部部长";
    private String processName = "请假申请";
    //邮件标题参数
    private String subject = "请假申请";

    @GetMapping("/sentMail")
    public String sendMail(){
        HashMap<Object, Object> map = new HashMap<>();
        map.put("user",user);
        map.put("userTo",userTo);
        map.put("userName",userName);
        map.put("processName",processName);
        map.put("subject",subject);
        //转换map类型,要不然消费消息的时候,类型不一样,或者设置一个配置文件
        String json = JSON.toJSONString(map, true);
        rabbitMqService.sentMassageJson(RabbitMqConst.EXCHANGE_MAIL,RabbitMqConst.ROUTING_MAIL,json);
        return "消息发送成功";
    }

}

 service层,发送消息:

/**
 * @author weixinxin 2023-07-14
 **/
@Service
public class RabbitMqService {

    @Autowired
    private RabbitTemplate rabbitTemplate;


    public Boolean sentMassageJson(String exchange, String routingKey, String massage){
        rabbitTemplate.convertAndSend(exchange,routingKey,massage);
        return true;
    }

}

完成以上步骤可以实现发送消息:

http://localhost:15672
 

使用自己新建用登录---

此时发送成功是这样的,可以查看消息,点击队列名称进入:

 获取消息;可以查看你之前发送的消息

接下来就是监听器,并且消费消息啦!

/**
 * @author weixinxin_ext 2023-07-14
 **/
@Component
public class ConfirmReceiver {

    //邮件内容:设置邮件字体样式等等,这里可以当成模板,然后设置一些参数,就可以实现一个模板多个模块使用,参数是内容中 {{xxxx}}
    private String test = "<p style=\"font-family:微软雅黑;font-size:14px;background-color:#FFFFFF;\">\n" +
            "\t<span style=\"font-family:微软雅黑;font-size:14px;color:#333333;\">{{processName}}:</span><span style=\"font-size:12px;color:#333333;font-family:Verdana, sans-serif;\"></span> \n" +
            "</p>\n" +
            "<p style=\"font-family:微软雅黑;font-size:14px;background-color:#FFFFFF;\">\n" +
            "\t<span style=\"background-color:rgba(0, 0, 0, 0);\">&nbsp; &nbsp; 您好,{{userName}}已将{{processName}}业务审批通过。请您查收。</span> \n" +
            "</p>\n" +
            "<p style=\"font-family:微软雅黑;font-size:14px;background-color:#FFFFFF;\">\n" +
            "\t<br />\n" +
            "</p>\n" +
            "<p style=\"font-family:微软雅黑;font-size:14px;background-color:#FFFFFF;\">\n" +
            "\t<span style=\"font-family:&quot;font-size:14px;background-color:#FFFFFF;color:#999999;line-height:1;\">本邮件由系统自动发送</span>" +
            "<span style=\"font-family:&quot;font-size:14px;background-color:#FFFFFF;color:#999999;line-height:1;\">," +
            "</span><span style=\"font-family:&quot;font-size:14px;background-color:#FFFFFF;color:#999999;line-height:1;\">请勿直接回复!若对邮件上述内容有疑问请联系系统管理人员!</span> \n" +
            "</p>";
    //邮件标题以及参数
    private String subject2 = "{{subjectParam}}系统通知";


    /**
    *@Description 发送邮件,消费消息
    *@author weixinxin
    *@Date   11:55 2023/7/17
    **/
    @SneakyThrows
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = RabbitMqConst.QUEUE_MAIL, durable = "true", autoDelete = "false"),
            exchange = @Exchange(value = RabbitMqConst.EXCHANGE_MAIL),
            key = (RabbitMqConst.ROUTING_MAIL)
    ))
    public void confirmMail(String msg, Message message, Channel channel) {
        System.out.println("msg = " + msg);
        Map<String, String> map = JSON.parseObject(msg, Map.class);
        try {
            // 邮箱授权码
            String password = "xxxxxxxxxx";
            // SMTP服务器地址
            String smtpHost = "smtp.qq.com";
            // SSL加密的SMTP端口号
            int smtpPort = 465;
            System.out.println("user = " + map.get("user"));
            Properties properties = new Properties();
            properties.put("mail.smtp.host", smtpHost);
            properties.put("mail.smtp.port", smtpPort);
            properties.put("mail.smtp.auth", "true");
            properties.put("mail.smtp.ssl.enable", "true");

            //创建认证器对象和发送者邮箱和授权码
            Session session = Session.getInstance(properties, new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(map.get("user"), password);
                }
            });
            MimeMessage mimeMessage = new MimeMessage(session);
            //发件人
            mimeMessage.setFrom(new InternetAddress(map.get("user")));
            //收件人
            mimeMessage.setRecipients(MimeMessage.RecipientType.TO, InternetAddress.parse(map.get("userTo")));
            //标题,处理参数
            mimeMessage.setSubject(this.subject(subject2,map));
            //内容,处理参数
            mimeMessage.setText(this.content(test,map),"utf-8","html");
            // 发送邮件
            Transport.send(mimeMessage);
            System.out.println("邮件发送成功!");
            //手动确认
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (MessagingException e) {
            System.out.println("消息没有消费掉 = = = = = = = = ");
            //拒绝确认,返回队列
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
        }
    }

    /**
    *@Description 处理标题参数
    *@author weixinxin
    *@Date   11:54 2023/7/17
    **/
    private String subject(String subject2, Map<String, String> map) {
        subject2 = subject2.replace("{{" + "subjectParam" + "}}",map.get("subject"));
        return subject2;
    }

    /**
    *@Description 处理邮件内容参数
    *@author weixinxin
    *@Date   11:55 2023/7/17
    **/
    private String content(String test, Map<String, String> map) {
        Set<String> keys = map.keySet();
        for (String key : keys) {
            test = test.replace("{{" + key + "}}", map.get(key));
        }
        return test;
    }

}

 效果:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 Spring Boot 中,你可以通过 RabbitMQ 的 `x-delayed-message` 插件来实现延时队列,而不需要使用额外的插件或库。下面是实现步骤: 1. 添加依赖 在 `pom.xml` 文件中添加 RabbitMQ 的依赖: ```xml <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>2.3.12.RELEASE</version> </dependency> ``` 2. 配置 RabbitMQ 的 `x-delayed-message` 插件 在 RabbitMQ 中,你需要先安装 `x-delayed-message` 插件。你可以通过 `rabbitmq-plugins` 命令来安装插件: ``` rabbitmq-plugins enable rabbitmq_delayed_message_exchange ``` 或者,你可以在 `rabbitmq.conf` 文件中添加以下配置,然后重启 RabbitMQ: ``` plugins.rabbitmq_delayed_message_exchange = {git, "https://github.com/rabbitmq/rabbitmq-delayed-message-exchange", {branch, "master"}} ``` 3. 配置 RabbitMQ 的连接信息 在 `application.properties` 中添加 RabbitMQ 的连接信息: ```properties spring.rabbitmq.host=your-rabbitmq-host spring.rabbitmq.port=5672 spring.rabbitmq.username=your-rabbitmq-username spring.rabbitmq.password=your-rabbitmq-password ``` 4. 定义队列和交换器 在 Spring Boot 中,你可以使用 `@Configuration` 和 `@Bean` 注解来定义队列和交换器。下面是一个例子: ```java @Configuration public class RabbitConfig { @Bean public Queue delayedQueue() { return QueueBuilder.durable("delayed.queue") .withArgument("x-dead-letter-exchange", "normal.exchange") .withArgument("x-dead-letter-routing-key", "normal.routingkey") .build(); } @Bean public CustomExchange delayedExchange() { Map<String, Object> args = new HashMap<>(); args.put("x-delayed-type", "direct"); return new CustomExchange("delayed.exchange", "x-delayed-message", true, false, args); } @Bean public Binding binding() { return BindingBuilder.bind(delayedQueue()) .to(delayedExchange()) .with("delayed.routingkey") .noargs(); } } ``` 在上面的例子中,我们定义了一个 `delayedQueue` 队列,它的死信交换器是 `normal.exchange`,死信路由键是 `normal.routingkey`。我们还定义了一个 `delayedExchange` 交换器,它的类型是 `x-delayed-message`,并将 `x-delayed-type` 属性设置为 `direct`。最后,我们将 `delayedQueue` 队列绑定到 `delayedExchange` 交换器上,并使用路由键 `delayed.routingkey`。 5. 发送延时消息 你可以使用 `RabbitTemplate` 类来发送消息到 `delayedQueue` 队列。在发送消息时,你需要将消息的 `headers` 属性设置为 `x-delay`,并将值设置为消息的延时时间(单位为毫秒)。 ```java @Autowired private RabbitTemplate ### 回答2: 在Spring Boot中实现RabbitMQ延时队列需要以下几个步骤: 1. 首先,我们需要定义一个交换机(Exchange),用于将消息发送到延时队列中。可以使用DirectExchange、TopicExchange或FanoutExchange等不同类型的交换机。交换机的类型根据具体的业务需求而定。 2. 接下来,我们需要定义两个队列,一个为延时队列,另一个为业务队列。延时队列用于接收需要延时处理的消息,业务队列用于接收延时队列中处理完成的消息。 3. 创建并配置消息发送和接收的相关组件。使用RabbitTemplate来发送消息到延时队列,创建一个消费者来接收延时队列中的消息并处理。 4. 在消息发送时,可以通过给消息设置不同的过期时间来实现延时功能。在发送消息时,将消息携带的延时时间设置为过期时间,然后发送到延时队列中。 5. 在消费者中,监听业务队列,当接收到延时队列中的消息时,进行相应的处理,例如发送邮件、生成报表等。 这样就实现了RabbitMQ延时队列的功能。通过设置消息的过期时间,可以控制消息何时被消费。延时队列可以在某个特定的时间点将消息转发到业务队列,完成后续处理。Spring Boot提供了简单而强大的集成,可以轻松实现延时队列的功能。 ### 回答3: 实现RabbitMQ延时队列的核心思想是利用RabbitMQ的插件(x-delayed-message)和Spring Boot的消息中间件(RabbitTemplate)结合使用。 首先,确保在RabbitMQ服务中安装了插件。在RabbitMQ的安装目录下,执行以下命令: ``` rabbitmq-plugins enable rabbitmq_delayed_message_exchange ``` 接下来,在Spring Boot项目的pom.xml文件中添加RabbitMQ的依赖: ```xml <dependencies> <!-- RabbitMQ --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> </dependencies> ``` 然后,创建一个配置类,用于连接RabbitMQ服务和创建延时队列: ```java @Configuration public class RabbitMQConfig { @Autowired private Environment env; @Bean public ConnectionFactory connectionFactory() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); connectionFactory.setAddresses(env.getProperty("spring.rabbitmq.addresses")); connectionFactory.setUsername(env.getProperty("spring.rabbitmq.username")); connectionFactory.setPassword(env.getProperty("spring.rabbitmq.password")); return connectionFactory; } @Bean public RabbitTemplate rabbitTemplate() { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory()); rabbitTemplate.setMessageConverter(jsonMessageConverter()); return rabbitTemplate; } @Bean public MessageConverter jsonMessageConverter() { return new Jackson2JsonMessageConverter(); } @Bean public Exchange delayedExchange() { Map<String, Object> args = new HashMap<>(); args.put("x-delayed-type", "direct"); return new CustomExchange("delayed-exchange", "x-delayed-message", true, false, args); } @Bean public Queue delayedQueue() { return new Queue("delayed-queue", true); } @Bean public Binding delayedBinding() { return BindingBuilder.bind(delayedQueue()).to(delayedExchange()).with("delayed-routing-key").noargs(); } } ``` 在上述代码中,我们创建了一个自定义的Exchange,将其类型设置为"x-delayed-message",并创建了一个延时队列,将其绑定在这个Exchange上。这样,消息发送到这个Exchange时,会根据消息中的延时时间属性进行延时处理。 最后,我们可以通过RabbitTemplate发送延时消息: ```java @Service public class RabbitMQService { @Autowired private RabbitTemplate rabbitTemplate; public void sendDelayedMessage(String message, int delayTime) { rabbitTemplate.convertAndSend("delayed-exchange", "delayed-routing-key", message, new MessagePostProcessor() { @Override public Message postProcessMessage(Message message) throws AmqpException { message.getMessageProperties().setHeader("x-delay", delayTime); return message; } }); } } ``` 在上述代码中,我们通过rabbitTemplate将消息发送到名为"delayed-exchange"的Exchange上,并设置消息的延时时间属性"x-delay"。最后,通过"convertAndSend"方法发送消息。 以上就是使用Spring Boot实现RabbitMQ延时队列的简单示例。通过这种方式,我们可以轻松地实现消息的延时处理,使得系统更加灵活和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值