diff --git a/MyMathQuiz_UI.iml b/MyMathQuiz_UI.iml index b826be9..5fd8b18 100644 --- a/MyMathQuiz_UI.iml +++ b/MyMathQuiz_UI.iml @@ -12,5 +12,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/lib/jakarta.activation-2.0.1.jar b/lib/jakarta.activation-2.0.1.jar new file mode 100644 index 0000000..521c7c4 Binary files /dev/null and b/lib/jakarta.activation-2.0.1.jar differ diff --git a/lib/jakarta.mail-2.0.1.jar b/lib/jakarta.mail-2.0.1.jar new file mode 100644 index 0000000..17e07cc Binary files /dev/null and b/lib/jakarta.mail-2.0.1.jar differ diff --git a/src/com/student/mathquiz/view/EmailService.java b/src/com/student/mathquiz/view/EmailService.java new file mode 100644 index 0000000..86a0a41 --- /dev/null +++ b/src/com/student/mathquiz/view/EmailService.java @@ -0,0 +1,83 @@ +package com.student.mathquiz.view; + +import jakarta.mail.*; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; +import java.util.Properties; +import java.util.Random; + +public class EmailService { + + // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ + // ★ 把这里换成你自己的发件人邮箱和授权码! ★ + // ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ + private static final String SENDER_EMAIL = "3048494657@qq.com"; + private static final String SENDER_AUTHORIZATION_CODE = "ymnbezwjzrnfdgih"; + + /** + * 生成一个6位的随机验证码. + * @return 6位数字字符串 + */ + public static String generateVerificationCode() { + Random random = new Random(); + int code = 100000 + random.nextInt(900000); // 保证是6位数 + return String.valueOf(code); + } + + /** + * 发送验证码邮件. + * @param recipientEmail 收件人邮箱 + * @param code 要发送的验证码 + * @return 发送成功返回 true, 否则返回 false + */ + public static boolean sendVerificationEmail(String recipientEmail, String code) { + // 1. 配置邮件服务器属性 + Properties props = new Properties(); + props.put("mail.smtp.host", "smtp.qq.com"); // QQ邮箱的SMTP服务器地址 + props.put("mail.smtp.port", "587"); // SMTP服务器端口 (使用TLS加密) + props.put("mail.smtp.auth", "true"); // 需要身份验证 + props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密 + + // 2. 创建认证器,用于登录邮箱 + Authenticator authenticator = new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(SENDER_EMAIL, SENDER_AUTHORIZATION_CODE); + } + }; + + // 3. 获取邮件会话 Session + Session session = Session.getInstance(props, authenticator); + + try { + // 4. 创建邮件消息 MimeMessage + MimeMessage message = new MimeMessage(session); + // 设置发件人 + message.setFrom(new InternetAddress(SENDER_EMAIL)); + // 设置收件人 + message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientEmail)); + // 设置邮件主题 + message.setSubject("【数学学习软件】您的注册验证码"); + // 设置邮件正文内容 + message.setText("尊敬的用户,您好!\n\n您的注册验证码是:" + code + "\n\n请在5分钟内完成注册。如果不是您本人操作,请忽略此邮件。\n\n(此为系统自动发送,请勿回复)"); + + // 5. 发送邮件! + Transport.send(message); + + System.out.println("验证码邮件发送成功!"); + return true; + + } catch (MessagingException e) { + e.printStackTrace(); + System.out.println("邮件发送失败!"); + return false; + } + } + + // 你可以写一个临时的 main 方法来测试它! + /* public static void main(String[] args) { + String code = generateVerificationCode(); + // ★★★ 把这里换成你自己的另一个邮箱来接收测试邮件 ★★★ + sendVerificationEmail("lyqqqq1214@163.com", code); + }*/ +} diff --git a/src/com/student/mathquiz/view/RegisterView.fxml b/src/com/student/mathquiz/view/RegisterView.fxml index d9554e1..12c1165 100644 --- a/src/com/student/mathquiz/view/RegisterView.fxml +++ b/src/com/student/mathquiz/view/RegisterView.fxml @@ -2,6 +2,7 @@ + diff --git a/src/com/student/mathquiz/view/RegisterViewController.java b/src/com/student/mathquiz/view/RegisterViewController.java index 272e352..c71aea8 100644 --- a/src/com/student/mathquiz/view/RegisterViewController.java +++ b/src/com/student/mathquiz/view/RegisterViewController.java @@ -2,10 +2,14 @@ package com.student.mathquiz.view; import com.student.mathquiz.MainApp; +import javafx.application.Platform; import javafx.fxml.FXML; import javafx.scene.control.Label; +import javafx.scene.control.TextField; public class RegisterViewController { + public TextField codeField; + public TextField emailField; @FXML private Label statusLabel; private MainApp mainApp; @@ -17,7 +21,27 @@ public class RegisterViewController { @FXML private void handleSendCode() { // TODO: 在这里调用后端 userService.sendVerificationCode(...) - statusLabel.setText("验证码已发送(伪)!"); + String email = emailField.getText(); + + // TODO: 在这里先加一个邮箱格式校验 + + String code = EmailService.generateVerificationCode(); + + // ★★★ 在后台线程中发送邮件,防止界面卡死! ★★★ + new Thread(() -> { + boolean success = EmailService.sendVerificationEmail(email, code); + + // 在 JavaFX 主线程中更新界面 + Platform.runLater(() -> { + if (success) { + statusLabel.setText("验证码已发送至您的邮箱,请查收!"); + // TODO: 把 code 和 email 存起来,用于稍后的验证 + } else { + statusLabel.setText("验证码发送失败,请检查邮箱地址或网络!"); + } + }); + }).start(); + } @FXML @@ -32,3 +56,4 @@ public class RegisterViewController { mainApp.showLoginView(); } } +// 在 RegisterViewController.java 里