- 邮件协议简介
- 申请QQ邮箱授权码
- 发送简单邮件
- 发送带附件的邮件
- 发送带图片资源的邮件
- Thymeleaf做邮件模板
- FreeareMaker做邮件模板
- Spring Boot 定时任务实现方案一(@Scheduled)
- Spring Boot 定时任务实现方案二(Quartz)
- SpringBoot整合Swagger2
- 邮件协议简介
- 申请QQ邮箱授权码
SMTP 端口25 基于TCP/IP的应用层协议,简单邮件传输协议,邮件客户端软件与SMTP服务器之间,
以及SMTP服务器与SMTP服务器之间的通信规则。
POP3 邮局协议,定义了邮件客户端与POP3服务器之间的通信规则
IMAP 是对POP3协议的扩展,更能更强,作用类似。
QQ邮箱设置--开启相应服务---我已发送--获取授权码
- 发送简单的邮件
- 发送带附件的邮件
- 发送带图片资源的邮件
- 创建项目添加Web依赖,添加I/O下面的Java Mail Sender依赖 在application.properties下配置
spring.mail.host=smtp.qq.com spring.mail.port=587 //或者465 spring.mial.username=1290410202@qq.com spring.mail.password=agawybjhdmbkhhhih //授权码 spring.mail.default-encoding=UTF-8 spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory spring.mail.properties.mail.debug=true
单元测试
public class MailApplicationTests { @Autowired JavaMailSender javaMailSender; @Test public void contextLodas() { SimpleMailMessage msg = new SimpleMailMessage(); msg.setMailMessage("这是测试邮箱的主题"); msg.setText("这是测试邮箱的内容"); msg.setFrom("1290410202@qq.com"); //application.properties配置的自己的邮箱 msg.setSendate(new Date()); //设置发送日期 msg.setTo("2615687070@qq.com"); //目标地址 msg.setCc("3223252352@qq.com"); //抄送 javaMailSender.send(msg); } } //带附件的邮件 @Test public void test1() throws MessagingException{ MinmeMessage msg = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(msg,true); msg.setMailMessage("这是测试邮箱的主题(带附件)"); helper.setText("这是测试邮箱的内容(带附件)"); helper.setFrom("1290410202@qq.com"); //application.properties配置的自己的邮箱 helper.setSendate(new Date()); //设置发送日期 helper.setTo("2615687070@qq.com"); //目标地址 helper.setCc("3223252352@qq.com"); //抄送 helper.addAttachment("zenghao.png",new File(pathname:"D:\\zenghao\zenghao.png")) //附件 javaMailSender.send(msg); } //带图片的邮件 @Test public void test2() throws MessagingException{ MinmeMessage msg = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(msg,true); msg.setMailMessage("这是测试邮箱的主题(带图片)"); helper.setText("这是测试邮箱的内容,这是第一张图片:<img src='cid=p01'/>,这是第二图片:<img src='cid=p02'/>",html:true);; helper.setFrom("1290410202@qq.com"); //application.properties配置的自己的邮箱 helper.setSendate(new Date()); //设置发送日期 helper.setTo("2615687070@qq.com"); //目标地址 helper.addInline("p01",new FileSystemResource(new File("D:\\zenghao\zenghao.png"))); helper.addInline("p01",new FileSystemResource(new File("D:\\zhangsan\zhangsan.png"))); javaMailSender.send(msg); }
- Thymelaf做邮件模板
- 加入依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
在resources目录下Template目录下创建Thymeleaf,mail.html
..... <div> hello <span th:text="${username}"></span>,欢迎加入XXX大家庭 </div> 您的入职信息如下: <table border="1"> <tr> <td>职位</td> <td th:text="${positon}"></td> </tr> <tr> <td>职称</td> <td th:text="${joblevel}"></td> </tr> <tr> <td>薪水</td> <td th:text="${salary}"></td> </tr> <tr> <td>部门</td> <td th:text="${dep}"></td> </tr> </table> <div >希望在未来的日子里,携手共进</div> .....
@Autowired TemplateEngine templateEngine //模板引擎 @Test public void test3() throws MessagingException{ MinmeMessage msg = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(msg,true); msg.setSubject("这是测试邮箱的主题(thymelaf)"); Context context = new Context(); context.setVariable("username","zenghao"); context.setVariable("position","Java"); context.setVariable("dep","产品研发部"); context.setVariable("salary","999999"); context.setVariable("joblevel","高级工程师"); String pocess = templateEngine.process("mail.html",context); helper.setText(process,true); helper.setForm("1290410202@qq.com"); helper.setSentDate(new Date()); herper.setTo("2515687070@qq.com"); javaMailSender.send(msg); }
- Freemarker做邮件模板
- 导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
在resources目录下Template目录下创建Thymeleaf,mail.ftl
..... <div> hello <span>${username}/span>,欢迎加入XXX大家庭 </div> 您的入职信息如下: <table border="1"> <tr> <td>职位</td> <td >${positon}</td> </tr> <tr> <td>职称</td> <td >${joblevel}</td> </tr> <tr> <td>薪水</td> <td >${salary}</td> </tr> <tr> <td>部门</td> <td>${dep}</td> </tr> </table> <div >希望在未来的日子里,携手共进</div>
@Test public void test4() throws MessagingException,IOException,TemplateException{ MinmeMessage msg = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(msg,true); msg.setSubject("这是测试邮箱的主题(freemarker)"); Configuration configuration = new Configuration(Configuration.VBRSION_2_3_28); configuration.setClassLoaderForTemplateLoading(this.getClass().getClassLoader(),basePackagePath:"template"); Template template = configuration.getTemplate("mail.ftl"); Map<String,Object> map = new HashMap<>(); map.setVariable("username","zenghao"); map.setVariable("position","Java"); map.setVariable("dep","产品研发部"); map.setVariable("salary","999999"); map.setVariable("joblevel","高级工程师"); StringWriter out = new StringWriter(); template.process(map,out); helper.setText(process,true); helper.setForm("1290410202@qq.com"); helper.setSentDate(new Date()); herper.setTo("2515687070@qq.com"); javaMailSender.send(msg); }
- Spring Boot 定时任务实现方案一(@Scheduled)
- 创建项目 在启动类中加入@EnableScheduling //开启定时任务 创建一个service
@Service public class HelloService { @Scheduled(fixedDelay=2000) //前面任务的结束时间和后面任务的开始时间之间的间隔3S public void fixedDelay(){ //每隔2S打印一次 System.out.println("fixedDelay>>"+new Date()); } @Scheduled(fixeRate=2000) // 两次定时任务开始的间隔时间为2S public void fixeRate(){ System.out.println("fixeRate>>"+new Date()); } //cron表达式 @Scheduled(cron="0/5 * * * * ?") //每隔5秒打印一次,任意分、时、日、月、年 public void cron() { System.out.println("cron>>"+new Date()); } }
- Spring Boot 定时任务实现方案二(Quartz)
- 创建项目 添加web依赖,添加I/O下面的Quartz Scheduler依赖 在启动类@SpringBootApplication中加入注解
@EnableScheduling //开启定时任务 @Component public calss MyFirstJob { public void sayHello() { System.out.println("first job say hello" + new Date()); } } public calss MySecondeJob extends QuartzJobBean{ private String name; public void setName(String name) { this.name=name; } @Override protected void executeInternal(JobExecutionContext jobExecutionContext)throws JobExecutionException { System.out.println("seconde job say hello" +name+":"+ new Date()); } } @Configuration public class QuartzConfig { @Bean MethonInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() { MethonInvokingJobDetailFactoryBean bean = new MethonInvokingJobDetailFactoryBean (); bean.setTargetBeanName("MyFirstJob"); bean.setTargetMethod("sayHello"); return bean; } //or @Bean JobDetailFactoryBean jobDeatilFactoryBean(){ JobDetailFactoryBean bean = new JobDetailFactoryBean (); JobDataMap map = new JobDataMap(); map.put("name","zenghao"); bean.setJobDataMap(map); bean.setJobClass(MySecondJob.class); return bean; } //trigger 触发器 @Bean SimpTriggerFactoryBean simpTriggerFactoryBean(){ SimpTriggerFactoryBean bean = new SimpTriggerFactoryBean(); bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject()); bean.setStartTime(new Date()); //开始时间 bean,setRepeatInterval(2000); //重复的时间间隔 bean.setRepeatCount(3); //重复的次数 return bean; } //or @Bean CronTriggerFactoryBean cronTriggerFactoryBean { CronTriggerFactoryBean bean = new CronTriggerFactoryBean(); bean.setJobDetail(jobDetailFactoryBean().getObject()); bean.setCronExpression("* * * * ?"); return bean; } //启动定义 @Bean SchedulerFactoryBean schedulerFactoryBean { SchedulerFactoryBean bean = new SchedulerFactoryBean(); bean.setTriggers(simpleTriggerFactoryBean().getObject(),cronTriggerFactoryBean().getObject()); return bean; } }
- SpringBoot整合Swagger2
- 创建项目 swagger2 添加依赖
<dependency> <groupId>io.springfox</groupId> <artifatctId>springfox-swagger2</artifactId> <version>2.9.2</version> <dependency> <dependency> <groupId>io.springfox</groupId> <artifatctId>springfox-swagger-ui</artifactId> <version>2.9.2</version> <dependency>
创建config目录
@Configuration
@EnableSwagger2
public class Swagger2Config {
@Bean
Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("org.zenhao.swagger2.controller"))
.paths(PathSelectors.any()) //配置所有路径
.build().apiInfo(new ApiInfoBuilder()
.description("接口文档的描述信息")
.title("XXX项目接口文档")
.contact(new Contacat("zenghao","http://www/zenghao.org",
"1290410202@qq.com"))
.version("v1.0")
.license("Apache2.0")
.build()) //配置生成网站的基本信息
}
}
创建一个Bean
@ApiModel(value="用户实体类".description="用户信息描述类")
public class User {
@ApiModelProperty(value="用户id")
private Integer id;
@ApiModelProperty(value="用户名")
private String username;
@ApiModelProperty(value="用户密码")
private String password;
get()/set()
.....
}
创建一个controller
@RestController
@Api(tags="用户数据接口") //可选,前端就可以中文展示
public class UserController {
@ApiOperation(Value="查询用户",notes="根据用户id查询用户") //可选
@ApiImplicitParam(name="id",value="用户id",required=true) //可选,swagger测试时只当参数必填,但不能表示后端参数真正必填,
// 要想后端参数真正必填,还是需要在代码上指定@RequestParam(id)才行
@Getmapping("/user") //必须明确是哪一种请求,不能笼统的RequestMapping
public User getUserById(Integer id) {
User user = new User();
user.setId(id);
return user;
}
@ApiOperation(value="删除用户",notes="根据用户id删除用户")
@ApiImplicitParam(name="id",value="用户id",required=true,defaultValue="99")
@DeleteMapping("/usert/{id}")
public void deleteUserById(@PathVariable Integer id) {
System.out.println("deleteUserById" +id);
}
//@ApiResponses({
@ApiResponse(code=200,message="删除成功");
@ApiResponse(code=500,message="删除失败");
})
@PutMapping("/user")
@ApiImplicitParams({
@ApiImplicitParam(name="id",value="用户id",required=true,defaultValue="99")
@ApiImplicitParam(name="username",value="用户名",required=true,defaultValue="张三")
@ApiOperation(value="更新用户",notes="根据用户id更新用户名")
})
public User update(Integer id,String username) {
User user = new User();
user.setId(100);
user.setUserName("zhangsan");
return user;
}
}
//ApiIgnore 表示生成项目的时候忽略此接口
启动项目,访问 localhost:8080/swagger-ui.html