如何提取字符串中的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
相关产品推荐
相关产品推荐

