zoukankan      html  css  js  c++  java
  • spring boot + activeMq 邮件服务

    引入依赖:

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

    配置文件:

    spring:
      activemq:
        broker-url: tcp://127.0.0.1:61616
        in-memory: true
        pool:
          enabled: false
      mail:
        host: smtp.163.com
        username: 你的邮箱
        password: 你的密码
        properties:
          mail:
            smtp: true
            starttls:
              enable: true
              required: true
      freemarker:
        allow-request-override: false
        cache: true
        check-template-location: true
        charset: UTF-8
        content-type: text/html
        expose-request-attributes: false
        expose-session-attributes: false
        expose-spring-macro-helpers: false
    
    mail:
      fromMail:
        addr: dandingdedanding@163.com

    邮件服务:

    public interface MailService {
    
        boolean sendEmail(String to, String subject, String content);
    
        boolean sendEmailByTemplate(String to, String subject, String templateFile, Map<String, String> content);
    
    }
    @Service
    public class MailServiceImpl implements MailService {
    
        @Autowired
        private JavaMailSender mailSender;
    
        @Value("${mail.fromMail.addr}")
        private String from; // 邮件发送者
    
        @Override
        public boolean sendEmail(String to, String subject, String content) {
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message);
            try {
                helper.setFrom(from); // 邮件发送者
                helper.setTo(to); // 邮件接收者
                helper.setSubject(subject); // 邮件主题
                helper.setText(content, true); // 邮件正文,是否支持html格式
                mailSender.send(message); // 发送邮件
            } catch (MessagingException e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
    
        @Override
        public boolean sendEmailByTemplate(String to, String subject, String templateFile, Map<String, String> content) {
            Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
            cfg.setClassForTemplateLoading(this.getClass(), "/templates");
            try {
                Template template = cfg.getTemplate(templateFile);
                String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, content);
                return this.sendEmail(to, subject, html);
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
    }

    模板文件:

    <html>
     <body>
       <h3>你好,这是绿茵狙击手的测试邮件,我是${name}</h3>
     </body>
    </html>

    spring boot启动类:

    @SpringBootApplication
    @EnableJms
    public class Application {
    
        @Bean("emailQueue")
        public Queue emailQueue() {
            return new ActiveMQQueue("email.queue");
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }

    email rest 接口:

    /**
     * 邮件服务暴露给外部的rest接口
     */
    @RestController
    @RequestMapping("/mail")
    public class MailRestController {
    
        @Autowired
        private MailProducer mailProducer;
    
        /**
         * 发送简单邮件消息缓存在activeMq队列中
         */
        @PostMapping("/send")
        public String send(@RequestParam String to,
                           @RequestParam String subject,
                           @RequestParam String content) {
            Map<String, String> map = new HashMap<>();
            map.put("to", to);
            map.put("subject", subject);
            map.put("content", content);
            String msg = JSONObject.toJSONString(map);
    
            mailProducer.send(msg);
            return "success";
        }
    
    }

    通过请求 /test/send 接口,通过调用邮件消息生产者,将想要发送的邮件信息缓存在activeMq的email.queue队列中,

    由邮件消息消费者调用邮件服务类发送邮件

    邮件消息生产者:

    /**
     * 邮件消息生产者
     */
    @Component
    public class MailProducer {
    
        @Autowired
        private JmsMessagingTemplate jmsMessagingTemplate;
    
        @Autowired
        @Qualifier("emailQueue")
        private Queue emailQueue;
    
        public void send(String msg) {
            this.jmsMessagingTemplate.convertAndSend(this.emailQueue, msg);
        }
        
    }

    邮件消息消费者:

    /**
     * 邮件消息消费者
     */
    @Component
    public class MailConsumer {
    
        @Autowired
        private MailService mailService;
        
        @JmsListener(destination = "email.queue")
        public void receiveQueue(String text) {
            System.out.println("消费邮件消息:" + text);
            // 将activeMq email.queue队列中的邮件消息发送至接收者邮箱
            JSONObject jsonObject = JSONObject.parseObject(text);
            String to = jsonObject.getString("to");
            String subject = jsonObject.getString("subject");
            String content = jsonObject.getString("content");
            mailService.sendEmail(to, subject, content);
        }
        
    }

    启动项目测试接口:

    发送post请求

    初次调用接口会报这个错误:邮箱不可用 550 User has no permission

    可以参考这篇文章解决问题:https://blog.csdn.net/Hughnes/article/details/52070878

    邮箱不可用 550 User has no permission

    当传入发送邮箱正确的用户名和密码时,总是收到到:550 User has no permission这样的错误,

    其实我们用Java发送邮件时相当于自定义客户端根据用户名和密码进行登录,然后使用SMTP服务发送邮件。但新注册的163邮件默认是不开启客户端授权验证的(对自定的邮箱大师客户端默认开启),

    因此登录总是会被拒绝,验证没有权限。解决办法是进入163邮箱,进入邮箱中心——客户端授权密码,选择开启即可,如下截图

    设置完毕后,在代码中用使用客户端授权密码代替原始的邮箱密码,这样就可以正确的发送邮件了。

    继续发送post请求,观察结果

    邮箱收到邮件:

  • 相关阅读:
    【HTML5 绘图与动画】使用canvas
    【H5新增元素和文档结构】新的全局属性 1. contentEditable 可编辑内容 2. contextmenu 快捷菜单 3. data 自定义属性 4. draggable 可拖动 5. dropzone 拖动数据 6. hidden 隐藏 7. spellcheck 语法检查 8. translate 可翻译
    【H5新增元素和文档结构】完善旧元素 1. a 超链接 2. ol 有序列表 3. dl 定义列表 4. cite 引用文本 5. small 小号字体 6. iframe 浮动框架 7. script 脚本
    【H5新增元素和文档结构】新的语义信息 1. address 2. time 3. figure 跟 figcaption 4. details 和 summary 5. mark 6. progress 7. meter 8. dialog 9.bdi 10. wbr 11. ruby、rt、rp 12. command
    【H5新增元素跟文档结构】新的文档结构 1. article 文章块 2. section 区块 3. nav 导航条 4. aside 辅助栏 5. main 主要区域 6. header 标题栏 7. hgroup 标题组 8. footer 页脚栏
    5_PHP数组_3_数组处理函数及其应用_9_数组集合运算函数
    【华为云技术分享】鲲鹏弹性云服务器GCC交叉编译环境搭建指南
    【华为云技术分享】7 分钟全面了解位运算
    【华为云技术分享】Linux内核编程环境 (1)
    【华为云技术分享】华为云MySQL 8.0正式商用,全新增强版开源利器强势来袭
  • 原文地址:https://www.cnblogs.com/tangzhe/p/9213517.html
Copyright © 2011-2022 走看看