From 34304e79f4eefe166e4e8dd970676bbce448115e Mon Sep 17 00:00:00 2001 From: qinglong Date: Thu, 23 Jul 2026 20:00:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBase=20?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4=E6=A0=87?= =?UTF-8?q?=E7=AD=BEappbase-v15.21.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.gradle | 12 +- appbase/build.properties | 8 +- appbase/proguard-rules.pro | 4 + .../java/cc/winboll/studio/appbase/App.java | 30 ++- .../APPExcetionMailSettingsActivity.java | 143 +----------- .../activity_appexcetionmailsettings.xml | 145 +----------- libappbase/build.gradle | 2 + libappbase/build.properties | 8 +- .../libappbase/utils/APPMSGMailUtils.java | 216 ++++++++++++++++++ .../studio/libappbase/utils/SMTPUtils.java | 61 ++++- .../libappbase/views/SMTPConfigView.java | 113 +++++++++ .../src/main/res/layout/view_smtp_config.xml | 110 +++++++++ 12 files changed, 555 insertions(+), 297 deletions(-) create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/utils/APPMSGMailUtils.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/views/SMTPConfigView.java create mode 100644 libappbase/src/main/res/layout/view_smtp_config.xml diff --git a/appbase/build.gradle b/appbase/build.gradle index eee09d5..e2d5f41 100644 --- a/appbase/build.gradle +++ b/appbase/build.gradle @@ -44,10 +44,20 @@ android { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } + packagingOptions { + exclude 'META-INF/LICENSE.md' + exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/NOTICE.md' + exclude 'META-INF/NOTICE.txt' + } } dependencies { api project(':libappbase') - + + // JavaMail SMTP (Android兼容版) + api 'com.sun.mail:android-mail:1.6.7' + api 'com.sun.mail:android-activation:1.6.7' + api fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/appbase/build.properties b/appbase/build.properties index 75e9c15..94493dc 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Jul 21 14:10:49 HKT 2026 -stageCount=4 +#Thu Jul 23 19:07:39 HKT 2026 +stageCount=5 libraryProject=libappbase baseVersion=15.21 -publishVersion=15.21.3 +publishVersion=15.21.4 buildCount=0 -baseBetaVersion=15.21.4 +baseBetaVersion=15.21.5 diff --git a/appbase/proguard-rules.pro b/appbase/proguard-rules.pro index 574eeec..be86632 100644 --- a/appbase/proguard-rules.pro +++ b/appbase/proguard-rules.pro @@ -73,6 +73,10 @@ -dontwarn java.util.function.** # ============================== 第三方框架规则 ============================== +# JavaMail(libaes SMTPConfigView依赖) +-keep class javax.mail.** { *; } +-dontwarn javax.mail.** + # Retrofit + OkHttp -keep class retrofit2.** { *; } -keep interface retrofit2.** { *; } diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/App.java b/appbase/src/main/java/cc/winboll/studio/appbase/App.java index cfd440d..39c7e3c 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/App.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/App.java @@ -2,7 +2,9 @@ package cc.winboll.studio.appbase; import cc.winboll.studio.libappbase.CrashActivity; import cc.winboll.studio.libappbase.GlobalApplication; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.ToastUtils; +import cc.winboll.studio.libappbase.utils.APPMSGMailUtils; import cc.winboll.studio.libappbase.utils.CrashHandleNotifyUtils; import java.io.PrintWriter; import java.io.StringWriter; @@ -18,6 +20,9 @@ public class App extends GlobalApplication { /** 当前应用类的日志 TAG(用于调试输出,标识日志来源) */ public static final String TAG = "App"; + /** SMTP配置 SharedPreferences 名称 */ + private static final String PREF_NAME = "smtp_config"; + /** * 应用创建时回调(全局初始化入口) * 在应用进程启动时执行,仅调用一次,用于初始化全局工具类、第三方库等 @@ -26,15 +31,26 @@ public class App extends GlobalApplication { public void onCreate() { try { super.onCreate(); - + // 初始化 Toast 工具类(传入应用全局上下文,确保 Toast 可在任意地方调用) ToastUtils.init(getApplicationContext()); + + // 调试异常捕获 + final String errorMsg = "初始化异常捕获调试信息,这个是调试异常捕获的测试数据。"; + LogUtils.e(TAG, errorMsg); + throw new IllegalArgumentException(errorMsg); + } catch (Throwable e) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); pw.close(); String stackTraceStr = sw.toString(); + + // 发送异常信息邮箱。 + sendExceptionMail(stackTraceStr); + + // 前台通知栏提醒。 CrashHandleNotifyUtils.handleUncaughtException( this, getPackageName(), @@ -44,6 +60,17 @@ public class App extends GlobalApplication { } } + /** + * 发送异常报告邮件 + * 读取SMTP配置,若配置完整则在子线程发送异常堆栈邮件 + * @param stackTraceStr 异常堆栈信息 + */ + private void sendExceptionMail(final String stackTraceStr) { + String subject = "Exception Report - " + getPackageName(); + String recipients = APPMSGMailUtils.getRecipient(this); + APPMSGMailUtils.sendMail(this, subject, stackTraceStr, recipients); + } + /** * 应用终止时回调(资源释放入口) * 仅在模拟环境(如 Android Studio 模拟器)中可靠触发,真机上可能因系统回收进程不执行 @@ -56,4 +83,3 @@ public class App extends GlobalApplication { ToastUtils.release(); } } - diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java index bce8126..60e5796 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java @@ -1,162 +1,27 @@ package cc.winboll.studio.appbase.develop; import android.app.Activity; -import android.content.SharedPreferences; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.view.View; -import android.widget.Button; -import android.widget.EditText; -import android.widget.Toast; import cc.winboll.studio.appbase.R; -import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.utils.SMTPUtils; +import cc.winboll.studio.libappbase.views.SMTPConfigView; /** * @Author 豆包&BigPickle&MiMo&ZhanGSKen * @Date 2026/07/21 12:44 * @Describe 应用异常信息邮件接收账号设置 - * 配置SMTP服务器参数,用于通过邮件发送异常报告 + * 使用libaes的SMTPConfigView控件配置SMTP服务器参数 */ public class APPExcetionMailSettingsActivity extends Activity { public static final String TAG = "APPExcetionMailSettingsActivity"; - private static final String PREF_NAME = "smtp_config"; - private static final String KEY_SMTP_SERVER = "smtp_server"; - private static final String KEY_SMTP_PORT = "smtp_port"; - private static final String KEY_SENDER_EMAIL = "sender_email"; - private static final String KEY_AUTH_CODE = "auth_code"; - private static final String KEY_RECIPIENT_EMAIL = "recipient_email"; - - private EditText mEtSmtpServer; - private EditText mEtSmtpPort; - private EditText mEtSenderEmail; - private EditText mEtAuthCode; - private EditText mEtRecipientEmail; + private SMTPConfigView mSMTPConfigView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_appexcetionmailsettings); - mEtSmtpServer = (EditText) findViewById(R.id.et_smtp_server); - mEtSmtpPort = (EditText) findViewById(R.id.et_smtp_port); - mEtSenderEmail = (EditText) findViewById(R.id.et_sender_email); - mEtAuthCode = (EditText) findViewById(R.id.et_auth_code); - mEtRecipientEmail = (EditText) findViewById(R.id.et_recipient_email); - - loadConfig(); - - Button btnSave = (Button) findViewById(R.id.btn_save); - btnSave.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - saveConfig(); - } - }); - - Button btnTest = (Button) findViewById(R.id.btn_test); - btnTest.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - testSendMail(); - } - }); - } - - private void loadConfig() { - SharedPreferences sp = getSharedPreferences(PREF_NAME, MODE_PRIVATE); - String server = sp.getString(KEY_SMTP_SERVER, "smtp.qq.com"); - String port = sp.getString(KEY_SMTP_PORT, "465"); - String sender = sp.getString(KEY_SENDER_EMAIL, ""); - String auth = sp.getString(KEY_AUTH_CODE, ""); - String recipient = sp.getString(KEY_RECIPIENT_EMAIL, ""); - - mEtSmtpServer.setText(server); - mEtSmtpPort.setText(port); - mEtSenderEmail.setText(sender); - mEtAuthCode.setText(auth); - mEtRecipientEmail.setText(recipient); - } - - private void saveConfig() { - String server = mEtSmtpServer.getText().toString().trim(); - String port = mEtSmtpPort.getText().toString().trim(); - String sender = mEtSenderEmail.getText().toString().trim(); - String auth = mEtAuthCode.getText().toString().trim(); - String recipient = mEtRecipientEmail.getText().toString().trim(); - - SharedPreferences.Editor editor = getSharedPreferences(PREF_NAME, MODE_PRIVATE).edit(); - editor.putString(KEY_SMTP_SERVER, server); - editor.putString(KEY_SMTP_PORT, port); - editor.putString(KEY_SENDER_EMAIL, sender); - editor.putString(KEY_AUTH_CODE, auth); - editor.putString(KEY_RECIPIENT_EMAIL, recipient); - editor.apply(); - - Toast.makeText(this, "设置已保存", Toast.LENGTH_SHORT).show(); - LogUtils.d(TAG, "saveConfig success, server=" + server + ", port=" + port + ", sender=" + sender); - } - - private void testSendMail() { - String server = mEtSmtpServer.getText().toString().trim(); - String portStr = mEtSmtpPort.getText().toString().trim(); - String sender = mEtSenderEmail.getText().toString().trim(); - String auth = mEtAuthCode.getText().toString().trim(); - String recipient = mEtRecipientEmail.getText().toString().trim(); - - if (server.isEmpty()) { - Toast.makeText(this, "请输入SMTP服务器地址", Toast.LENGTH_SHORT).show(); - return; - } - if (portStr.isEmpty()) { - Toast.makeText(this, "请输入SMTP端口", Toast.LENGTH_SHORT).show(); - return; - } - if (sender.isEmpty()) { - Toast.makeText(this, "请输入发件人邮箱", Toast.LENGTH_SHORT).show(); - return; - } - if (auth.isEmpty()) { - Toast.makeText(this, "请输入邮箱授权码", Toast.LENGTH_SHORT).show(); - return; - } - if (recipient.isEmpty()) { - Toast.makeText(this, "请输入收件人邮箱", Toast.LENGTH_SHORT).show(); - return; - } - - Toast.makeText(this, "正在发送测试邮件...", Toast.LENGTH_SHORT).show(); - - final String finalRecipient = recipient; - final String finalSender = sender; - final String finalAuth = auth; - - new Thread(new Runnable() { - @Override - public void run() { - final boolean success = SMTPUtils.sendTextMail( - finalRecipient, - "APPBase 测试邮件", - "这是一封来自APPBase的测试邮件。\n\n发送时间: " + System.currentTimeMillis(), - finalSender, - finalAuth); - - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - if (success) { - Toast.makeText(APPExcetionMailSettingsActivity.this, - "测试邮件发送成功", Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(APPExcetionMailSettingsActivity.this, - "测试邮件发送失败,请检查设置", Toast.LENGTH_SHORT).show(); - } - } - }); - } - }).start(); + mSMTPConfigView = (SMTPConfigView) findViewById(R.id.smtp_config_view); } } diff --git a/appbase/src/main/res/layout/activity_appexcetionmailsettings.xml b/appbase/src/main/res/layout/activity_appexcetionmailsettings.xml index bede039..f5e6525 100644 --- a/appbase/src/main/res/layout/activity_appexcetionmailsettings.xml +++ b/appbase/src/main/res/layout/activity_appexcetionmailsettings.xml @@ -3,148 +3,11 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#FAFAFA" - android:padding="16dp"> + android:background="#FAFAFA"> - + android:layout_height="wrap_content"/> - - - - - - - - - - - - - - - - - - - - - - -