Хотите отправлять электронную почту из приложений java асинхронно

В моем проекте мне нужно отправить письма для активации аккаунта после регистрации. Также нужно отправить другие письма также на некоторых мероприятиях. Может ли кто-нибудь помочь мне добиться этого асинхронно. Мне нужно использовать @Async на методе, который отправляет электронные письма в приложении или мне нужно создать некоторый компонент JMS, который получает сообщение jms от компонента приложения и отправляет электронные письма. Пожалуйста предложите мне как разрешить это.

С уважением,

1 ответ

  1. Напишите класс сервиса для отправителя электронной почты и добавьте аннотацию @Async на почту, которая запускает электронную почту.

    Предположим, ваш компонент запускает сообщение электронной почты

    @Controller
    public class OrderController {
    
    @Autowired
    private MailSenderUtilityService mailSenderUtilityService;
    
           @RequestMapping("/setShippingAddress")
           private String sendAnEmail(Model model, Order order, User user){
                ..... Your code goes here .....
    
           mailSenderUtilityService.sendYourEmail(Order order, User user, Locale english);
    
             return "emailSent";
            }
        }
    
    
    
    
    
    @Service
    public class MailSenderUtilityService {
    
    
            @Autowired
            private JavaMailSender mailSender;
    
            @Autowired
            private MailConstructor mailContructor;
    
            @Async
            public void sendOrderSubmittedEmail(Order order, User user, Locale english) {
    
                CompletableFuture<MimeMessagePreparator> email = mailContructor.constructSimpleOrderPlacedEmail(order, user, Locale.ENGLISH);       
                try {
                    System.out.println("********************* SLEEPING NOW FOR TESTING PURPOSE **********************");
                    Thread.sleep(60000);
                    mailSender.send(email.get());
                } catch (MailException | InterruptedException | ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }       
            }
    }
    
    @Component
    public class MailConstructor {
    
        @Autowired
        private Environment env;
    
        @Autowired
        private TemplateEngine templateEngine;
    
        @Async
        public CompletableFuture<MimeMessagePreparator> constructSimpleOrderPlacedEmail(Order order, User user, Locale locale) {
    
            Context context = new Context();
            context.setVariable("order", order);
            context.setVariable("user", user);
            context.setVariable("cartItemList", order.getCartItemList());
            String text = templateEngine.process("orderConfirmationEmailTemplate", context);
    
            MimeMessagePreparator messagePreparator = new MimeMessagePreparator() {
    
                @Override
                public void prepare(MimeMessage mimeMessage) throws Exception {
                    MimeMessageHelper email = new MimeMessageHelper(mimeMessage);
                    email.setTo(user.getEmail());
                    email.setFrom(new InternetAddress("abhibookstore123@gmail.com"));
                    email.setSubject("Order Confirmation - "+ order.getId());
                    email.setText(text, true);              
                }
            };
    
            return CompletableFuture.completedFuture(messagePreparator);
        }
    

    Это вызовет вашу электронную почту асинхронно. Он не будет ждать 60 секунд, чтобы ответить, пока электронная почта не будет отправлена.

    Выполнение кода в контроллере будет двигаться вперед, и электронная почта будет запущена через 60 секунд.

    Здесь вы можете найти полный пример-здесь