35.郵件服務
阿新 • • 發佈:2020-08-11
郵件服務搭建
新增模組
模組名: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>