From 4c55366fecdac1d582ef443829c1adeba6136298 Mon Sep 17 00:00:00 2001 From: Song <168455@qq.com> Date: Thu, 9 Jul 2026 16:54:26 +0800 Subject: [PATCH] fix: SMTP default port 465 + corrupt port recovery + click feedback on save buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - default SMTP port 587 -> 465 (SMTPS implicit TLS) - init-collector: auto-correct port < 25 to 465 (previous bug stored 3) - save-email fallback 587 -> 465 - email / SMS-number / SMS-quota save buttons show "✓ 已保存" for 2s Co-Authored-By: Claude Opus 4.8 (1M context) --- .../com/a2i/forwarder/store/SettingsStore.kt | 4 +-- .../forwarder/ui/screens/SettingsScreen.kt | 27 ++++++++++++++++--- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/a2i/forwarder/store/SettingsStore.kt b/app/src/main/java/com/a2i/forwarder/store/SettingsStore.kt index 5d2d42f..c0fd279 100644 --- a/app/src/main/java/com/a2i/forwarder/store/SettingsStore.kt +++ b/app/src/main/java/com/a2i/forwarder/store/SettingsStore.kt @@ -92,7 +92,7 @@ class SettingsStore( // 电邮转发 val emailForwardingEnabled = MutableStateFlow(false) val smtpHost = MutableStateFlow("") - val smtpPort = MutableStateFlow(587) + val smtpPort = MutableStateFlow(465) val smtpUser = MutableStateFlow("") val smtpPassword = MutableStateFlow("") val smtpFrom = MutableStateFlow("") @@ -129,7 +129,7 @@ class SettingsStore( // 电邮转发 emailForwardingEnabled.value = p[K.EMAIL_ENABLED] ?: false smtpHost.value = p[K.EMAIL_HOST] ?: "" - smtpPort.value = p[K.EMAIL_PORT] ?: 587 + smtpPort.value = p[K.EMAIL_PORT]?.let { if (it < 25) 465 else it } ?: 465 smtpUser.value = p[K.EMAIL_USER] ?: "" smtpPassword.value = p[K.EMAIL_PASS] ?: "" smtpFrom.value = p[K.EMAIL_FROM] ?: "" diff --git a/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt b/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt index 9ae5047..232c22a 100644 --- a/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/a2i/forwarder/ui/screens/SettingsScreen.kt @@ -45,6 +45,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -114,6 +115,9 @@ fun SettingsScreen(onOpenLog: () -> Unit) { var smtpPasswordInput by remember(smtpPassword) { mutableStateOf(smtpPassword) } var smtpFromInput by remember(smtpFrom) { mutableStateOf(smtpFrom) } var emailToInput by remember(emailTo) { mutableStateOf(emailTo) } + var emailSaved by remember { mutableStateOf(false) } + var smsNumSaved by remember { mutableStateOf(false) } + var smsQuotaSaved by remember { mutableStateOf(false) } val smsPermLauncher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { } val hasSmsPerm = remember { @@ -228,15 +232,22 @@ fun SettingsScreen(onOpenLog: () -> Unit) { onClick = { app.appScope.launch { app.settings.setSmtpHost(smtpHostInput.trim()) - app.settings.setSmtpPort(smtpPortInput.trim().toIntOrNull() ?: 587) + app.settings.setSmtpPort(smtpPortInput.trim().toIntOrNull() ?: 465) app.settings.setSmtpUser(smtpUserInput.trim()) app.settings.setSmtpPassword(smtpPasswordInput.trim()) app.settings.setSmtpFrom(smtpFromInput.trim()) app.settings.setEmailTo(emailToInput.trim()) } + emailSaved = true }, modifier = Modifier.fillMaxWidth(), - ) { Text("保存电邮设置") } + ) { Text(if (emailSaved) "✓ 已保存" else "保存电邮设置") } + if (emailSaved) { + LaunchedEffect(Unit) { + kotlinx.coroutines.delay(2000) + emailSaved = false + } + } } } } @@ -262,7 +273,11 @@ fun SettingsScreen(onOpenLog: () -> Unit) { Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) { OutlinedButton(onClick = { app.appScope.launch { app.settings.setSmsTargetNumber(smsTargetInput.trim()) } - }, modifier = Modifier.weight(1f)) { Text("保存号码") } + smsNumSaved = true + }, modifier = Modifier.weight(1f)) { Text(if (smsNumSaved) "✓ 已保存" else "保存号码") } + if (smsNumSaved) { + LaunchedEffect(Unit) { kotlinx.coroutines.delay(2000); smsNumSaved = false } + } if (!hasSmsPerm) { OutlinedButton(onClick = { smsPermLauncher.launch(android.Manifest.permission.SEND_SMS) @@ -294,7 +309,11 @@ fun SettingsScreen(onOpenLog: () -> Unit) { app.settings.setSmsBalance(q) if (q > 5) app.settings.setSmsSuspended(false) } - }) { Text("保存额度并解除挂起") } + smsQuotaSaved = true + }) { Text(if (smsQuotaSaved) "✓ 已保存" else "保存额度并解除挂起") } + if (smsQuotaSaved) { + LaunchedEffect(Unit) { kotlinx.coroutines.delay(2000); smsQuotaSaved = false } + } Spacer(Modifier.size(8.dp)) val balanceText = when {