You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取字符串中的OTP并在Java代码中动态生成含随机OTP的邮件内容?

解决方案:提取OTP并实现动态随机OTP发送

一、从邮件字符串中精准提取OTP

你之前用[^0-9]替换非数字的方式会把所有数字都保留(比如"15分钟"的15也会被包含),更精准的做法是直接匹配6位数字的OTP:

String emailContent = "Your One Time Password (OTP) for Member Portal login is 123456 and is valid for 15 minutes.";
// 匹配连续6位数字,正好对应你的OTP格式
Pattern otpPattern = Pattern.compile("\\d{6}");
Matcher matcher = otpPattern.matcher(emailContent);

if (matcher.find()) {
    String extractedOTP = matcher.group();
    System.out.println("提取到的OTP: " + extractedOTP); // 输出 123456
}

这个正则表达式\\d{6}专门锁定6位数字,完美避开邮件里其他无关数字。

二、修改代码实现每次发送不同的OTP

要让每次邮件的OTP都不一样,我们可以生成随机6位OTP,再动态拼接邮件内容,具体修改如下:

完整修改后的代码

import java.security.SecureRandom;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SendEmail {
    static String subject = "OTP for Member Portal login";
    // 定义邮件模板,用%s作为OTP的占位符
    static String emailTemplate = "Your One Time Password (OTP) for Member Portal login is %s and is valid for 15 minutes.";
    static SendEmail obj = new SendEmail();

    // 生成安全的6位随机OTP
    private static String generateRandomOTP() {
        SecureRandom secureRandom = new SecureRandom();
        // 生成0-999999之间的随机数,补前导零确保是6位
        int otpValue = secureRandom.nextInt(1000000);
        return String.format("%06d", otpValue);
    }

    public static void main(String[] args) {
        try {
            // 生成随机OTP
            String randomOTP = generateRandomOTP();
            // 替换模板中的占位符,生成最终邮件内容
            String emailText = String.format(emailTemplate, randomOTP);
            
            // 发送邮件
            obj.sendEmail(subject, emailText);
            
            // 验证提取OTP(可选)
            Pattern otpPattern = Pattern.compile("\\d{6}");
            Matcher matcher = otpPattern.matcher(emailText);
            if (matcher.find()) {
                System.out.println("本次发送的OTP: " + matcher.group());
            }
        } catch (Exception e) {
            // 捕获发送邮件时的异常
            e.printStackTrace();
        }
    }

    // 你的sendEmail方法实现(示例)
    public void sendEmail(String subject, String content) {
        // 这里替换成你实际的邮件发送逻辑,比如JavaMail API调用
        System.out.println("邮件已发送:");
        System.out.println("主题: " + subject);
        System.out.println("内容: " + content);
    }
}

关键修改点说明

  • 安全随机数生成:用SecureRandom代替普通Random,它采用加密级别的随机算法,避免OTP被轻易预测,更适合验证码场景。
  • 模板化邮件内容:把固定文本做成模板,用%s占位,每次生成OTP后用String.format替换,代码更整洁,后续修改邮件内容也更方便。
  • 补前导零:String.format("%06d", otpValue)保证生成的OTP始终是6位,比如随机生成123的话会自动变成000123,符合格式要求。

内容的提问来源于stack exchange,提问作者nirmal prakash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 20:17:37