当前位置: 首页 > news >正文

25.4.6学习总结

 邮箱验证码的实现:

import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;

public class EmailSender {
    // 配置参数(根据你的邮箱修改)
    private static final String FROM = "your_email@qq.com";  // 发件人邮箱
    private static final String PASSWORD = "your_authorization_code"; // 邮箱授权码
    private static final String HOST = "smtp.qq.com"; // SMTP服务器地址
    
    public static void sendVerificationCode(String toEmail) throws MessagingException {
        // 1. 配置参数
        Properties props = new Properties();
        props.put("mail.smtp.host", HOST);
        props.put("mail.smtp.port", "465"); // SSL端口
        props.put("mail.smtp.ssl.enable", "true"); // 启用SSL
        props.put("mail.smtp.auth", "true"); // 需要认证
        
        // 2. 创建Session对象
        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(FROM, PASSWORD);
            }
        });
        
        // 3. 创建邮件对象
        MimeMessage message = new MimeMessage(session);
        // 设置发件人
        message.setFrom(new InternetAddress(FROM));
        // 设置收件人
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
        // 设置邮件主题
        message.setSubject("验证码邮件");
        
        // 生成6位随机验证码
        String verificationCode = generateVerificationCode();
        
        // 设置邮件正文
        String content = "您的验证码是:" + verificationCode + ",有效期5分钟";
        message.setText(content);
        
        // 4. 发送邮件
        Transport.send(message);
        
        System.out.println("邮件发送成功!");
    }
    
    // 生成6位随机验证码
    private static String generateVerificationCode() {
        return String.format("%06d", (int)(Math.random() * 1000000));
    }

    public static void main(String[] args) {
        try {
            sendVerificationCode("recipient@example.com"); // 测试发送
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}


代码逐行解析

import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class EmailSender {
    // 配置参数(类级别常量)
    private static final String FROM = "your_email@qq.com";   // 发件人邮箱
    private static final String PASSWORD = "your_authorization_code"; // 邮箱授权码
    private static final String HOST = "smtp.qq.com"; // SMTP服务器地址

作用

  • 定义邮件服务器的连接参数

  • FROM:发件人身份标识

  • PASSWORD:邮箱的授权凭证(注意不是登录密码)

  • HOST:邮件服务提供商的SMTP服务器地址

举一反三

  • 如果使用其他邮箱服务(如163、Gmail),需修改HOST为对应的SMTP地址

  • 敏感信息建议通过配置文件读取(如config.properties


public static void sendVerificationCode(String toEmail) throws MessagingException {
    // 1. 配置网络参数
    Properties props = new Properties();
    props.put("mail.smtp.host", HOST);        // 指定SMTP服务器
    props.put("mail.smtp.port", "465");       // SSL加密端口
    props.put("mail.smtp.ssl.enable", "true");// 启用SSL加密
    props.put("mail.smtp.auth", "true");      // 需要身份验证

作用

  • 创建Properties对象存储邮件服务器配置

  • mail.smtp.host:指定邮件传输协议服务器

  • mail.smtp.port:使用SSL加密时的标准端口

  • mail.smtp.auth:启用身份验证机制

举一反三

  • 非SSL连接时可使用端口25,但安全性较低

  • Gmail可能需要设置mail.smtp.starttls.enable=true


// 2. 创建邮件会话
    Session session = Session.getInstance(props, new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(FROM, PASSWORD);
        }
    });

作用

  • 通过Session对象建立与邮件服务器的会话

  • 使用匿名内部类实现Authenticator,提供邮箱认证信息

  • PasswordAuthentication封装账号密码

举一反三

  • 可配置session.setDebug(true)开启调试模式,查看SMTP协议交互过程

  • 对于需要多次发送的场景,可复用同一个Session对象提高效率


// 3. 构建邮件内容
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(FROM)); // 设置发件人
    message.setRecipient(Message.RecipientType.TO, 
        new InternetAddress(toEmail)); // 设置收件人
    message.setSubject("验证码邮件"); // 邮件主题
    
    String verificationCode = generateVerificationCode(); // 生成验证码
    message.setText("您的验证码是:" + verificationCode); // 邮件正文

作用

  • MimeMessage表示一封电子邮件的完整结构

  • setRecipient支持多种类型:TO(主送)、CC(抄送)、BCC(密送)

  • setText设置纯文本内容

举一反三

  • 添加多个收件人:

    message.addRecipient(Message.RecipientType.CC, 
        new InternetAddress("other@example.com"));
  • 发送HTML内容:

    message.setContent("<h1>验证码</h1>", "text/html");

// 4. 发送邮件
    Transport.send(message);
    System.out.println("邮件发送成功!");
}

作用

  • Transport类负责实际发送操作

  • 发送完成后输出成功提示

举一反三

  • 可添加重试机制:

    int retry = 3;
    while(retry-- > 0) {
        try {
            Transport.send(message);
            break;
        } catch (Exception e) {
            if(retry == 0) throw e;
        }
    }

验证码生成方法

private static String generateVerificationCode() {
    return String.format("%06d", (int)(Math.random() * 1000000));
}

作用

  • 生成6位数字验证码

  • Math.random()生成0-1之间的随机数

  • String.format确保不足6位时前面补零

举一反三

  • 生成字母数字混合验证码:

    String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    StringBuilder code = new StringBuilder();
    for(int i=0; i<6; i++) {
        code.append(chars.charAt((int)(Math.random()*chars.length())));
    }
    return code.toString();

相关文章:

  • C++ 中为什么构造函数不需要实现虚函数,而析构函数需要?
  • 线程同步的学习与应用
  • 设计模式简述(八)中介者模式
  • 从扩展黎曼泽塔函数构造物质和时空的结构-15
  • swift-11-init、deinit、可选链、协议、元类型
  • STM32F103C8T6单片机的起始点:使用GPIO输出点亮我们的第一个小灯(HAL库版本)
  • 【简历全景认知】简历的历史演变与当代定位:从羊皮卷到算法博弈的艺术
  • 设计模式简述(十)责任链模式
  • 请问你怎么看待测试,指导哪些测试的类型,有用过哪些测试方法?
  • Nmap全脚本使用指南!NSE脚本全详细教程!Kali Linux教程!(六)
  • 人脸识别系统(人脸识别、前后端交互、Python项目)
  • 初识数据结构——Java集合框架解析:List与ArrayList的完美结合
  • 如何判断JVM中类和其他类是不是同一个类
  • Window进程监控工具,能自动重启进程和卡死检测
  • 【Linux篇】基础IO - 文件描述符的引入
  • Spring 中的 @Autowired 和 @Resource
  • 用Scala玩转Flink:从零构建实时处理系统
  • L2-046 天梯赛的赛场安排 #二次手写cmp比较函数 这个模拟思路太神了
  • Nginx 负载均衡案例配置
  • [蓝桥杯青少年组省赛 2024] 通关游戏的最少能量值
  • 百度百科让做网站的超链接吗/优化关键词的方法有哪些
  • 企业怎么做网站建设/太原seo快速排名怎么样
  • 无毒手机网站/网络推广项目
  • 网站做视频窗口接口收费么/郑州网络推广哪家口碑好
  • 金华市东阳市建设局网站/seo页面代码优化
  • 全球访问量top100网站/厦门网站优化公司