修改邮件发送配置问题

This commit is contained in:
2026-01-21 18:10:11 +08:00
parent 91ddcc8e7b
commit 323e19a63c
2 changed files with 123 additions and 86 deletions

View File

@@ -5,16 +5,17 @@ import cc.winboll.auth.MailAuthUtils;
import cc.winboll.auth.RSAUtils;
import cc.winboll.models.UserModel;
import cc.winboll.util.ConsoleInputUtils;
import cc.winboll.util.ConsoleVersionUtils;
import cc.winboll.util.EmailSendUtils;
import cc.winboll.util.EnvInfoUtils;
import cc.winboll.util.HelpInfoUtils;
import cc.winboll.util.IniConfigUtils;
import cc.winboll.util.MainUtils;
import cc.winboll.util.ServerUtils;
import cc.winboll.util.IniConfigUtils;
import cc.winboll.util.EnvInfoUtils;
import cc.winboll.util.ConsoleVersionUtils; // 1. 新增导入
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
@@ -25,11 +26,11 @@ import java.util.List;
* AuthCenter 控制台指令自动化测试类
* 适配 Java7 语言规范与 Android API30 运行环境
* 自动执行控制台指令测试用例,生成结构化测试报告 + 发送报告到配置邮箱
* 核心优化:从config.ini读取配置动态初始化测试路径与参数根目录配置缺失直接日志退出
* 本次更新:1.新增EnvInfoUtils测试用例 2.邮件报告追加环境信息 3.用EmailSendUtils无参test()+修复用例索引错误+精简冗余日志
* 核心优化:IniConfigUtils+LogUtils移至main直接初始化移除其单元测试流程更简洁
* 本次更新:移除核心配置工具类单元测试main函数前置初始化核心依赖
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
* @Date 2026/01/20 10:00:00
* @LastEditTime 2026/01/26 新增EnvInfoUtils用例+邮件追加环境信息+补充用户ID展示 + 新增ConsoleVersionUtils版本读取测试
* @LastEditTime 2026/01/26 main前置初始化IniConfigUtils+LogUtils移除对应测试用例
*/
public class ConsoleCmdAutoTest {
// ========== 静态常量(配置键名,不可变) ==========
@@ -40,6 +41,7 @@ public class ConsoleCmdAutoTest {
private static final String CONFIG_SECTION_GLOBAL = "GlobalConfig";
private static final String CONFIG_SECTION_EMAIL = "EmailConfig";
private static final String CONFIG_KEY_SEND_EMAIL = "send_email_account";
private static final String CONFIG_KEY_SMTP_AUTH_CODE = "smtp_auth_code";// 授权码配置键
// ========== 动态配置属性从INI读取可变 ==========
private static String PROJECT_ROOT_DIR;
@@ -69,20 +71,29 @@ public class ConsoleCmdAutoTest {
}
}
// ========== 程序入口主函数 ==========
// ========== 程序入口主函数 ==========
public static boolean main(String[] args) {
// 核心改动main函数前置初始化核心依赖优先完成IniConfig+LogUtils初始化
try {
IniConfigUtils.init();// 优先初始化配置工具
LogUtils.init();// 初始化日志工具
System.out.println("✅ 核心依赖初始化完成IniConfigUtils+LogUtils");
} catch (Exception e) {
System.err.println("❌ 核心依赖初始化失败,程序退出:" + e.getMessage());
return false;
}
LogUtils.d(TAG, "【函数调用】main(),自动化测试程序启动");
// 初始化报告路径读取GlobalConfig的reports_path优先级最高
initReportPathFromIni();
// 直接执行测试流程(依赖外部已初始化配置)
// 直接执行测试流程
registerTestCases();
runAllTestCases();
generateTestReport();
// 新增:生成报告后发送到配置邮箱
// 生成报告后发送到配置邮箱
sendReportToEmail();
// 输出测试总结
@@ -93,17 +104,16 @@ public class ConsoleCmdAutoTest {
System.out.println("报告文件路径:" + new File(REPORT_FILE).getAbsolutePath());
LogUtils.i(TAG, "【函数结束】main()" + summary);
// 核心修改:任意用例失败返回false全部通过返回true
// 任意用例失败返回false全部通过返回true
return failCount == 0;
}
// ========== 核心修改:读取GlobalConfig的reports_path初始化报告路径 ==========
// ========== 读取GlobalConfig的reports_path初始化报告路径 ==========
private static void initReportPathFromIni() {
try {
// 读取核心配置
PROJECT_ROOT_DIR = IniConfigUtils.getConfigValue(CONFIG_SECTION_GLOBAL, CONFIG_KEY_ROOT_DIR, "");
LOG_DIR_PATH = IniConfigUtils.getConfigValue(CONFIG_SECTION_GLOBAL, CONFIG_KEY_LOG_PATH, "logs");
// 核心修改读取GlobalConfig下的reports_path作为报告根目录
REPORT_DIR_PATH = IniConfigUtils.getConfigValue(CONFIG_SECTION_GLOBAL, CONFIG_KEY_REPORTS_PATH, "test/reports");
// 拼接完整报告文件路径,文件名带时间戳防重复
@@ -122,7 +132,7 @@ public class ConsoleCmdAutoTest {
}
}
// ========== 新增:发送测试报告到配置邮箱(追加环境信息) ==========
// ========== 发送测试报告到配置邮箱(追加环境信息) ==========
private static void sendReportToEmail() {
LogUtils.d(TAG, "【函数调用】sendReportToEmail(),开始发送测试报告邮件");
EmailSendUtils emailUtils = EmailSendUtils.getInstance();
@@ -139,7 +149,7 @@ public class ConsoleCmdAutoTest {
return;
}
// 核心更新:拼接EnvInfoUtils完整环境报告,格式和终端一致
// 拼接EnvInfoUtils完整环境报告
String envInfo = getEnvReportForEmail();
String finalContent = reportContent + "\n\n" + envInfo;
@@ -165,20 +175,18 @@ public class ConsoleCmdAutoTest {
}
}
// ========== 更新:组装邮件用的环境信息(格式统一+无冗余) ==========
// ========== 组装邮件用的环境信息 ==========
private static String getEnvReportForEmail() {
StringBuilder envSb = new StringBuilder();
envSb.append("=== 运行环境核心信息EnvInfoUtils获取===\n");
envSb.append("核心环境标识:").append(EnvInfoUtils.getEnvFlag()).append("\n");
envSb.append("是否Android环境").append(EnvInfoUtils.isAndroidEnv() ? "" : "").append("\n\n");
// 核心:直接拼接完整环境报告,和终端输出完全一致
envSb.append(EnvInfoUtils.getFullEnvReportText()).append("\n");
envSb.append("=====================================");
return envSb.toString();
}
// ========== 新增:读取报告文件内容 ==========
// ========== 读取报告文件内容 ==========
private static String readReportFile() {
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
@@ -203,22 +211,21 @@ public class ConsoleCmdAutoTest {
}
}
// ========== 工具函数(按执行顺序排列 ==========
// ========== 注册测试用例已移除IniConfigUtils、LogUtils相关测试 ==========
private static void registerTestCases() {
LogUtils.d(TAG, "【函数调用】registerTestCases(),开始注册测试用例");
final EmailSendUtils emailUtils = EmailSendUtils.getInstance();
// ========== 3个核心工具类独立测试(优先执行) ==========
// 用例01核心工具类集成测试(仅保留RSAUtils/UserModel
testCaseList.add(new TestCase(
"核心工具类集成测试",
"执行LogUtils/RSAUtils/UserModel独立测试函数验证工具类完整性",
"执行RSAUtils/UserModel独立测试函数验证工具类完整性",
new Runnable() {
@Override
public void run() {
try {
LogUtils.test(); // 执行LogUtils测试
RSAUtils.test(); // 执行RSAUtils测试
UserModel.test(); // 执行UserModel测试
RSAUtils.test(); // 仅保留RSA测试
UserModel.test(); // 仅保留UserModel测试
testCaseList.get(0).isPass = true;
LogUtils.d(TAG, "【用例结果】核心工具类集成测试通过");
} catch (Exception e) {
@@ -229,7 +236,7 @@ public class ConsoleCmdAutoTest {
}
));
// 新增用例 ConsoleVersionUtils版本读取测试
// 用例02ConsoleVersionUtils版本读取测试
testCaseList.add(new TestCase(
"ConsoleVersionUtils版本读取测试",
"验证版本读取工具类功能读取config/version.flags并校验格式",
@@ -237,11 +244,8 @@ public class ConsoleCmdAutoTest {
@Override
public void run() {
try {
// 执行版本工具自测
ConsoleVersionUtils.test();
// 验证核心读取功能
String version = ConsoleVersionUtils.getVersion();
// 只要不抛异常即算通过,兼容各种返回场景
testCaseList.get(1).isPass = true;
LogUtils.d(TAG, "【用例结果】版本读取测试通过,当前版本结果:" + version);
} catch (Exception e) {
@@ -252,7 +256,7 @@ public class ConsoleCmdAutoTest {
}
));
// 新增用例02EnvInfoUtils环境检测工具测试(紧跟核心工具类)
// 用例03EnvInfoUtils环境检测工具测试
testCaseList.add(new TestCase(
"EnvInfoUtils环境检测测试",
"验证环境信息工具类核心功能,输出环境标识+完整环境报告",
@@ -260,9 +264,7 @@ public class ConsoleCmdAutoTest {
@Override
public void run() {
try {
// 执行工具类自测
EnvInfoUtils.test();
// 验证核心函数有效性
String envFlag = EnvInfoUtils.getEnvFlag();
String javaVer = EnvInfoUtils.getEnvInfo(EnvInfoUtils.PROP_JAVA_VERSION);
if (!EmailSendUtils.isStrEmpty(envFlag) && !EmailSendUtils.isStrEmpty(javaVer)) {
@@ -280,7 +282,7 @@ public class ConsoleCmdAutoTest {
}
));
// 用例03help指令响应测试(索引同步后移)
// 用例04help指令响应测试
testCaseList.add(new TestCase(
"help指令响应测试",
"验证help指令能否正常打印帮助信息",
@@ -300,45 +302,59 @@ public class ConsoleCmdAutoTest {
}
));
// 用例04selftestmail指令测试 - 用无参test()+精简日志+精准排错(索引同步后移
// 用例05selftestmail指令测试(优化版
testCaseList.add(new TestCase(
"selftestmail指令测试",
"验证邮件自测功能需配置INI邮箱账号、授权码且依赖齐全",
new Runnable() {
@Override
public void run() {
TestCase currentCase = testCaseList.get(4);
try {
LogUtils.d(TAG, "邮件自测开始,使用无参test自动生成测试码");
LogUtils.d(TAG, "邮件自测开始,前置校验配置+独立初始化");
// 1. 先检查配置是否就绪,不就绪先初始化
if (!emailUtils.isConfigInited()) {
LogUtils.d(TAG, "邮件配置未初始化,尝试自动初始化");
boolean initOk = emailUtils.initEmailConfig();
if (!initOk) {
testCaseList.get(4).failReason = "邮件配置初始化失败检查INI[EmailConfig] 下send_email_account和smtp_auth_code";
LogUtils.w(TAG, "【用例结果】selftestmail指令测试失败" + testCaseList.get(4).failReason);
return;
}
// 1. 前置核心配置校验
String sendEmail = IniConfigUtils.getConfigValue(CONFIG_SECTION_EMAIL, CONFIG_KEY_SEND_EMAIL, "");
String authCode = IniConfigUtils.getConfigValue(CONFIG_SECTION_EMAIL, CONFIG_KEY_SMTP_AUTH_CODE, "");
if (EmailSendUtils.isStrEmpty(sendEmail)) {
currentCase.failReason = "INI[EmailConfig]中send_email_account未配置";
LogUtils.w(TAG, "【用例结果】selftestmail指令测试失败" + currentCase.failReason);
return;
}
if (EmailSendUtils.isStrEmpty(authCode)) {
currentCase.failReason = "INI[EmailConfig]中smtp_auth_code未配置需QQ邮箱SMTP授权码非登录密码";
LogUtils.w(TAG, "【用例结果】selftestmail指令测试失败" + currentCase.failReason);
return;
}
// 2. 核心更新调用无参test(),自动生成测试码,简洁高效
// 2. 独立初始化邮件配置
LogUtils.d(TAG, "邮件配置未初始化,执行独立初始化");
boolean initOk = emailUtils.initEmailConfig();
if (!initOk) {
currentCase.failReason = "邮件配置初始化失败排查1.配置项格式 2.网络连通smtp.qq.com 3.依赖包完整";
LogUtils.w(TAG, "【用例结果】selftestmail指令测试失败" + currentCase.failReason);
return;
}
// 3. 执行核心自测
LogUtils.d(TAG, "邮件配置初始化成功,执行自测");
boolean testResult = emailUtils.test();
if (testResult) {
testCaseList.get(4).isPass = true;
LogUtils.d(TAG, "【用例结果】selftestmail指令测试通过");
currentCase.isPass = true;
LogUtils.d(TAG, "【用例结果】selftestmail指令测试通过,自测邮件已发送");
} else {
testCaseList.get(4).failReason = "邮件发送失败排查方向1.授权码正确 2.邮箱开启SMTP 3.网络通畅 4.依赖齐全";
LogUtils.w(TAG, "【用例结果】selftestmail指令测试失败" + testCaseList.get(4).failReason);
currentCase.failReason = "邮件发送失败排查方向1.授权码有效 2.QQ邮箱开启POP3/SMTP 3.465端口未被拦截 4.Java协议兼容";
LogUtils.w(TAG, "【用例结果】selftestmail指令测试失败" + currentCase.failReason);
}
} catch (Exception e) {
testCaseList.get(4).failReason = "邮件自测异常:" + e.getMessage() + "(已修复AWT依赖,优先检查邮件配置";
LogUtils.w(TAG, "【用例结果】selftestmail指令测试异常" + testCaseList.get(4).failReason, e);
currentCase.failReason = "邮件自测执行异常:" + e.getMessage() + "(已兼容Java7+防AWT优先查配置和网络";
LogUtils.w(TAG, "【用例结果】selftestmail指令测试异常" + currentCase.failReason, e);
}
}
}
));
// 用例05clearverifycode指令测试(索引同步后移)
// 用例06clearverifycode指令测试
testCaseList.add(new TestCase(
"clearverifycode指令测试",
"验证清空验证码指令能否清空MailAuthUtils缓存",
@@ -363,7 +379,7 @@ public class ConsoleCmdAutoTest {
}
));
// 用例06testserver指令测试(索引同步后移)
// 用例07testserver指令测试
testCaseList.add(new TestCase(
"testserver指令测试",
"验证服务器连通性测试指令能否正常执行",
@@ -383,7 +399,7 @@ public class ConsoleCmdAutoTest {
}
));
// 用例07:未识别指令测试(索引同步后移)
// 用例08:未识别指令测试
testCaseList.add(new TestCase(
"未识别指令测试",
"验证输入未知指令能否正常提示",
@@ -402,7 +418,7 @@ public class ConsoleCmdAutoTest {
}
));
// 用例08最后执行exit指令逻辑测试(索引同步后移)
// 用例09最后执行exit指令逻辑测试
testCaseList.add(new TestCase(
"exit指令逻辑测试",
"验证exit指令核心处理逻辑有效性",

View File

@@ -17,9 +17,11 @@ import javax.mail.internet.MimeMessage;
* 新增:公开静态空值校验方法 isStrEmpty供外部类调用
* 本次修复终极规避AWT依赖配合补丁类彻底解决java.awt.datatransfer.Transferable缺失异常
* 新增无参test()自动生成6位测试码快速自测邮件配置
* 补充修复集成SSL协议兼容配置解决QQ邮箱465端口SSLHandshakeException
* 新增main入口单一入口调用测试整合所有测试逻辑
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
* @Date 2026-01-15 00:00:00
* @LastEditTime 2026-01-26 补全防AWT配置兼容android-30.jar不冲突
* @LastEditTime 2026-01-26 新增main入口+整合测试逻辑兼容Java7规范
*/
public class EmailSendUtils {
private static final String TAG = "EmailSendUtils";
@@ -82,6 +84,11 @@ public class EmailSendUtils {
}
LogUtils.d(TAG, "initEmailConfig 函数调用,开始初始化邮件配置");
// ========== 核心修复SSL协议兼容配置解决握手失败- Java7适配 ==========
java.security.Security.setProperty("jdk.tls.disabledAlgorithms", "");
System.setProperty("https.protocols", "SSLv3,TLSv1,TLSv1.1,TLSv1.2");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
// 读取INI配置精简key名直接关联配置段
String smtpHost = IniConfigUtils.getConfigValue(CONFIG_SECTION_EMAIL, "smtp_host", DEFAULT_SMTP_HOST);
String smtpPort = IniConfigUtils.getConfigValue(CONFIG_SECTION_EMAIL, "smtp_port", DEFAULT_SMTP_PORT);
@@ -122,11 +129,11 @@ public class EmailSendUtils {
try {
// 创建邮件会话匿名内部类适配Java7
mailSession = Session.getInstance(mailProps, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(fromEmail, smtpAuthCode);
}
});
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(fromEmail, smtpAuthCode);
}
});
mailSession.setDebug(false);
isConfigInited = true; // 标记初始化完成
LogUtils.i(TAG, "邮件发送配置初始化完成,发送方邮箱:" + fromEmail + " 发送方昵称:" + (isEmpty(fromNickname) ? "默认昵称" : fromNickname));
@@ -139,34 +146,39 @@ public class EmailSendUtils {
}
/**
* 【新增无参自测】自动生成6位测试码快速校验邮件配置最常用
* 无需传参,一键自测,适配快速验证场景
* @return 测成功返回true失败返回false
* 整合型单元测试入口(核心测试函数
* 初始化环境+生成测试码+发送自测邮件,整合所有测试逻辑
* @return 测成功返回true失败返回false
*/
public boolean test() {
// 自动生成6位纯数字测试码和验证码规则一致
String testCode = String.valueOf((int)(Math.random() * 900000 + 100000));
LogUtils.d(TAG, "无参test()调用,自动生成测试码:" + testCode);
return test(testCode);
}
/**
* 单元测试专用函数(适配新测试用例,单例调用)
* @param testCode 自定义测试码
* @return 测试邮件发送成功返回true否则false
*/
public boolean test(String testCode) {
LogUtils.d(TAG, "test() 函数调用,开始邮件工具类单元测试");
// 未初始化则自动执行,失败直接终止
if (!isConfigInited) {
LogUtils.w(TAG, "邮件会话未初始化,自动执行配置初始化");
boolean initResult = initEmailConfig();
if (!initResult) {
LogUtils.e(TAG, "自动初始化失败,单元测试终止");
return false;
}
// 1. 先初始化INI配置
boolean iniInit = IniConfigUtils.init();
if (!iniInit) {
return false;
}
return sendSelfTestEmail(testCode);
LogUtils.d(TAG, "===== 邮件工具类整合单元测试启动 =====");
// 1. 初始化配置环境
boolean initResult = initEmailConfig();
if (!initResult) {
LogUtils.e(TAG, "环境初始化失败,单元测试终止");
System.err.println("❌ 环境初始化失败!");
LogUtils.d(TAG, "===== 邮件工具类整合单元测试失败 =====");
return false;
}
// 2. 生成6位测试码
String testCode = String.valueOf((int)(Math.random() * 900000 + 100000));
LogUtils.d(TAG, "生成测试验证码:" + testCode);
// 3. 发送自测邮件(核心测试步骤)
boolean sendResult = sendSelfTestEmail(testCode);
if (sendResult) {
LogUtils.i(TAG, "===== 邮件工具类整合单元测试成功 =====");
} else {
LogUtils.e(TAG, "===== 邮件工具类整合单元测试失败 =====");
}
return sendResult;
}
/**
@@ -305,9 +317,18 @@ public class EmailSendUtils {
fromNickname = null;
}
// ========== 对外提供初始化状态查询(适配测试用例调用) ==========
// ========== 对外提供初始化状态查询 ==========
public boolean isConfigInited() {
return this.isConfigInited;
}
// ========== 程序入口main函数单一测试入口 ==========
public static boolean main(String[] args) {
// 调用整合型单元测试,一键完成初始化+自测
boolean testResult = EmailSendUtils.getInstance().test();
// 退出程序0=成功1=失败
System.exit(testResult ? 0 : 1);
return testResult;
}
}