准备
- github官方SDK,其他的依赖版本试过用不了,下面这个可以用。
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. -->
<!-- 请到https://search.maven.org/search?q=tencentcloud-sdk-java查询所有版本,最新版本如下 -->
<version>3.1.742</version>
</dependency>
- application.properties
#区域一定要选对
tencent.sms.region=ap-hongkong
tencent.sms.secret_id=
tencent.sms.secret_key=
tencent.sms.endpoint=ses.tencentcloudapi.com
tencent.sms.sms_sdk_app_id=
tencent.sms.register_template_id=75530
tencent.sms.forget_password_template_id=75531
tencent.sms.expired_time=5
tencent.sms.from_email=admin@mail.myxls.cn
- 常量类EmailConfigConstants
package com.example.demo.constants;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class EmailConfigConstants implements InitializingBean {
@Value("${tencent.sms.region}")
private String region;
@Value("${tencent.sms.secret_id}")
private String secretId;
@Value("${tencent.sms.secret_key}")
private String secretKey;
@Value("${tencent.sms.endpoint}")
private String endpoint;
@Value("${tencent.sms.register_template_id}")
private Long registerTemplateId;
@Value("${tencent.sms.forget_password_template_id}")
private Long forgetPasswordTemplateId;
@Value("${tencent.sms.from_email}")
private String fromEmail;
private String registerSubject = "系统用户注册";
private String forgetPasswordSubject = "系统用户忘记密码";
public static String REGION;
public static String SECRET_ID;
public static String SECRET_KEY;
public static String ENDPOINT;
public static String FROM_EMAIL;
public static Long FORGET_PASSWORD_TEMPLATE_ID;
public static Long REGISTER_TEMPLATE_ID;
public static String REGISTER_SUBJECT;
public static String FORGET_PASSWORD_SUBJECT;
@Override
public void afterPropertiesSet() throws Exception {
REGION = region;
SECRET_ID = secretId;
SECRET_KEY = secretKey;
ENDPOINT = endpoint;
FROM_EMAIL = fromEmail;
FORGET_PASSWORD_TEMPLATE_ID = forgetPasswordTemplateId;
REGISTER_TEMPLATE_ID = registerTemplateId;
REGISTER_SUBJECT = registerSubject;
FORGET_PASSWORD_SUBJECT = forgetPasswordSubject;
}
}
实现代码
使用策略模式实现
邮箱服务接口EmailService
package com.example.demo.service.training;
import com.example.demo.enums.SendEmailUseEnum;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
public interface EmailService {
void sendEmail(String code, String to) throws TencentCloudSDKException;
SendEmailUseEnum getUse();
}
忘记密码邮箱实现类ForgetPasswordEmail
package com.example.demo.service.training;
import com.example.demo.constants.EmailConfigConstants;
import com.example.demo.enums.SendEmailUseEnum;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.ses.v20201002.SesClient;
import com.tencentcloudapi.ses.v20201002.models.SendEmailRequest;
import com.tencentcloudapi.ses.v20201002.models.Template;
import org.springframework.stereotype.Service;
/**
* @author Capital Letters
* @title: ForgetPasswordEmail
* @projectName oj-homework
* @description: TODO
* @date 2023/4/2016:49
*/
@Service
public class ForgetPasswordEmail implements EmailService{
@Override
public void sendEmail(String code, String to) throws TencentCloudSDKException {
Credential cred = new Credential(EmailConfigConstants.SECRET_ID, EmailConfigConstants.SECRET_KEY);
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint(EmailConfigConstants.ENDPOINT);
// 实例化一个client选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
SesClient client = new SesClient(cred, EmailConfigConstants.REGION, clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
SendEmailRequest req = new SendEmailRequest();
Template template = new Template();
template.setTemplateID(EmailConfigConstants.FORGET_PASSWORD_TEMPLATE_ID);
template.setTemplateData("{\"mailverifycode\":\"" + code + "\"}");
req.setDestination(new String[]{to});
req.setTemplate(template);
req.setFromEmailAddress(EmailConfigConstants.FROM_EMAIL);
req.setSubject(EmailConfigConstants.FORGET_PASSWORD_SUBJECT);
// 返回的resp是一个SendEmailResponse的实例,与请求对象对应
client.SendEmail(req);
}
@Override
public SendEmailUseEnum getUse() {
return SendEmailUseEnum.FORGET;
}
}
新用户注册邮箱实现类RegisterEmail
package com.example.demo.service.training;
import com.example.demo.constants.EmailConfigConstants;
import com.example.demo.enums.SendEmailUseEnum;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.ses.v20201002.SesClient;
import com.tencentcloudapi.ses.v20201002.models.SendEmailRequest;
import com.tencentcloudapi.ses.v20201002.models.Template;
import org.springframework.stereotype.Service;
/**
* @author Capital Letters
* @title: ForgetPasswordEmail
* @projectName oj-homework
* @description: TODO
* @date 2023/4/2016:49
*/
@Service
public class RegisterEmail implements EmailService{
@Override
public void sendEmail(String code, String to) throws TencentCloudSDKException {
Credential cred = new Credential(EmailConfigConstants.SECRET_ID, EmailConfigConstants.SECRET_KEY);
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint(EmailConfigConstants.ENDPOINT);
// 实例化一个client选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
SesClient client = new SesClient(cred, EmailConfigConstants.REGION, clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
SendEmailRequest req = new SendEmailRequest();
Template template = new Template();
template.setTemplateID(EmailConfigConstants.REGISTER_TEMPLATE_ID);
template.setTemplateData("{\"mailverifycode\":\"" + code + "\"}");
req.setDestination(new String[]{to});
req.setTemplate(template);
req.setFromEmailAddress(EmailConfigConstants.FROM_EMAIL);
req.setSubject(EmailConfigConstants.REGISTER_SUBJECT);
// 返回的resp是一个SendEmailResponse的实例,与请求对象对应
client.SendEmail(req);
}
@Override
public SendEmailUseEnum getUse() {
return SendEmailUseEnum.REGISTER;
}
}
枚举类SendEmailUseEnum
package com.example.demo.enums;
public enum SendEmailUseEnum {
REGISTER("R", "注册"),
FORGET("F", "忘记密码");
private String code;
private String desc;
SendEmailUseEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
}
Controller
@Autowired
private List<EmailService> emailServices;
@PostMapping("/sendEmail")
public ResponseDto sendEmail(@RequestParam("email") String email, @RequestParam("use") String use) throws BusinessException {
ResponseDto responseDto = new ResponseDto();
String verifyCode = UuidUtil.getVerifyCode();
List<EmailService> emailServiceList = emailServices.stream().filter(o -> o.getUse().getCode().equals(use)).collect(Collectors.toList());
try {
emailServiceList.get(0).sendEmail(verifyCode, email);
redisTemplate.opsForValue().set(email, verifyCode, 300, TimeUnit.SECONDS);
} catch (TencentCloudSDKException e) {
LOGGER.error("发送邮件异常...");
responseDto.setMessage(e.toString());
responseDto.setSuccess(false);
} finally {
return responseDto;
}
}