Skip to content

Commit bd57cd0

Browse files
fix(composer): validate recipients (#1310)
## What? Added recipient validation in the composer for `To`, `Cc`, and `Bcc` fields. - Validate email fields with `mail.ParseAddress()` when leaving a recipient field. - Normalize display-name addresses to plain email addresses after validation. - Clear inline validation errors when the user edits the field again. - Block sending when recipient fields are invalid or when no recipients are provided. - Show a composer notice for send-time validation problems. - Added i18n keys for invalid recipient errors. <img width="1400" height="800" alt="view" src="https://github.com/user-attachments/assets/aa69d838-b5ab-48cf-ba89-bab79d1f69c6" /> ## Why? This prevents confusing SMTP failures caused by invalid recipient input and gives users immediate feedback inside the composer. Closes #648 Closes #734 --------- Signed-off-by: drew <me@andrinoff.com> Co-authored-by: Andriy Chernov <andriy@floatpane.com>
1 parent da0785b commit bd57cd0

13 files changed

Lines changed: 407 additions & 13 deletions

File tree

i18n/locales/ar.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@
3939
"exit_confirm": "هل أنت متأكد أنك تريد الخروج؟ سيتم حفظ هذه المسودة",
4040
"sending": "جاري إرسال البريد الإلكتروني...",
4141
"sent": "تم إرسال البريد الإلكتروني بنجاح",
42-
"draft_saved": "تم حفظ المسودة"
42+
"draft_saved": "تم حفظ المسودة",
43+
"invalid_email": "✗ عنوان بريد إلكتروني غير صالح",
44+
"invalid_email_fields": "حقل بريد إلكتروني واحد أو أكثر غير صالح",
45+
"recipient_required": "أضف مستلمًا واحدًا على الأقل"
4346
},
4447
"inbox": {
4548
"title": "صندوق الوارد",

i18n/locales/de.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@
3939
"exit_confirm": "Sind Sie sicher, dass Sie beenden möchten? Dieser Entwurf wird gespeichert",
4040
"sending": "E-Mail wird gesendet...",
4141
"sent": "E-Mail erfolgreich gesendet",
42-
"draft_saved": "Entwurf gespeichert"
42+
"draft_saved": "Entwurf gespeichert",
43+
"invalid_email": "✗ Ungültige E-Mail-Adresse",
44+
"invalid_email_fields": "Ein oder mehrere E-Mail-Felder sind ungültig",
45+
"recipient_required": "Mindestens einen Empfänger hinzufügen"
4346
},
4447
"inbox": {
4548
"title": "Posteingang",

i18n/locales/en.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@
3939
"exit_confirm": "Are you sure you want to exit? This draft will be saved",
4040
"sending": "Sending email...",
4141
"sent": "Email sent successfully",
42-
"draft_saved": "Draft saved"
42+
"draft_saved": "Draft saved",
43+
"invalid_email": "✗ Invalid email address",
44+
"invalid_email_fields": "One or more email fields are invalid",
45+
"recipient_required": "Add at least one recipient"
4346
},
4447
"inbox": {
4548
"title": "Inbox",

i18n/locales/es.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@
3939
"exit_confirm": "¿Está seguro de que desea salir? Este borrador se guardará",
4040
"sending": "Enviando correo...",
4141
"sent": "Correo enviado exitosamente",
42-
"draft_saved": "Borrador guardado"
42+
"draft_saved": "Borrador guardado",
43+
"invalid_email": "✗ Dirección de correo no válida",
44+
"invalid_email_fields": "Uno o más campos de correo son inválidos",
45+
"recipient_required": "Añade al menos un destinatario"
4346
},
4447
"inbox": {
4548
"title": "Bandeja de entrada",

i18n/locales/fr.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@
3939
"exit_confirm": "Êtes-vous sûr de vouloir quitter ? Ce brouillon sera sauvegardé",
4040
"sending": "Envoi de l'e-mail...",
4141
"sent": "E-mail envoyé avec succès",
42-
"draft_saved": "Brouillon sauvegardé"
42+
"draft_saved": "Brouillon sauvegardé",
43+
"invalid_email": "✗ Adresse e-mail invalide",
44+
"invalid_email_fields": "Un ou plusieurs champs e-mail sont invalides",
45+
"recipient_required": "Ajoutez au moins un destinataire"
4346
},
4447
"inbox": {
4548
"title": "Boîte de réception",

i18n/locales/ja.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@
3939
"exit_confirm": "終了してもよろしいですか?この下書きは保存されます",
4040
"sending": "メール送信中...",
4141
"sent": "メールが正常に送信されました",
42-
"draft_saved": "下書きを保存しました"
42+
"draft_saved": "下書きを保存しました",
43+
"invalid_email": "✗ 無効なメールアドレス",
44+
"invalid_email_fields": "1つ以上のメールフィールドが無効です",
45+
"recipient_required": "少なくとも1人の宛先を追加してください"
4346
},
4447
"inbox": {
4548
"title": "受信トレイ",

i18n/locales/pl.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@
3939
"exit_confirm": "Czy na pewno chcesz wyjść? Ten szkic zostanie zapisany",
4040
"sending": "Wysyłanie wiadomości...",
4141
"sent": "Wiadomość wysłana pomyślnie",
42-
"draft_saved": "Szkic zapisany"
42+
"draft_saved": "Szkic zapisany",
43+
"invalid_email": "✗ Nieprawidłowy adres e-mail",
44+
"invalid_email_fields": "Jedno lub więcej pól e-mail jest nieprawidłowych",
45+
"recipient_required": "Dodaj co najmniej jednego odbiorcę"
4346
},
4447
"inbox": {
4548
"title": "Skrzynka odbiorcza",

i18n/locales/pt.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@
3939
"exit_confirm": "Tem certeza de que deseja sair? Este rascunho será salvo",
4040
"sending": "Enviando e-mail...",
4141
"sent": "E-mail enviado com sucesso",
42-
"draft_saved": "Rascunho salvo"
42+
"draft_saved": "Rascunho salvo",
43+
"invalid_email": "✗ Endereço de e-mail inválido",
44+
"invalid_email_fields": "Um ou mais campos de e-mail são inválidos",
45+
"recipient_required": "Adicione pelo menos um destinatário"
4346
},
4447
"inbox": {
4548
"title": "Caixa de entrada",

i18n/locales/ru.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@
3939
"exit_confirm": "Вы уверены, что хотите выйти? Этот черновик будет сохранён",
4040
"sending": "Отправка письма...",
4141
"sent": "Письмо успешно отправлено",
42-
"draft_saved": "Черновик сохранён"
42+
"draft_saved": "Черновик сохранён",
43+
"invalid_email": "✗ Неверный адрес электронной почты",
44+
"invalid_email_fields": "Одно или несколько полей электронной почты недействительны",
45+
"recipient_required": "Добавьте хотя бы одного получателя"
4346
},
4447
"inbox": {
4548
"title": "Входящие",

i18n/locales/uk.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@
3939
"exit_confirm": "Ви впевнені, що хочете вийти? Цей чернетку буде збережено",
4040
"sending": "Відправлення листа...",
4141
"sent": "Лист успішно надіслано",
42-
"draft_saved": "Чернетку збережено"
42+
"draft_saved": "Чернетку збережено",
43+
"invalid_email": "✗ Недійсна електронна адреса",
44+
"invalid_email_fields": "Одне або кілька полів електронної пошти недійсні",
45+
"recipient_required": "Додайте принаймні одного отримувача"
4346
},
4447
"inbox": {
4548
"title": "Вхідні",

0 commit comments

Comments
 (0)