加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java发送邮箱验证码、session校验功能

发布时间:2020-12-15 07:51:19 所属栏目:Java 来源:网络整理
导读:1、引入的jar包是mail-1.4.jar 2、java底层发送邮箱方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 public boolean sendEMail(MapString,Object map)

1、引入的jar包是mail-1.4.jar

2、java底层发送邮箱方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public boolean sendEMail(Map<String,Object> map) {
???? log.info( "電子郵件接口執行開始!" );
???? String from = Cache.getInstance().getParamsConstant.EMAIL_FROM);
???? String pwd = Cache.getInstance().getParams(Constant.EMAIL_PWD);
???? String to = String.valueOf(map.get( "mail" ));
???? String subject = String.valueOf(map.get( "subject" ));
???? String content = String.valueOf(map.get( "content" ));
???? String smtpHost = Cache.getInstance().getParams(Constant.EMAIL_SMTPHOST);
???? if (StringUtils.isBlank(to) || StringUtils.isBlank(subject) || StringUtils.isBlank(content)){
?????? log.info( "郵件地址(" +to+ ")、主題(" +subject+ ")、內容(" +content+ ")有為空項,不符合發送條件" );
?????? return false ;
???? }
???? try {
??????? Properties props = new Properties();
??????? props.setProperty( "mail.transport.protocol" , "smtp" ); // 使用的协议(JavaMail规范要求)
??????? props.setProperty( "mail.smtp.host" ,smtpHost); // 发件人的邮箱的 SMTP服务器地址
??????? props.setProperty( "mail.smtp.auth" , "true" ); // 请求认证,参数名称与具体实现有关
??????? // 创建Session实例对象
??????? Session session = Session.getDefaultInstance(props);
??????? // 创建MimeMessage实例对象
??????? MimeMessage message = new MimeMessage(session);
??????? // 设置发件人
??????? message.setFrom( new InternetAddress(from));
??????? // 设置收件人
??????? message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
??????? // 设置发送日期
??????? message.setSentDate( new Date());
??????? // 设置邮件主题
??????? message.setSubject(subject);
??????? // 设置纯文本内容的邮件正文
??????? message.setText(content);
??????? // 保存并生成最终的邮件内容
??????? message.saveChanges();
??????? // 设置为debug模式,可以查看详细的发送 log
??????? session.setDebug( true );
??????? // 获取Transport对象
??????? Transport transport = session.getTransport( "smtp" );
??????? // 第2个参数需要填写的是QQ邮箱的SMTP的授权码,什么是授权码,它又是如何设置?
??????? transport.connect(from,pwd);
??????? // 发送,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人,抄送人,密送人
??????? transport.sendMessage(message,message.getAllRecipients());
??????? transport.close();
???? } catch (Exception e){
?????? log.error(e.getMessage(),e);
?????? return false ;
???? }
???? log.info( "電子郵件接口執行完成,執行成功!" );
???? return true ;
?? }

3、java业务逻辑层调用发送邮箱、验证码加密存储在session中

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
@RequestMapping ( "/sendEMail.do" )
?? public void sendEMail(HttpServletRequest request,HttpServletResponse response) {
???? String json = "{"success":false,"message":"操作失败","returnVal":""}" ;
???? boolean res = false ; //发送邮件标记
???? Map<String,Object> map = new HashMap<String,Object>();
???? try {
?????? String username = request.getParameter( "username" );
?????? User user = this .userService.findUserByLoginname(username);
?????? if ( null == user){
???????? json = "{"success":false,"message":"无此人员","returnVal":""}" ;
???????? return ;
?????? }
?????? //获取当前绑定邮箱地址
?????? String mail = user.getEmail();
?????? //验证邮箱地址
?????? if (StringUtils.isBlank(mail) || "null" .equals(mail)){
???????? json = "{"success":false,"message":"当前用户尚未绑定邮箱","returnVal":""}" ;
???????? return ;
?????? }
?????? //生成验证码
?????? String checkcode = Common.getCode();
?????? //发送验证码
?????? String _debug = Cache.getInstance().getParams(Constant.UIAS_DEBUG);
?????? if ( "1" .equals(_debug)){ //调试模式 不真发送 直接回显
???????? map.put( "checkcode" ,checkcode);
???????? res = true ;
?????? } else { //非调试模式 真实发送邮件
???????? //验证是否频繁发送验证码请求? 单位 秒
???????? String intervalTime = Cache.getInstance().getParams(Constant.EMAIL_INTERVAL_TIME);
???????? Object emailTimeFlag = request.getSession().getAttribute( "emailTimeFlag" );
???????? boolean checkTime = true ;
???????? if (emailTimeFlag != null ) {
?????????? int miao = ( int ) ((( new Date()).getTime() - (Long) emailTimeFlag) / 1000 );
?????????? if (miao <= Integer.parseInt(intervalTime)) {
???????????? checkTime= false ;
?????????? }
???????? }
???????? if (checkTime){
?????????? //组装数据
?????????? String email_validity = Cache.getInstance().getParams(Constant.EMAIL_VALIDITY);
?????????? String vartime= String.valueOf((Integer.parseInt(email_validity)/ 60000 ));
?????????? String content = Cache.getInstance().getParams(Constant.EMAIL_CONTENT);
?????????? String subject = Cache.getInstance().getParams(Constant.EMAIL_SUBJECT);
?????????? content = content.replaceAll( "$code" ,checkcode);
?????????? content = content.replaceAll( "$time" ,vartime);
?????????? map.put( "mail" ,mail);
?????????? map.put( "subject" ,subject);
?????????? map.put( "content" ,content);
?????????? //调用发送
?????????? res = ieMailService.sendEMail(map);
???????? } else {
?????????? json = "{"success":false,"message":"请耐心等待,不要频繁发送验证码申请","returnVal":""}" ;
?????????? return ;
???????? }
?????? }
?????? //发送成功后续操作
?????? if (res){
???????? //把验证时间放在session里
???????? request.getSession().setAttribute( "emailTimeFlag" , new Date().getTime());
???????? //把验证码放在session里? md5 2次加密验证码
???????? String codeMd5 = DigestUtils.md5Hex((DigestUtils.md5Hex(checkcode).toLowerCase()));
???????? request.getSession().setAttribute( "emailCodeFlag" ,codeMd5);
???????? if ( "1" .equals(_debug)){
?????????? json = "{"success":true,"message":"邮箱验证码发送成功,已经待填到验证码框!","returnVal":"","checkcode":"" +checkcode+ ""}" ;
???????? } else {
?????????? json = "{"success":true,"message":"邮箱验证码发送成功,请查收邮件!","returnVal":""}" ;
???????? }
?????? }
???? } catch (Exception e) {
?????? logger.error( "发送邮件验证码异常" ,e);
???? } finally {
?????? renderHtml(response,json, "encoding:UTF-8" );
???? }
?? }

?4、java验证邮箱,比对session中的验证码和提交上来的验证码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@RequestMapping ( "/check.do" )
?? public void check(HttpServletRequest request,"returnVal":""}" ;
???? try {
?????? //验证码有效期校验
?????? String email_validity = Cache.getInstance().getParams(Constant.EMAIL_VALIDITY);
?????? Object emailTimeFlag = request.getSession().getAttribute( "emailTimeFlag" );
?????? if (emailTimeFlag != null ) {
???????? int miao = ( int ) ((( new Date()).getTime() - (Long) emailTimeFlag) / 1000 );
???????? if (miao >= Integer.parseInt(email_validity)) {
?????????? json = "{"success":false,"message":"验证码已过有效期,请重新获取!","returnVal":""}" ;
???????? } else {
?????????? //在有效期内 比对验证码准确性
?????????? String checkcode = request.getParameter( "checkcode" );
?????????? // md5 2次加密验证码
?????????? String codeMd5 = DigestUtils.md5Hex((DigestUtils.md5Hex(checkcode).toLowerCase()));
?????????? Object emailCodeFlag = request.getSession().getAttribute( "emailCodeFlag" );
?????????? boolean res = codeMd5.equals(String.valueOf(emailCodeFlag));
?????????? if (res){
???????????? json = "{"success":true,"message":"验证码通过!","returnVal":""}" ;
?????????? } else {
???????????? json = "{"success":false,"message":"验证码不匹配,请重新核对!","returnVal":""}" ;
?????????? }
???????? }
?????? }
???? } catch (Exception e) {
?????? logger.error( "验证码异常" ,e);
???? } finally {
?????? renderHtml(response, "encoding:UTF-8" );
???? }
?? }

5、小插曲,java处理要展示到页面的邮箱和手机号加*号隐藏的正则表达式

?
1
2
3
4
// 括号表示组,被替换的部分$n表示第n组的内容
???????? mail = mail.replaceAll( "(w?)(w+)(w)(@w+.[a-z]+(.[a-z]+)?)" , "$1****$3$4" );
// 括号表示组,被替换的部分$n表示第n组的内容
???????? phone = phone.replaceAll( "(d{3})d{4}(d{4})" , "$1****$2" );

6、HTML 获取验证码按钮?????????????????

?
1
<input id= "btnMail" type= "button" onclick= "start_mail_button();" value= "获取邮件验证码" />

7、js 函数调用? 按钮60秒倒计时

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//获取邮箱验证码
function start_mail_button(){
?? var username = $( ‘#username‘ ).val().trim(); //用戶名
?? if ( ‘‘ == username){
???? ErrorMsg( "请输入用户名" );
???? return ;
?? }
?? $.ajax({
???? url: basePath+ ‘/sendEMail.do‘ ,type: ‘post‘ ,dataType: ‘json‘ ,
???? data: {username: username},
???? success: function(data){
?????? if (data.success){
???????? SuccMsg(data.message);
???????? //页面获取验证码按钮样式处理
????????? $( "#btnMail" ).attr( ‘disabled‘ , ‘disabled‘ );
????????? var count = 1 ;
????????? var sum = 60 ;
????????? var i = setInterval(function(){
?????????? if (count > 60 ){
??????????? $( "#btnMail" ).attr( ‘disabled‘ , false );
??????????? $( "#btnMail" ).val( "获取邮箱验证码" );
??????????? clearInterval(i);
?????????? } else {
??????????? $( "#btnMail" ).val( "剩余" +parseInt(sum - count)+ ‘秒‘ );
?????????? }
?????????? count++;
????????? }, 1000 );
????????? //debug模式待填
????????? if (data.checkcode){
??????????? $( "#checkcode" ).val(data.checkcode);
????????? }
?????? } else {
???????? ErrorMsg( "获取失败!" +data.message);
?????? }
???? }
?? });
???
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读