• 云e办(后端)——邮件发送(员工入职时发送邮件)


    云e办(后端)——邮件发送(员工入职时发送邮件)

    邮件服务的业务逻辑:
    例如:新员工入职时,会填写个人信息。当添加成功后,系统会给该员工发送一封欢迎邮件。包含:工号、职称、职位等信息。

    一、前提准备:开通smtp

    MAP是什么?

    IMAP,即Internet Message Access Protocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP类似,都是一种邮件获取协议

    我是通过网易邮箱进行注册办理。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    二、在yeb-project中搭建邮件项目:

    1、创建module

    在这里插入图片描述
    在这里插入图片描述

    2.创建springboot Application
    package com.xxxx.mail;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class MailApplication {
        public static void main(String[] args) {
            SpringApplication.run(MailApplication.class,args);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    3、yml文件

    在main下创建resources /conf/application.yml

    server:
      # 端口
      port: 8082
    spring:
      # 邮件配置
      mail:
        # 邮件服务器地址
        host: smtp.163.com
        # 协议
        protocol: smtp
        # 编码格式
        default-encoding: utf-8
        # 授权码(在邮箱开通服务时获取)
        password: meqxqfgkoowh*agd
        # 发送者邮箱地址
        username: 
        # 端口(不同邮箱端口号不同)
        port: 22
          # rabbitmq配置
          rabbitmq:
            # 用户名
            username: guest
            # 密码
            password: guest
            # 服务器地址
            host:  
            # 端口
            port: 5672
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    4、邮件模板:resources/templates/mail.html
    DOCTYPE html>
    <html lang="en" xmlns:th="http://www.theymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>入职欢迎邮件title>
    head>
    <body>
    欢迎 <span th:text="${name}">span> 加入 XXXX 大家庭,您的入职信息如下:
    
    <table border="1">
        <tr>
            <td>姓名td>
            <td th:text="${name}">td>
        tr>
        <tr>
            <td>职位td>
            <td th:text="${posName}">td>
        tr>
        <tr>
            <td>职称td>
            <td th:text="${joblevelName}">td>
        tr>
        <tr>
            <td>部门td>
            <td th:text="${departmentName}">td>
        tr>
    table>
    
    <p>我们公司的工作忠旨是严格,创新,诚信,您的加入将为我们带来新鲜的血液,带来创新的思维,以及为
        我们树立良好的公司形象!希望在以后的工作中我们能够齐心协力,与时俱进,团结协作!同时也祝您在本公
        司,工作愉快,实现自己的人生价值!希望在未来的日子里,携手共进!p>
    body>
    html>
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    三、yeb-server邮件发送的功能:

    1、yeb-server添加依赖 / 修改配置文件
        
        <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starter-amqpartifactId>
        dependency>
    ---
    spring:
      # rabbitmq配置
     rabbitmq:
        # 用户名
       username: guest
        # 密码
       password: guest
        # 服务器地址
       host: 192.168.10.100
        # 端口
       port: 5672
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    2、添加员工成功后,发送邮件:
    package com.xxxx.server.service.impl;
    
     /**
         * 添加员工
         * @param employee
         * @return
         */
        @Override
        public RespBean insertEmployee(Employee employee) {
            //处理合同期限,保留2位小数
            //获取合同开始的时间
            LocalDate beginContract = employee.getBeginContract();
            //获取合同结束的时间
            LocalDate endContract = employee.getEndContract();
            //计算有多少天
            long days = beginContract.until(endContract, ChronoUnit.DAYS);
            // 将天数保留两位小数点
            DecimalFormat decimalFormat = new DecimalFormat("##.00");
            employee.setContractTerm(Double.parseDouble(decimalFormat.format(days/365.00)));
         //判断 数据是否添加成功
            if (1==employeeMapper.insert(employee)) {
                /**
                 * 添加数据成功后,获取新增用户的完整信息:
                 *      getEmployee.getId() 根据刚新增的id号,进行查询该用户的所有信息
                 *          getEmployee这个方法是“分批导出”时遗留的:根据Id可以导入,List getEmployee(Integer id);
                 *              mapperxml:AND e.id = #{id}
         *       *      虽然查询后只有一条数据,但是由于返回的是List列表形式,所以得需要 .get(0)
                 */
    
            
      		   //2.发送消息(路由key,emp:新插入这个人的用户信息)
                rabbitTemplate.convertAndSend("mail.welcome",emp);
                return RespBean.success("添加成功!");
            }
            return RespBean.error("添加失败!");
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    四、yeb-serve将用户信息发给yeb-mail,yeb-mail负责发送邮件功能

    1、消息接收者,然后发送邮件
     package com.xxxx.mail;
    
    import com.xxxx.server.pojo.Employee;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.mail.MailProperties;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.mail.javamail.MimeMessageHelper;
    import org.springframework.stereotype.Component;
    import org.thymeleaf.TemplateEngine;
    import org.thymeleaf.context.Context;
    import javax.mail.MessagingException;
    import javax.mail.internet.MimeMessage;
    import java.util.Date;
    
    /**
     * 消息接收者
     *
     */
    //component 被spring容器进行管理
    @Component
    public class MailReceiver {
        //logger进行打印日志
        private static final Logger LOGGER = LoggerFactory.getLogger(MailReceiver.class);
    
        @Autowired
        private JavaMailSender javaMailSender;
        // 邮件配置
        @Autowired
        private MailProperties mailProperties;
        //模板 引擎---->//templateEngine会从下面的context拿相应的数据。(从context拿到相应内容,放到mail)
        // 从而前端会拿到相应的数据。
        @Autowired
        private TemplateEngine templateEngine;
    
        /**
         * 接收发送命令:
         * 邮件发送
         */
        // 有了这个RabbitListener注解后,会根据路由,会将接收到发送端的消息“给该用户发送邮件的信息”
        //employee就是需要发送邮件的信息
        @RabbitListener(queues = "mail.welcome")
        public void handler(Employee employee){
            //创建消息
            MimeMessage msg = javaMailSender.createMimeMessage();
            System.out.println("创建消息:====》"+msg);
    
            //
            MimeMessageHelper helper = new MimeMessageHelper(msg);
            try {
                //发件人
                helper.setFrom(mailProperties.getUsername());
                //收件人
                helper.setTo(employee.getEmail());
                //主题
                helper.setSubject("入职欢迎邮件");
                //发送日期
                helper.setSentDate(new Date());
                //邮件内容
                Context context= new Context();
                context.setVariable("name",employee.getName());
                context.setVariable("posName",employee.getPosition().getName());
                context.setVariable("joblevelName",employee.getJoblevel().getName());
                context.setVariable("departmentName",employee.getDepartment().getName());
                //templateEngine会从context拿相应的数据。(从context拿到相应内容,放到mail)
                String mail = templateEngine.process("mail", context);
                helper.setText(mail,true);
    
                //发送邮件
                javaMailSender.send(msg);
            } catch (MessagingException e) {
                LOGGER.error("邮件发送失败=====>{}", e.getMessage());
            }
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    在这里插入图片描述

    2、启动类:
    @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
    public class MailApplication {
        public static void main(String[] args) {
            SpringApplication.run(MailApplication.class,args);
        }
    
        @Bean
        public Queue queue(){
            return new Queue("mail.welcome");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    PageOffice只读查看word文件并禁止复制
    【JavaEE&Spring】认识Spring
    ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 有啥区别
    面试题收集
    万字泣血解析割韭菜内情,程序员别老想着做副业
    【产品新体验】CSDN. 云IDE体验与功能使用教程(保姆级教程)
    MySQL事务与MVCC如何实现的隔离级别
    重新认识下JVM级别的本地缓存框架Guava Cache(2)——深入解读其容量限制与数据淘汰策略
    记一次生产大对象及GC时长优化经验
    Socket,Servlet,Tomcat
  • 原文地址:https://blog.csdn.net/xiangqian0721/article/details/127749158