SpringBoot 集成短信和邮件的配置示例详解

目录
  • 依赖
    • 配置
    • 编码
      • 1、邮件
      • 2、短信

准备工作

1、集成邮件

以QQ邮箱为例

在发送邮件之前,要开启POP3和SMTP协议,需要获得邮件服务器的授权码,获取授权码:

1、设置>账户

在账户的下面有一个开启SMTP协议的开关并进行密码验证:

2、获取成功的授权码

2、集成短信

以阿里云短信服务为例

1、登陆阿里云—>进入控制台—>开通短信服务

进入后根据提示开通短信服务即可。

2、充值

后期发短信测试需要,暂时可以跳过此步骤。

3、获取AccessKey和AccessSercet

文档使用指引: https://help.aliyun.com/document_detail/59210.html?spm=a2c6h.13066369.0.0.4b3516b4kN0052

4、API

OpenAPI地址: https://next.api.aliyun.com/document/Dysmsapi/2017-05-25/overview

依赖

1、邮件

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2、短信

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>dysmsapi20170525</artifactId>
    <version>2.0.4</version>
</dependency>

配置

1、配置邮箱基本信息

spring:
  mail:
    # 配置 SMTP 服务器地址
    host: smtp.qq.com
    # 发送者邮箱
    username: 742354529@qq.com
    # 配置密码,注意不是真正的密码,而是申请的授权码
    password: vjstfghblprwbdbd
    # 端口号465或587
    port: 587
    # 默认的邮件编码为UTF-8
    default-encoding: UTF-8
    # 配置SSL 加密工厂
    properties:
      mail:
        smtp:
          socketFactoryClass: javax.net.ssl.SSLSocketFactory
        # 表示开启DEBUG模式,邮件发送过程的日志会在控制台打印出来
        debug: true

SMTP 服务器地址

  • 126邮箱SMTP服务器地址:smtp.126.com,端口号:465或者994
  • 2163邮箱SMTP服务器地址:smtp.163.com,端口号:465或者994
  • yeah邮箱SMTP服务器地址:smtp.yeah.net,端口号:465或者994
  • qq邮箱SMTP服务器地址:smtp.qq.com,端口号465或587*

2、短信配置

# 阿里云短信配置
sms:
  access-id: LTAI5tDP3SDQC9yvCguiiFDr
  access-key: EGSDQsLxCVS5dwjS8DCxmYQ124XySV
  sign-name:
  endpoint: dysmsapi.aliyuncs.com

编码

1、邮件

1.1、MailService.java

package com.tanersci.service;

import com.tanersci.dto.MailMessageDto;
import com.tanersci.vo.MessageVo;
/**
 * @ClassName: MailService.java
 * @ClassPath: com.tanersci.service.MailService.java
 * @Description: 邮件
 * @Author: tanyp
 * @Date: 2021/6/7 9:18
 **/
public interface MailService {
	/**
	 * @MonthName: sendSimple
	 * @Description: 普通邮件发送
	 * @Author: tanyp
	 * @Date: 2021/6/7 9:30
	 * @Param: [dto]
	 * @return: void
	 **/
	MessageVo sendSimple(MailMessageDto dto);
	 * @MonthName: sendAttachFile
	 * @Description: 带附件的邮件
	MessageVo sendAttachFile(MailMessageDto dto);
	 * @MonthName: sendImgRes
	 * @Description: 带图片资源的邮件
	MessageVo sendImgRes(MailMessageDto dto);
}

1.2、MailServiceImpl.java

package com.tanersci.service.impl;

import com.alibaba.fastjson.JSON;
import com.tanersci.dto.MailMessageDto;
import com.tanersci.vo.MessageVo;
import com.tanersci.constant.Constants;
import com.tanersci.service.MailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
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.time.LocalDateTime;
import java.util.Date;
import java.util.Objects;
/**
 * @ClassName: MailServiceImpl.java
 * @ClassPath: com.tanersci.service.impl.MailServiceImpl.java
 * @Description: 邮件
 * @Author: tanyp
 * @Date: 2021/6/7 9:18
 **/
@Slf4j
@Service
public class MailServiceImpl implements MailService {
	@Value("${spring.mail.username}")
	private String sender;
	@Autowired
	private JavaMailSender javaMailSender;
	/**
	 * @MonthName: sendSimple
	 * @Description: 普通邮件发送
	 * @Author: tanyp
	 * @Date: 2021/6/7 9:30
	 * @Param: [dto]
	 * @return: void
	 **/
	@Override
	public MessageVo sendSimple(MailMessageDto dto) {
		try {
			log.info("=======普通邮件发送开始,请求参数:{}", JSON.toJSON(dto));
			// 构建一个邮件对象
			SimpleMailMessage message = new SimpleMailMessage();
			// 设置邮件主题
			message.setSubject(dto.getSubject());
			// 设置邮件发送者,这个跟application.yml中设置的要一致
			message.setFrom(sender);
			// 设置邮件接收者,可以有多个接收者,中间用逗号隔开,以下类似
			// message.setTo("10*****16@qq.com","12****32*qq.com");
			message.setTo(dto.getRecipient());
			// 设置邮件抄送人,可以有多个抄送人
			if (Objects.nonNull(dto.getCc())) {
				message.setCc(dto.getCc());
			}
			// 设置隐秘抄送人,可以有多个
			if (Objects.nonNull(dto.getBcc())) {
				message.setBcc(dto.getBcc());
			// 设置邮件发送日期
			message.setSentDate(new Date());
			// 设置邮件的正文
			message.setText(dto.getText());
			// 发送邮件
			javaMailSender.send(message);
			log.info("=======普通邮件发送结束");
			return MessageVo.builder().code(Constants.NEWS_SUCCESS_CODE).message(Constants.NEWS_SUCCESS_MESSAGE).build();
		} catch (MailException e) {
			log.error("====邮件====sendSimple=====异常:{}", e);
			return MessageVo.builder().code(Constants.NEWS_FAIL_CODE).message(Constants.NEWS_FAIL_MESSAGE).build();
		}
	}
	 * @MonthName: sendAttachFile
	 * @Description: 带附件的邮件
	public MessageVo sendAttachFile(MailMessageDto dto) {
			log.info("=======带附件的邮件开始,请求参数:{}", JSON.toJSON(dto));
			MimeMessage mimeMessage = javaMailSender.createMimeMessage();
			// true表示构建一个可以带附件的邮件对象
			MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
			// 第一个参数是自定义的名称,后缀需要加上,第二个参数是文件的位置
			dto.getAttachments().forEach(file -> {
				try {
					message.addAttachment(file.getName(), file);
				} catch (MessagingException e) {
					log.error("=========邮件附件解析异常:{}", e);
				}
			});
			javaMailSender.send(mimeMessage);
			log.info("=======带附件的邮件结束");
		} catch (MessagingException e) {
			log.error("==========邮件====sendAttachFile=====异常:{}", e);
	 * @MonthName: sendImgRes
	 * @Description: 带图片资源的邮件
	public MessageVo sendImgRes(MailMessageDto dto) {
			log.info("=======带图片资源的邮件开始,请求参数:{}", JSON.toJSON(dto));
			// 第一个参数指的是html中占位符的名字,第二个参数就是文件的位置
					message.addInline(file.getName(), new FileSystemResource(file));
					log.error("=========邮件图片解析异常:{}", e);
			log.info("=======带图片资源的邮件结束");
			log.error("====邮件====sendImgRes=====异常:{}", e);
}

1.3、VO、DTO及常量类

MailMessageDto.java

package com.tanersci.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.File;
import java.io.Serializable;
import java.util.List;
/**
 * @ClassName: MailMessageDto.java
 * @ClassPath: com.tanersci.dto.MailMessageDto.java
 * @Description: 邮件消息
 * @Author: tanyp
 * @Date: 2021/6/7 9:20
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel(value = "邮件消息")
public class MailMessageDto implements Serializable {
	private static final long serialVersionUID = 5483400172436286831L;
	@ApiModelProperty(value = "邮件主题")
	private String subject;
	@ApiModelProperty(value = "接收者:可以有多个接收者,中间用逗号隔开")
	private String recipient;
	@ApiModelProperty(value = "抄送人:可以有多个抄送人,中间用逗号隔开")
	private String cc;
	@ApiModelProperty(value = "隐秘抄送人:可以有多个抄送人,中间用逗号隔开")
	private String bcc;
	@ApiModelProperty(value = "正文")
	private String text;
	@ApiModelProperty(value = "模板编码")
	private String code;
	@ApiModelProperty(value = "附件、图片")
	private List<File> attachments;
}

MessageVo.java

package com.tanersci.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
 * @ClassName: MessageVo.java
 * @ClassPath: com.tanersci.vo.MessageVo.java
 * @Description: 短信、邮件消息返回值
 * @Author: tanyp
 * @Date: 2021/6/7 11:35
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel(value = "短信、邮件消息返回值")
public class MessageVo implements Serializable {
	private static final long serialVersionUID = 5287525465339500144L;
	@ApiModelProperty(value = "状态码")
	private String code;
	@ApiModelProperty(value = "状态码的描述")
	private String message;
	@ApiModelProperty(value = "请求ID")
	private String requestId;
	@ApiModelProperty(value = "发送回执ID")
	private String bizId;
	@ApiModelProperty(value = "模板编码")
	private String templateCode;
}

Constants.java

package com.tanersci.constant;

/**
 * @ClassName: Constants.java
 * @ClassPath: com.tanersci.constant.Constants.java
 * @Description: 常量
 * @Author: tanyp
 * @Date: 2021/5/22 15:54
 **/
public class Constants {
	/**
	 * 消息发送状态码
	 */
	public final static String NEWS_SUCCESS_CODE = "OK";
	public final static String NEWS_SUCCESS_MESSAGE = "发送成功";
	public final static String NEWS_FAIL_CODE = "FAIL";
	public final static String NEWS_FAIL_MESSAGE = "发送失败";
}

2、短信

2.1、SmsService.java

package com.tanersci.service;

import com.tanersci.dto.SmsMessageDto;
import com.tanersci.dto.SmsTemplateDto;
import com.tanersci.vo.MessageVo;
/**
 * @ClassName: SmsService.java
 * @ClassPath: com.tanersci.service.SmsService.java
 * @Description: 短信
 * @Author: tanyp
 * @Date: 2021/6/7 10:56
 **/
public interface SmsService {
	/**
	 * @MonthName: send
	 * @Description: 发短信
	 * @Author: tanyp
	 * @Date: 2021/6/7 14:50
	 * @Param: [dto]
	 * @return: com.tanersci.vo.MessageVo
	 **/
	MessageVo send(SmsMessageDto dto);
	 * @MonthName: addSmsTemplate
	 * @Description: 申请短信模板
	 * @Param: [template]
	MessageVo addSmsTemplate(SmsTemplateDto template);
	 * @MonthName: deleteSmsTemplate
	 * @Description: 删除短信模板
	MessageVo deleteSmsTemplate(SmsTemplateDto template);
	 * @MonthName: modifySmsTemplate
	 * @Description: 修改未通过审核的短信模板
	MessageVo modifySmsTemplate(SmsTemplateDto template);
	 * @MonthName: querySmsTemplate
	 * @Description: 查询短信模板的审核状态
	MessageVo querySmsTemplate(SmsTemplateDto template);
}

2.2、SmsServiceImpl.java

package com.tanersci.service.impl;

import com.alibaba.fastjson.JSON;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.*;
import com.aliyun.teaopenapi.models.Config;
import com.tanersci.dto.SmsMessageDto;
import com.tanersci.dto.SmsTemplateDto;
import com.tanersci.vo.MessageVo;
import com.tanersci.config.SmsConfig;
import com.tanersci.constant.Constants;
import com.tanersci.service.SmsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.UUID;
/**
 * @ClassName: SmsServiceImpl.java
 * @ClassPath: com.tanersci.service.impl.SmsServiceImpl.java
 * @Description: 短信
 * @Author: tanyp
 * @Date: 2021/6/7 10:57
 **/
@Slf4j
@Service
public class SmsServiceImpl implements SmsService {
	@Autowired
	private SmsConfig smsConfig;
	/**
	 * @MonthName: createClient
	 * @Description: SK初始化账号Client
	 * @Author: tanyp
	 * @Date: 2021/6/7 15:44
	 * @Param: [accessId, accessKey, endpoint]
	 * @return: com.aliyun.teaopenapi.Client
	 **/
	public Client createClient() throws Exception {
		Config config = new Config();
		config.accessKeyId = smsConfig.getAccessId();
		config.accessKeySecret = smsConfig.getAccessKey();
		config.endpoint = smsConfig.getEndpoint();
		return new Client(config);
	}
	 * @MonthName: send
	 * @Description: 发短信
	 * @Date: 2021/6/7 14:50
	 * @Param: [dto]
	 * @return: com.tanersci.vo.MessageVo
	@Override
	public MessageVo send(SmsMessageDto dto) {
		try {
			log.info("======发送短信开始,请求参数:{}", JSON.toJSON(dto));
			Client client = createClient();
			// 组装请求对象
			SendSmsRequest request = new SendSmsRequest();
			// 外部流水扩展字段
			String outId = UUID.randomUUID().toString();
			request.setOutId(outId);
			// 支持对多个手机号码发送短信,手机号码之间以英文逗号(,)分隔。上限为1000个手机号码。批量调用相对于单条调用及时性稍有延迟。
			request.setPhoneNumbers(dto.getPhone());
			// 短信签名名称
			request.setSignName(smsConfig.getSignName());
			// 短信模板ID
			request.setTemplateCode(dto.getTemplateCode());
			// 短信模板变量对应的实际值,JSON格式。如果JSON中需要带换行符,请参照标准的JSON协议处理。
			request.setTemplateParam(JSON.toJSONString(dto.getParam()));
			// 发送短信
			SendSmsResponse res = client.sendSms(request);

			MessageVo message = MessageVo.builder().build();
			if (Objects.equals(Constants.NEWS_SUCCESS_CODE, res.body.getCode())) {
				log.info("======发送短信成功,返回值:{}", JSON.toJSON(res.body));
				message.setCode(Constants.NEWS_SUCCESS_CODE);
				message.setMessage(Constants.NEWS_SUCCESS_MESSAGE);
			} else {
				log.info("======发送短信失败,返回值:{}", JSON.toJSON(res.body));
				message.setCode(Constants.NEWS_FAIL_CODE);
				message.setMessage(Constants.NEWS_FAIL_MESSAGE);
			}
			return message;
		} catch (Exception e) {
			log.error("======发送短信异常:{}", e.getMessage());
			e.printStackTrace();
			return MessageVo.builder().code(Constants.NEWS_FAIL_CODE).message(Constants.NEWS_FAIL_MESSAGE).build();
		}
	 * @MonthName: addSmsTemplate
	 * @Description: 申请短信模板
	 * @Param: [template]
	public MessageVo addSmsTemplate(SmsTemplateDto template) {
			log.info("======申请短信模板,请求参数:{}", JSON.toJSON(template));
			AddSmsTemplateRequest request = new AddSmsTemplateRequest();
			request.setTemplateType(template.getTemplateType());
			request.setTemplateName(template.getTemplateName());
			request.setTemplateContent(template.getTemplateContent());
			request.setRemark(template.getRemark());
			AddSmsTemplateResponse res = client.addSmsTemplate(request);
			if (Objects.equals(TeamConstants.NEWS_SUCCESS_CODE, res.body.getCode())) {
				log.info("======申请短信模板,返回值:{}", JSON.toJSON(res.body));
				return MessageVo.builder()
						.code(Constants.NEWS_SUCCESS_CODE)
						.message(Constants.NEWS_SUCCESS_MESSAGE)
						.templateCode(res.getBody().templateCode)
						.build();
				return MessageVo.builder().code(Constants.NEWS_FAIL_CODE).message(Constants.NEWS_FAIL_MESSAGE).build();
			log.error("======申请短信模板,异常:{}", e.getMessage());
	 * @MonthName: deleteSmsTemplate
	 * @Description: 删除短信模板
	public MessageVo deleteSmsTemplate(SmsTemplateDto template) {
			log.info("======删除短信模板,请求参数:{}", JSON.toJSON(template));
			DeleteSmsTemplateRequest request = new DeleteSmsTemplateRequest();
			request.setTemplateCode(template.getTemplateCode());
			DeleteSmsTemplateResponse res = client.deleteSmsTemplate(request);
				log.info("======删除短信模板,返回值:{}", JSON.toJSON(res.body));
				return MessageVo.builder().code(Constants.NEWS_SUCCESS_CODE).message(Constants.NEWS_SUCCESS_MESSAGE).build();
			log.error("======删除短信模板,异常:{}", e);
	 * @MonthName: modifySmsTemplate
	 * @Description: 修改未通过审核的短信模板
	public MessageVo modifySmsTemplate(SmsTemplateDto template) {
			log.info("======修改未通过审核的短信模板,请求参数:{}", JSON.toJSON(template));
			ModifySmsTemplateRequest request = new ModifySmsTemplateRequest();
			ModifySmsTemplateResponse res = client.modifySmsTemplate(request);
				log.info("======修改未通过审核的短信模板,返回值:{}", JSON.toJSON(res.body));
			log.error("======修改未通过审核的短信模板,异常:{}", e.getMessage());
	 * @MonthName: querySmsTemplate
	 * @Description: 查询短信模板的审核状态
	public MessageVo querySmsTemplate(SmsTemplateDto template) {
			log.info("======查询短信模板的审核状态,请求参数:{}", JSON.toJSON(template));
			QuerySmsTemplateRequest request = new QuerySmsTemplateRequest();
			QuerySmsTemplateResponse res = client.querySmsTemplate(request);
				log.info("======查询短信模板的审核状态,返回值:{}", JSON.toJSON(res.body));
			log.error("======查询短信模板的审核状态,异常:{}", e.getMessage());
}

2.3、SmsConfig.java

package com.tanersci.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
/**
 * @ClassName: SmsConfig.java
 * @ClassPath: com.tanersci.config.SmsConfig.java
 * @Description: 短信配置
 * @Author: tanyp
 * @Date: 2021/6/7 16:41
 **/
@Data
@Component
public class SmsConfig {
	@Value("${sms.access-id}")
	private String accessId;
	@Value("${sms.access-key}")
	private String accessKey;
	@Value("${sms.sign-name}")
	private String signName;
	@Value("${sms.endpoint}")
	private String endpoint;
}

2.4、VO、DTO类

MessageVo 同用邮件的

MailMessageDto.java

package com.tanersci.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
 * @ClassName: MailMessageDto.java
 * @ClassPath: com.tanersci.dto.SmsMessageDto.java
 * @Description: 短信
 * @Author: tanyp
 * @Date: 2021/6/7 9:20
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel(value = "短信消息")
public class SmsMessageDto implements Serializable {
	private static final long serialVersionUID = 3427970548460798908L;
	@ApiModelProperty(value = "手机号,多个以逗号隔开")
	private String phone;
	@ApiModelProperty(value = "模板编码")
	private String templateCode;
	@ApiModelProperty(value = "模板参数")
	private TemplateParamDto param;
	private String code;
}

SmsTemplate.java

package com.tanersci.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
 * @ClassName: SmsTemplate.java
 * @ClassPath: com.tanersci.dto.SmsTemplateDto.java
 * @Description: 短信模板
 * @Author: tanyp
 * @Date: 2021/6/7 15:02
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SmsTemplateDto implements Serializable {
	private static final long serialVersionUID = -8909531614461840038L;
	/**
	 * 模板类型:0:验证码,1:短信通知,2:推广短信,3:国际/港澳台消息。
	 */
	private Integer templateType;
	 * 模板名称,长度为1~30个字符
	private String templateName;
	 * 模板内容,长度为1~500个字符
	private String templateContent;
	 * 短信模板CODE
	private String templateCode;
	 * 短信模板申请说明。请在申请说明中描述您的业务使用场景,长度为1~100个字符
	private String remark;
}

注意

项目中使用lombok插件和swagger依赖,无相关依赖的请自行修改。

到此这篇关于SpringBoot 集成短信和邮件的文章就介绍到这了,更多相关SpringBoot 集成短信和邮件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot2.x 集成腾讯云短信的详细流程

    一.腾讯云短信简介 腾讯云短信(Short Message Service,SMS)沉淀腾讯十多年短信服务技术和经验,为QQ.微信等亿级平台和10万+客户提供快速灵活接入的高质量的国内短信与国际/港澳台短信服务. 国内短信验证秒级触达,99%到达率. 国际/港澳台短信覆盖全球200+国家/地区,稳定可靠. 单次短信的业务请求流程如下所示: 短信由签名和正文内容组成,发送短信前需要申请短信签名和正文内容模板.短信签名是位于短信正文前[]中的署名,用于标识公司或业务.短信签名需要审核通过后才可使用.

  • 关于springboot集成阿里云短信的问题

    目录 1.获取签名与模板 2.编写模板与签名的枚举类 3.配置类 4.测试类 ​ 1.获取签名与模板 进入阿里云平台,进入短信服务模块,在以下位置添加签名和模板(格式一定按照要求填写 审批的比较严格) 2.编写模板与签名的枚举类 在上文获取模板与签名成功后,并作为常量放在枚举类中. public enum DySmsEnum { /** * 本类此处需要修改(短信模板编码,签名,参数) */ LOGIN_TEMPLATE_CODE("SMS_187570276", "自定义软

  • SpringBoot集成E-mail发送各种类型邮件

    SpringBoot 集成 E-mail发送邮件,供大家参考,具体内容如下 JDK本身有自带发送邮件api,加上SpringBoot在进行封装,使得现在使用起来十分快速简洁. 话不多说,参考纯洁的微笑博客,更改jar版本为2.0.4 开干,基本没什么坑. 就是配置邮箱账号密码是,如果是qq邮箱,需要开启PO30和STMP服务,并且获取临时授权码. 开启服务链接: https://mail.qq.com/cgi-bin/frame_html?sid=a5ZSbreeNm9pHyl1&r=a8322

  • SpringBoot基础教程之集成邮件服务

    一.前言 Spring Email 抽象的核心是 MailSender 接口,MailSender 的实现能够把 Email 发送给邮件服务器,由邮件服务器实现邮件发送的功能. Spring 自带了一个 MailSender 的实现 JavaMailSenderImpl,它会使用 JavaMail API 来发送 Email.Spring 或 SpringBoot 应用在发送 Email 之前,我们必须要 JavaMailSenderImpl 装配为 Spring应用上下文的一个 bean. 二

  • SpringBoot 集成短信和邮件的配置示例详解

    目录 依赖 配置 编码 1.邮件 2.短信 准备工作 1.集成邮件 以QQ邮箱为例 在发送邮件之前,要开启POP3和SMTP协议,需要获得邮件服务器的授权码,获取授权码: 1.设置>账户 在账户的下面有一个开启SMTP协议的开关并进行密码验证: 2.获取成功的授权码 2.集成短信 以阿里云短信服务为例 1.登陆阿里云—>进入控制台—>开通短信服务 进入后根据提示开通短信服务即可. 2.充值 后期发短信测试需要,暂时可以跳过此步骤. 3.获取AccessKey和AccessSercet 文

  • SpringBoot集成POI实现Excel导入导出的示例详解

    目录 知识准备 什么是POI POI中基础概念 实现案例 Pom依赖 导出Excel 导入Excel 示例源码 知识准备 需要了解POI工具,以及POI对Excel中的对象的封装对应关系. 什么是POI Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能.POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”. A

  • Springboot集成Spring Security实现JWT认证的步骤详解

    1 简介 Spring Security作为成熟且强大的安全框架,得到许多大厂的青睐.而作为前后端分离的SSO方案,JWT也在许多项目中应用.本文将介绍如何通过Spring Security实现JWT认证. 用户与服务器交互大概如下: 客户端获取JWT,一般通过POST方法把用户名/密码传给server: 服务端接收到客户端的请求后,会检验用户名/密码是否正确,如果正确则生成JWT并返回:不正确则返回错误: 客户端拿到JWT后,在有效期内都可以通过JWT来访问资源了,一般把JWT放在请求头:一次

  • python案例中Flask全局配置示例详解

    目录 WEB服务全局配置 Flask全局配置 before_request after_request Flask自定义中间件 WEB服务全局配置 在目前的开发过市场当中,有很多WEB服务框架,Flask只是其中之一,但是总体上来看,所有的WEB框架都是依据HTTP协议的逻辑从请求到响应设计的.固然有很多功能是独立的,但是也有一部分功能需要全局设定,比如安全校验,比如埋点日志,那么这里就用到了全局配置. 所谓的全局配置,就是在框架全局,请求前后,响应前后,设置的全局配置,比如登录校验,这个功能并

  • axios中cookie跨域及相关配置示例详解

    前言 最近在跨域.cookie 以及表单上传这几个方面遇到了点小问题,做个简单探究和总结.本文主要介绍了关于axios中cookie跨域及相关配置的相关内容,下面话不多说了,来一起看看详细的介绍吧. 1. 带cookie请求 - 画个重点 axios默认是发送请求的时候不会带上cookie的,需要通过设置withCredentials: true来解决. 这个时候需要注意需要后端配合设置: header信息 Access-Control-Allow-Credentials:true Access

  • jQuery短信验证倒计时功能实现方法详解

    本文实例讲述了jQuery短信验证倒计时功能实现方法.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > &l

  • springboot配置文件抽离 git管理统 配置中心详解

    springboot配置文件抽离,便于服务器读取对应配置文件,避免项目频繁更改配置文件,影响项目的调试与发布 1.创建统一配置中心项目conifg 1)pom配置依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</ver

  • vue实现短信验证码登录功能(流程详解)

    无论是移动端还是pc端登录或者注册界面都会见到手机验证码登录这个功能,输入手机号,得到验证码,最后先服务器发送请求,保存登录的信息,一个必不可少的功能 思路 1,先判断手机号和验证是否为空, 2,点击发送验证码,得到验证码 3,输入的验证码是否为空和是否正确, 4,最后向服务发送请求 界面展示 1.准备工作 这个会对input进行封装处理 <template> <div class="text_group"> <div class="input_

  • Spring Security登录表单配置示例详解

    目录 Spring Security登录表单配置 1.引入pom依赖 2.bootstrap.yml添加配置 3.创建login.html 4.创建配置类 5.配置细节 6.登陆成功 7.登陆失败 8.注销登录 Spring Security登录表单配置 1.引入pom依赖 ​ 创建一个Spring Boot工程,引入Web和Spring Security依赖: <?xml version="1.0" encoding="UTF-8"?> <pro

  • 一文看懂springboot实现短信服务功能

    前言 上一篇讲了springboot 集成邮件服务,接下来让我们一起学习下springboot项目中怎么使用短信服务吧. 项目中的短信服务基本上上都会用到,简单的注册验证码,消息通知等等都会用到.所以我这个脚手架也打算将短息服务继承进来. 短息服务我使用的平台是阿里云的.网上有很多的短信服务提供商.大家可以根据自己的需求进行选择. 准备工作 在阿里云上开通服务,以及进行配置.这些阿里云官方文档都写的很清楚,怎么做就不细说的,大家可以参考一下这篇文章: https://www.jb51.net/a

随机推荐