赞
踩
1、pom.xml文件内容如下(是我所有学习内容需要的,不再单独分出来,包不会冲突):
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.6.4</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <groupId>com.hm-email</groupId>
- <artifactId>hm-email</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>hm-email</name>
- <description>hm-email</description>
- <properties>
- <java.version>8</java.version>
- <druid.version>1.2.8</druid.version>
- <log4jdbc.version>1.16</log4jdbc.version>
- <es.version>7.9.2</es.version>
- </properties>
- <dependencies>
- <!-- druid数据源驱动 -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid-spring-boot-starter</artifactId>
- <version>${druid.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
-
- <!-- mybatis -->
- <dependency>
- <groupId>com.baomidou</groupId>
- <artifactId>mybatis-plus-boot-starter</artifactId>
- <version>3.5.3.1</version>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <optional>true</optional>
- </dependency>
-
- <!--Mysql依赖包-->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <scope>runtime</scope>
- </dependency>
-
- <!--lombok插件-->
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <optional>true</optional>
- </dependency>
-
- <!--监控sql日志-->
- <dependency>
- <groupId>org.bgee.log4jdbc-log4j2</groupId>
- <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
- <version>${log4jdbc.version}</version>
- </dependency>
-
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.2.9</version>
- </dependency>
-
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.apache.kafka</groupId>
- <artifactId>kafka-clients</artifactId>
-
- </dependency>
-
- <dependency>
- <groupId>org.springframework.kafka</groupId>
- <artifactId>spring-kafka</artifactId>
-
- </dependency>
-
- <!-- high client-->
- <dependency>
- <groupId>org.elasticsearch.client</groupId>
- <artifactId>elasticsearch-rest-high-level-client</artifactId>
- <version>${es.version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.elasticsearch</groupId>
- <artifactId>elasticsearch</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.elasticsearch.client</groupId>
- <artifactId>elasticsearch-rest-client</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
- <!-- rest-high-level-client 依赖如下2个jar -->
- <dependency>
- <groupId>org.elasticsearch</groupId>
- <artifactId>elasticsearch</artifactId>
- <version>${es.version}</version>
- </dependency>
- <dependency>
- <groupId>org.elasticsearch.client</groupId>
- <artifactId>elasticsearch-rest-client</artifactId>
- <version>${es.version}</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-mongodb</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-security</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.security.oauth.boot</groupId>
- <artifactId>spring-security-oauth2-autoconfigure</artifactId>
- <version>2.4.0</version>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-mail</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </dependency>
-
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- </project>
2、application.yml内容如下:
- server:
- port: 8081
- servlet.context-path: /
-
- #配置数据源
- spring:
- datasource:
- druid:
- db-type: com.alibaba.druid.pool.DruidDataSource
- driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
- url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:eladmin}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
- username: ${DB_USER:root}
- password: ${DB_PWD:demo}
- redis:
- host: localhost
- port: 6379
- password: demo
- database: 10
- data:
- mongodb:
- host: 43.138.0.199
- port: 27017
- username: hmblogs
- password: demo
- database: hmblogs
- authentication-database: admin
- mail:
- host: smtp.163.com # smtp地址,开通的时候会显示
- username: southpoet@163.com # 你的邮箱账号
- password: demo # 你的邮箱授权码
- default-encoding: UTF-8
- properties:
- mail:
- smtp:
- socketFactory:
- class: javax.net.ssl.SSLSocketFactory
- auth: false
- starttls:
- enable: false
- debug: true
- protocol: smtp
-
- es:
- host: 43.138.0.199
- port: 9200
- scheme: http
- user: elastic
- password: demo
3、BackendApplication内容如下:
- package com.hmblogs.backend;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- public class BackendApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(BackendApplication.class, args);
- }
-
- }
4、EmailService文件内容如下:
- package com.hmblogs.backend.service;
-
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.mail.SimpleMailMessage;
- import org.springframework.mail.javamail.JavaMailSender;
- import org.springframework.mail.javamail.MimeMessageHelper;
- import org.springframework.stereotype.Service;
-
- import javax.mail.MessagingException;
- import javax.mail.internet.MimeMessage;
- import java.io.File;
-
- @Service
- @Slf4j
- public class EmailService {
-
- @Autowired
- private JavaMailSender mailSender;
-
- @Value("${spring.mail.username}")
- private String username;
-
- /**
- * 使用thymeleaf模板
- * @param to
- * @param subject
- * @param context
- */
- public void sendHtmlMail(String to ,String subject,String context){
- try {
- MimeMessage mimeMessage = mailSender.createMimeMessage();
- MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
- mimeMessageHelper.setFrom(username);
- mimeMessageHelper.setTo(to);
- mimeMessageHelper.setText(context);
- mimeMessageHelper.setSubject(subject);
- mailSender.send(mimeMessage);
- } catch (MessagingException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * 发送文本邮件
- *
- * @param to 收件人地址
- * @param subject 邮件主题
- * @param content 邮件内容
- * @param cc 抄送地址
- */
- public void sendSimpleMail(String to, String subject, String content, String... cc) {
- SimpleMailMessage message = new SimpleMailMessage();
- message.setFrom(username);
- message.setTo(to);
- message.setSubject(subject);
- message.setText(content);
- if (cc!=null) {
- message.setCc(cc);
- }
- mailSender.send(message);
- }
-
- /**
- * 发送带附件的邮件
- *
- * @param to 收件人地址
- * @param subject 邮件主题
- * @param content 邮件内容
- * @param filePath 附件地址
- * @param cc 抄送地址
- */
- public void sendAttachmentsMail(String to, String subject, String content, String filePath, String... cc) {
- try {
- MimeMessage message = mailSender.createMimeMessage();
- MimeMessageHelper helper = new MimeMessageHelper(message, true,"UTF-8");
- helper.setFrom(username);
- helper.setTo(to);
- helper.setSubject(subject);
- helper.setText(content, true);
- if (cc!=null) {
- helper.setCc(cc);
- }
- File file = new File(filePath);
- String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
- helper.addAttachment(fileName, file);
- mailSender.send(message);
- } catch (MessagingException e) {
- log.error("发送邮件失败,收件人:{}", to, e);
- }
- }
- }
-
5、EmailServiceTest测试类内容如下:
- package com.hmblogs.backend.util;
-
- import com.hmblogs.backend.BackendApplication;
- import com.hmblogs.backend.service.EmailService;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
- import org.thymeleaf.TemplateEngine;
- import org.thymeleaf.context.Context;
-
- import javax.annotation.Resource;
-
- @RunWith(SpringJUnit4ClassRunner.class)
- @SpringBootTest(classes={BackendApplication.class, EmailServiceTest.class})
- public class EmailServiceTest {
-
- @Resource
- private EmailService emailService;
-
- private static final String to = "southcxy@163.com";
-
- @Test
- public void test(){
- emailService.sendSimpleMail(to,"简单测试22","简单测试");
- }
-
- @Test
- public void testWithAttachment(){
- emailService.sendAttachmentsMail(to,"附件测试22","附件测试","E:\\fileTest.txt");
- }
-
- @Autowired
- TemplateEngine templateEngine;
-
- @Test
- public void sendHtmlMailThymeleaf(){
- Context context = new Context();
- context.setVariable("username","cyc");
- String mail = templateEngine.process("mailtemplate.html",context);
- emailService.sendHtmlMail(to,"恭喜22!",mail);
- }
- }
-
启动服务,执行该方法,报错如下:
- org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not convert socket to TLS;
- nested exception is:
- javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target. Failed messages: javax.mail.MessagingException: Could not convert socket to TLS;
- nested exception is:
- javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
- ; message exception details (1) are:
- Failed message 1:
- javax.mail.MessagingException: Could not convert socket to TLS;
- nested exception is:
- javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
- at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:2140)
- at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:734)
- at javax.mail.Service.connect(Service.java:342)
- at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:518)
- at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:437)
- at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:323)
- at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:312)
- at com.hmblogs.backend.service.EmailService.sendSimpleMail(EmailService.java:42)
- at com.hmblogs.backend.util.EmailServiceTest.test(EmailServiceTest.java:21)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.lang.reflect.Method.invoke(Method.java:498)
- at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
- at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
- at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
- at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
- at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
- at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
- at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
- at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
- at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
- at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
- at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
- at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
- at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
- at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
- at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
- at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
- at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
- at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
- at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
- at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
- at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
- at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
- at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
- at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
- at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
- at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
- at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
- at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
- at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
- Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
- at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
- at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
- at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
- at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
- at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1514)
- at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
- at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
- at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)
- at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
- at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
- at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
- at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
- at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:602)
- at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:529)
- at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:2135)
- ... 41 more
- Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
- at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
- at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
- at sun.security.validator.Validator.validate(Validator.java:260)
- at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
- at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
- at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
- at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496)
- ... 51 more
- Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
- at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
- at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
- at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
- at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
- ... 57 more
-
查了一圈资料,和SSL证书有关的,都不行,最后试着改改配置文件,发现搞好了
目标邮箱收到了如下邮件:
发件邮箱,发的邮件如下:
但是,问题是,模板html没解析出来,非研发同学肯定看不懂邮件内容,
怎么处理呢?
比对网上的资料,
问题解决了,邮件截图如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。