A production JMS server must be a stand alone server. What we have here is for demonstration purposes.
Add dependency
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
Add configuration class
@Configuration
@EnableJms
public class JmsConfig {
    @Bean
    public JmsListenerContainerFactory<?> jmsFactory(ConnectionFactory connectionFactory,DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        return factory;
    }
    
    @Bean // Serialize message content to json using TextMessage
    public MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    }
}
Add a Sender
@Slf4j
@Component
public class Sender {
    @Autowired
    private JmsTemplate jmsTemplate;
    @Value("${queue.sender-receiver}")
    private String      queue;
    public void sendMail(Mail mail) {
        try {
            jmsTemplate.convertAndSend(queue, mail);
            log.info("Mail sent to queue, {}, at {}", queue, LocalDateTime.now());
        } catch (Exception e) {
            log.error("Mail not sent");
            log.error("Exception, msg: {}", e.getMessage());
        }
    }
}
Add a Receiver
@Slf4j
@Component
public class Receiver {
    @JmsListener(destination = "${queue.sender-receiver}", containerFactory = "jmsFactory")
    public void receiveMessage(Mail mail) {
        log.info("Received mail {}", LocalDateTime.now());
        try {
            log.info("mail={}", ObjectUtils.toJson(mail));
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
    }
}
Source code on Github