diff --git a/internal/web/service/email/email.go b/internal/web/service/email/email.go index df7892588..f35be585e 100644 --- a/internal/web/service/email/email.go +++ b/internal/web/service/email/email.go @@ -117,6 +117,9 @@ func (s *EmailService) TestConnection() SMTPTestResult { if from == "" { from = username } + if from == "" { + return SMTPTestResult{false, "send", "smtpFromNotConfigured"} + } from, fromName = resolveFrom(from, fromName) recipients := parseRecipients(toStr) diff --git a/internal/web/service/email/email_test.go b/internal/web/service/email/email_test.go index 15a461306..d32ad3fff 100644 --- a/internal/web/service/email/email_test.go +++ b/internal/web/service/email/email_test.go @@ -180,6 +180,31 @@ func TestSendUsesBareAddressFromNameAddrSmtpFrom(t *testing.T) { } } +func TestConnectionReportsMissingFrom(t *testing.T) { + if err := database.InitDB(filepath.Join(t.TempDir(), "x-ui.db")); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = database.CloseDB() }) + + settingService := service.SettingService{} + mustSet := func(name string, err error) { + t.Helper() + if err != nil { + t.Fatalf("set %s: %v", name, err) + } + } + mustSet("host", settingService.SetSmtpHost("127.0.0.1")) + mustSet("port", settingService.SetSmtpPort(1)) + mustSet("to", settingService.SetSmtpTo("admin@example.com")) + mustSet("encryption", settingService.SetSmtpEncryptionType("none")) + + got := NewEmailService(settingService).TestConnection() + want := SMTPTestResult{Success: false, Stage: "send", Message: "smtpFromNotConfigured"} + if got != want { + t.Errorf("TestConnection() = %+v, want %+v", got, want) + } +} + func TestBuildMessageStripsHeaderInjection(t *testing.T) { raw := buildMessage( "panel@example.com\r\nBcc: evil@example.com", diff --git a/internal/web/translation/ar-EG.json b/internal/web/translation/ar-EG.json index 25c9386a7..cb9ef1d13 100644 --- a/internal/web/translation/ar-EG.json +++ b/internal/web/translation/ar-EG.json @@ -1410,6 +1410,7 @@ "smtpTestSuccess": "تم إرسال البريد التجريبي بنجاح", "smtpHostNotConfigured": "خادم SMTP غير مهيأ", "smtpNoRecipients": "لا يوجد مستلمون مهيؤون", + "smtpFromNotConfigured": "عنوان مرسل SMTP غير مُهيأ", "eventLoginAttempt": "محاولة تسجيل دخول", "telegramTokenConfigured": "مهيأ؛ اتركه فارغاً للاحتفاظ بالتوكن الحالي.", "telegramTokenPlaceholder": "مهيأ — أدخل توكن جديد لاستبداله", diff --git a/internal/web/translation/en-US.json b/internal/web/translation/en-US.json index 7e663f99f..6cbbdf547 100644 --- a/internal/web/translation/en-US.json +++ b/internal/web/translation/en-US.json @@ -1529,6 +1529,7 @@ "smtpTestSuccess": "Test email sent successfully", "smtpHostNotConfigured": "SMTP host not configured", "smtpNoRecipients": "No recipients configured", + "smtpFromNotConfigured": "SMTP sender address not configured", "eventLoginAttempt": "Login attempt", "telegramTokenConfigured": "Configured; leave blank to keep current token.", "telegramTokenPlaceholder": "Configured - enter a new token to replace", diff --git a/internal/web/translation/es-ES.json b/internal/web/translation/es-ES.json index 15b713b83..d02c6fbd1 100644 --- a/internal/web/translation/es-ES.json +++ b/internal/web/translation/es-ES.json @@ -1410,6 +1410,7 @@ "smtpTestSuccess": "Correo de prueba enviado correctamente", "smtpHostNotConfigured": "Servidor SMTP no configurado", "smtpNoRecipients": "No hay destinatarios configurados", + "smtpFromNotConfigured": "La dirección del remitente SMTP no está configurada", "eventLoginAttempt": "Intento de inicio de sesión", "telegramTokenConfigured": "Configurado; deje en blanco para mantener el token actual.", "telegramTokenPlaceholder": "Configurado: introduzca un nuevo token para reemplazarlo", diff --git a/internal/web/translation/fa-IR.json b/internal/web/translation/fa-IR.json index ac77b0063..4f0afade8 100644 --- a/internal/web/translation/fa-IR.json +++ b/internal/web/translation/fa-IR.json @@ -1412,6 +1412,7 @@ "smtpTestSuccess": "ایمیل آزمایشی با موفقیت ارسال شد", "smtpHostNotConfigured": "میزبان SMTP پیکربندی نشده است", "smtpNoRecipients": "هیچ گیرنده‌ای پیکربندی نشده است", + "smtpFromNotConfigured": "آدرس فرستنده SMTP پیکربندی نشده است", "eventLoginAttempt": "تلاش برای ورود", "telegramTokenConfigured": "پیکربندی شده؛ برای حفظ توکن فعلی خالی بگذارید.", "telegramTokenPlaceholder": "پیکربندی شده - برای جایگزینی، توکن جدید وارد کنید", diff --git a/internal/web/translation/id-ID.json b/internal/web/translation/id-ID.json index 7bc8afd84..eb03de17b 100644 --- a/internal/web/translation/id-ID.json +++ b/internal/web/translation/id-ID.json @@ -1410,6 +1410,7 @@ "smtpTestSuccess": "Email uji berhasil dikirim", "smtpHostNotConfigured": "Host SMTP belum dikonfigurasi", "smtpNoRecipients": "Tidak ada penerima yang dikonfigurasi", + "smtpFromNotConfigured": "Alamat pengirim SMTP belum dikonfigurasi", "eventLoginAttempt": "Percobaan masuk", "telegramTokenConfigured": "Terkonfigurasi; kosongkan untuk mempertahankan token saat ini.", "telegramTokenPlaceholder": "Terkonfigurasi - masukkan token baru untuk mengganti", diff --git a/internal/web/translation/ja-JP.json b/internal/web/translation/ja-JP.json index 52ed541d7..5db908bb2 100644 --- a/internal/web/translation/ja-JP.json +++ b/internal/web/translation/ja-JP.json @@ -1410,6 +1410,7 @@ "smtpTestSuccess": "テストメールを正常に送信しました", "smtpHostNotConfigured": "SMTPホストが設定されていません", "smtpNoRecipients": "受信者が設定されていません", + "smtpFromNotConfigured": "SMTP送信者アドレスが設定されていません", "eventLoginAttempt": "ログイン試行", "telegramTokenConfigured": "設定済み。現在のトークンを維持する場合は空欄のままにしてください。", "telegramTokenPlaceholder": "設定済み - 置き換えるには新しいトークンを入力してください", diff --git a/internal/web/translation/pt-BR.json b/internal/web/translation/pt-BR.json index f83edf7fc..d37e994dc 100644 --- a/internal/web/translation/pt-BR.json +++ b/internal/web/translation/pt-BR.json @@ -1410,6 +1410,7 @@ "smtpTestSuccess": "E-mail de teste enviado com sucesso", "smtpHostNotConfigured": "Servidor SMTP não configurado", "smtpNoRecipients": "Nenhum destinatário configurado", + "smtpFromNotConfigured": "Endereço do remetente SMTP não configurado", "eventLoginAttempt": "Tentativa de login", "telegramTokenConfigured": "Configurado; deixe em branco para manter o token atual.", "telegramTokenPlaceholder": "Configurado - insira um novo token para substituir", diff --git a/internal/web/translation/ru-RU.json b/internal/web/translation/ru-RU.json index 490b07731..0c2819e03 100644 --- a/internal/web/translation/ru-RU.json +++ b/internal/web/translation/ru-RU.json @@ -1410,6 +1410,7 @@ "smtpTestSuccess": "Тестовое письмо отправлено успешно", "smtpHostNotConfigured": "SMTP хост не настроен", "smtpNoRecipients": "Получатели не настроены", + "smtpFromNotConfigured": "Адрес отправителя SMTP не настроен", "eventLoginAttempt": "Попытка входа", "telegramTokenConfigured": "Настроен; оставьте пустым для сохранения текущего токена.", "telegramTokenPlaceholder": "Настроен - введите новый токен для замены", diff --git a/internal/web/translation/tr-TR.json b/internal/web/translation/tr-TR.json index 1194e34ee..a4cb27321 100644 --- a/internal/web/translation/tr-TR.json +++ b/internal/web/translation/tr-TR.json @@ -1410,6 +1410,7 @@ "smtpTestSuccess": "Test e-postası başarıyla gönderildi", "smtpHostNotConfigured": "SMTP sunucusu yapılandırılmamış", "smtpNoRecipients": "Yapılandırılmış alıcı yok", + "smtpFromNotConfigured": "SMTP gönderen adresi yapılandırılmamış", "eventLoginAttempt": "Oturum açma denemesi", "telegramTokenConfigured": "Yapılandırıldı; mevcut belirteci korumak için boş bırakın.", "telegramTokenPlaceholder": "Yapılandırıldı - değiştirmek için yeni bir belirteç girin", diff --git a/internal/web/translation/uk-UA.json b/internal/web/translation/uk-UA.json index 6602896ee..08b52ba69 100644 --- a/internal/web/translation/uk-UA.json +++ b/internal/web/translation/uk-UA.json @@ -1410,6 +1410,7 @@ "smtpTestSuccess": "Тестовий лист успішно надіслано", "smtpHostNotConfigured": "Хост SMTP не налаштовано", "smtpNoRecipients": "Отримувачів не налаштовано", + "smtpFromNotConfigured": "Адресу відправника SMTP не налаштовано", "eventLoginAttempt": "Спроба входу", "telegramTokenConfigured": "Налаштовано; залиште порожнім, щоб зберегти поточний токен.", "telegramTokenPlaceholder": "Налаштовано — введіть новий токен для заміни", diff --git a/internal/web/translation/vi-VN.json b/internal/web/translation/vi-VN.json index b1b6948ca..9b48701be 100644 --- a/internal/web/translation/vi-VN.json +++ b/internal/web/translation/vi-VN.json @@ -1410,6 +1410,7 @@ "smtpTestSuccess": "Đã gửi email thử nghiệm thành công", "smtpHostNotConfigured": "Chưa cấu hình máy chủ SMTP", "smtpNoRecipients": "Chưa cấu hình người nhận", + "smtpFromNotConfigured": "Chưa cấu hình địa chỉ người gửi SMTP", "eventLoginAttempt": "Lần thử đăng nhập", "telegramTokenConfigured": "Đã cấu hình; để trống để giữ token hiện tại.", "telegramTokenPlaceholder": "Đã cấu hình - nhập token mới để thay thế", diff --git a/internal/web/translation/zh-CN.json b/internal/web/translation/zh-CN.json index 35a71c7bb..3ad4673e5 100644 --- a/internal/web/translation/zh-CN.json +++ b/internal/web/translation/zh-CN.json @@ -1410,6 +1410,7 @@ "smtpTestSuccess": "测试邮件发送成功", "smtpHostNotConfigured": "尚未配置 SMTP 主机", "smtpNoRecipients": "尚未配置收件人", + "smtpFromNotConfigured": "未配置 SMTP 发件人地址", "eventLoginAttempt": "登录尝试", "telegramTokenConfigured": "已配置;留空则保留当前令牌。", "telegramTokenPlaceholder": "已配置——输入新令牌以替换", diff --git a/internal/web/translation/zh-TW.json b/internal/web/translation/zh-TW.json index cfe915589..ebd8e1b5d 100644 --- a/internal/web/translation/zh-TW.json +++ b/internal/web/translation/zh-TW.json @@ -1410,6 +1410,7 @@ "smtpTestSuccess": "測試郵件已成功傳送", "smtpHostNotConfigured": "尚未設定 SMTP 主機", "smtpNoRecipients": "尚未設定收件人", + "smtpFromNotConfigured": "未設定 SMTP 寄件人地址", "eventLoginAttempt": "登入嘗試", "telegramTokenConfigured": "已設定;留空以保留目前的權杖。", "telegramTokenPlaceholder": "已設定 - 輸入新權杖以取代",