天天看點

35.郵件服務

郵件服務搭建

添加子產品

子產品名:mailserver

選擇Spring Initializer,添加Thymeleaf、RabbitMQ、Java Mail Sender,Spring web就不需要添加了,隻需要依賴之前的vhr-model就行

35.郵件服務

添加依賴

vhr/pom.xml添加mailserver子產品

<modules>
        <module>vhrserver</module>
        <module>mailserver</module>
</modules>
           

mailserver/pom.xml

<dependency>
            <groupId>org.javaboy</groupId>
            <artifactId>vhr-model</artifactId>
            <version>1.0-SNAPSHOT</version>
</dependency>
           

開啟郵箱的pop3/smtp服務

網易163郵箱

35.郵件服務

配置檔案

server.port=8082
spring.mail.host=smtp.163.com
spring.mail.protocol=smtp
spring.mail.default-encoding=UTF-8
spring.mail.password=xxxxxxxxxxx
[email protected]
spring.mail.port=25
spring.mail.properties.mail.stmp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.debug=true

spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672

           

建立thymeleaf郵件模闆

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>入職歡迎郵件</title>
</head>
<body>

歡迎 <span th:text="${name}"></span> 加入大家庭,您的入職資訊如下:
<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>

           

MailServerApplication

@SpringBootApplication
public class MailserverApplication {

    public static void main(String[] args) {
        SpringApplication.run(MailserverApplication.class, args);
    }

    @Bean
    Queue queue(){
        return new Queue("com.welcome");
    }
}
           

建立receiver/MailReceiver

@Component
public class MailReceiver {
    public static final Logger logger = LoggerFactory.getLogger(MailReceiver.class);
    @Autowired
    JavaMailSender javaMailSender;
    @Autowired
    MailProperties mailProperties;
    @Autowired
    TemplateEngine templateEngine;

    //RabbitMQ監聽對象
    @RabbitListener(queues = "com.welcome")
    public void handler(Employee employee){
        logger.info(employee.toString());
        //收到消息,發送郵件
        MimeMessage msg = javaMailSender.createMimeMessage();
        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());
            //渲染HTML字元串
            String mail = templateEngine.process("mail", context);
            helper.setText(mail, true);// 正文
            javaMailSender.send(msg);//發送
        } catch (MessagingException e) {
            e.printStackTrace();
            logger.error("郵件發送失敗:" + e.getMessage());
        }
    }
}

           

給新入職員工發送歡迎郵件

vhr-model下的model/employee實作Serializable

public class Employee implements Serializable
           

employee中的以下成員實作Serializable

private Nation nation;
private Politicsstatus politicsstatus;
private Department department;
private JobLevel jobLevel;
private Position position;
           

vhr-web/application.properties添加消息中間件配置

spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
           

Service

EmployeeService

@Autowired
RabbitTemplate rabbitTemplate;

public final static Logger logger = LoggerFactory.getLogger(EmployeeService.class);
    
//在添加員工時發送郵件
public Integer addEmp(Employee employee) {
        //省略
        //添加如下代碼
        int result = employeeMapper.insertSelective(employee);
        if (result == 1) {
        	//擷取添加員工的id并将id轉化為職稱名稱,部門名稱等。
            Employee emp = employeeMapper.getEmployeeById(employee.getId());
            //列印職工資訊,确認是不是消息中間件的問題
            logger.info(emp.toString());
            //對應模闆中的監聽的隊列名稱 
            rabbitTemplate.convertAndSend("javaboy.mail.welcome", emp);
        }
        return result;
    }
           

Mapper

EmployeeMapper

Employee getEmployeeById(Integer id);
           

XML

<insert id="insertSelective" parameterType="com.qwl.vhr.model.Employee" useGeneratedKeys="true"
          keyProperty="id">



  <select id="getEmployeeById" resultMap="AllEmployeeInfo">
    select e.*,n.id as nid,n.`name`as nname, p.id as pid,p.name as pname,d.id as did,d.`name`as
    dname,j.id as jid,j.`name`as jname,pos.id as posid,pos.`name`as posname
 from employee e,nation n,politicsstatus p,department d,joblevel j,position pos
where e.nationId=n.id and e.politicId=p.id and
e.departmentId=d.id and e.jobLevelId=j.id and e.posId=pos.id and e.id =#{id}
  </select>