1. 程式人生 > 實用技巧 >35.郵件服務

35.郵件服務

郵件服務搭建

新增模組
模組名:mailserver
選擇Spring Initializer,新增Thymeleaf、RabbitMQ、Java Mail Sender,Spring web就不需要添加了,只需要依賴之前的vhr-model就行

新增依賴

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郵箱

配置檔案

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>