返回
Featured image of post 身份验证

身份验证

发送邮件与手机验证码

前言

邮件类型 特点
简单邮件 不能解析html语言,发送的为原本文本,不能加附件发送
复杂邮件 可以选择是否解析html语言,能加附件发送

依赖

邮件配置的


手机短信的

目录

发送邮件

申请邮件授权码(这里是qq的)

applicaton配置

1.qq邮箱的配置

2.163邮箱的配置

其它邮箱的配置只要改对应的host那些就行

简单邮件发送

  @Autowired
    JavaMailSenderImpl MailSender;
 @Test
    void contextLoads() {
        //建简单邮件对象
        SimpleMailMessage MailMessage = new SimpleMailMessage();
        //邮件设置
        MailMessage.setSubject("我是邮件标题-来了");  //标题
        MailMessage.setText("我是邮件内容-来了");        //邮件内容
        MailMessage.setTo("接受者qq@qq.com");  //发给谁
        MailMessage.setFrom("发送者qq@qq.com");//谁发的
        MailSender.send(MailMessage);

    }

复杂邮件发送

1.这部分用的是模板可看发送邮件自定义模板

  @Autowired
    JavaMailSenderImpl MailSender;

    //thymeleaf解析器
    @Autowired
    private TemplateEngine templateEngine;

@Test
void SendMail() throws MessagingException {
	//是可自定义对象
    Message message =new Message("ai",11);
    //创建邮件正文
    Context context = new Context();
    //设置邮件模板内可变参数(message是一个对象)
    context.setVariable("message", message);
    //替换字符串
    String content = "http";
    String replace = content.replace("http","https://xxx/1.png");
    //放入context
    context.setVariable("image", replace);
    context.setVariable("sendTime", new Date());
    //用于解析模板并利用当前response对象的writer把模板输出到浏览器(返回值是html文件包括变量的)
    //用带参数的context改变a.html(用thymeleaf语法)返回的是改变了的html
    String emailContent = templateEngine.process("a", context);

2.用MailSender.createMimeMessage(),创建复杂邮件对象–与简单邮件不同处

    //建复杂邮件对象
    MimeMessage mimeMessage =MailSender.createMimeMessage();
    //true表示需要创建一个multipart message
    MimeMessageHelper helpr=new MimeMessageHelper(mimeMessage,true);
    //邮件设置
    helpr.setSubject("我是邮件标题-来了");

3.这里可以选是否解析html代码

    helpr.setText(emailContent,true);   //设置其为会解析html
    helpr.setTo("接受者qq@qq.com");  //发给谁
    helpr.setFrom("发送者qq@qq.com");//谁发的

    //上传文件
    helpr.addAttachment("1.png",new File("C:\\Users\\12113\\Desktop\\1.png"));

    MailSender.send(mimeMessage);

}


发送邮件自定义模板
1.先用thymeleaf的Context容器放入参数

  @Autowired
    JavaMailSenderImpl MailSender;

    //thymeleaf解析器
    @Autowired
    private TemplateEngine templateEngine;

@Test
void SendMail() throws MessagingException {
	//是可自定义对象
    Message message =new Message("ai",11);
    //创建邮件正文
    Context context = new Context();
    //设置邮件模板内可变参数(message是一个对象)
    context.setVariable("message", message);
    //替换字符串
    String content = "http";
    String replace = content.replace("http","https://xxx/6.png");
    //放入context
    context.setVariable("image", replace);
    context.setVariable("sendTime", new Date());
    

1.在将Context放入TemplateEngine引擎里,这里的返回值是接收了参数的a.html的字符串

//用于解析模板并利用当前response对象的writer把模板输出到浏览器(返回值是html文件包括变量的)
    //用带参数的context改变a.html(用thymeleaf语法)返回的是改变了的html
    String emailContent = templateEngine.process("a", context);

注意:这里要个a.html在templates有才能访问到

<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
<h>你好,[[${message.name}]],您今年[[${message.age}]]</h>
<img class="avatar1" width="80" height="80" th:src="@{${image}}" >
现在时间:<th th:text="${sendTime}"></th>
</body>
</html>

使用模板的注意事项

1.在类里自动注入TemplateEngine,这个类也应是自动注入的(如下)
这个是config层的
这个是controller层的

手机验证码

初始化

1.先去阿里云申请(要登入),点这里跳转

2.点击

3.创建并记下AccesKey ID和AccessKeySecret

4.在XX管理那里,添加签名和添加模板,记住签名与模板名称

配置
1.需要用到的application.yml有这4个

#手机短信相关配置
sms:
  accessKeyId: LTAI4Fku38EbzFCDdL9Sy6RD
  accessKeySecret: XXXXXXXXXXXXXXXX
  signName: X博客 # 签名名称
  verifyCodeTemplate: SMS_183195163 # 模板名称

设置http超时与id和Secret
1.System.setProperty的这两个参数在第一次连接时设置,并且会被缓存,在程序不关的情况下,再次访问,还是以第一次的结果为准

//产品名称:云通信短信API产品,开发者无需替换
    static final String product = "Dysmsapi";
    //产品域名,开发者无需替换
    static final String domain = "dysmsapi.aliyuncs.com";
@Test
    void sms()throws ClientException{
    //可自助调整超时时间-设置http的超时
    System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
    System.setProperty("sun.net.client.defaultReadTimeout", "10000");
    //初始化acsClient,暂不支持region化
    //keyId和keySecret
    IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou",
            "你自己的AccessKeyId", "你自己的AccessKeySecret");

固定部分

    //product = "Dysmsapi",domain = "dysmsapi.aliyuncs.com"
    DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
    //放入IClientProfile
    IAcsClient acsClient = new DefaultAcsClient(profile);

填发送对象手机号短信签名与短信模板

    //组装请求对象-具体描述见控制台-文档部分内容
    SendSmsRequest request = new SendSmsRequest();
    request.setMethod(MethodType.POST);
    //必填:待发送手机号
    request.setPhoneNumbers("发送对象手机号");
    //必填:短信签名-在application
    request.setSignName("自己的短信签名");
    //必填:短信模板-在application
    request.setTemplateCode("自己的短信模板");

用json形的字符串改短信模板中的参数


    //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为:${code}"时,此处的值为
    //这里的模板是{"code":"2333"}  是json写法会加载到自定义里的${code}
    //亲爱的${name},您的验证码为2333
    //todo :手机模板写法
    request.setTemplateParam("{\"code\":\"" + "2333" + "\"}");

    //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
    //request.setSmsUpExtendCode("90997");

    //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
    request.setOutId("123456");

    //hint 此处可能会抛出异常,注意catch(成功返回值可取sendSmsResponse.getCode()短信状态,sendSmsResponse.getMessage()短信消息)
    SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy