Java腾讯云发送邮件

准备

  • 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;
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值