Feature: recipient autocomplete from Sent, with on-demand server search

Compose recipient fields only suggested existing contacts and directory
users, so people you had emailed before but never saved as a contact
never came up. This adds an Outlook-Web-style suggestion flow.

On startup the Sent folder is read once (metadata only) to build a cache
of addresses you have written to; those are merged into the autocomplete
after contacts and directory principals, deduped, contacts winning.

When the recipient is not in the cache, the dropdown offers a "search the
server" row that queries the Sent folder on demand. That lookup fetches
only the to/cc fields (no subject, body or attachments) and returns the
matching addresses, deduped.

New strings are added to all 20 locales.
This commit is contained in:
dealerweb
2026-07-04 14:56:49 +02:00
committed by Linus Rath
parent 4d6b4b5b8e
commit e6aa79ed94
26 changed files with 302 additions and 26 deletions
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Upravit e-mailovou adresu",
"recipient_edit_name": "Upravit zobrazované jméno",
"recipient_email_placeholder": "E-mailová adresa",
"recipient_name_placeholder": "Zobrazované jméno"
"recipient_name_placeholder": "Zobrazované jméno",
"autocomplete_search_server": "Hledat na serveru",
"autocomplete_searching": "Hledání..."
},
"confirm_dialog": {
"confirm": "Potvrdit",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Rediger e-mailadresse",
"recipient_edit_name": "Rediger visningsnavn",
"recipient_email_placeholder": "E-mailadresse",
"recipient_name_placeholder": "Visningsnavn"
"recipient_name_placeholder": "Visningsnavn",
"autocomplete_search_server": "Søg på serveren",
"autocomplete_searching": "Søger..."
},
"confirm_dialog": {
"confirm": "Bekræft",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "E-Mail-Adresse bearbeiten",
"recipient_edit_name": "Anzeigenamen bearbeiten",
"recipient_email_placeholder": "E-Mail-Adresse",
"recipient_name_placeholder": "Anzeigename"
"recipient_name_placeholder": "Anzeigename",
"autocomplete_search_server": "Auf dem Server suchen",
"autocomplete_searching": "Suche läuft..."
},
"confirm_dialog": {
"confirm": "Bestätigen",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Edit email address",
"recipient_edit_name": "Edit display name",
"recipient_email_placeholder": "Email address",
"recipient_name_placeholder": "Display name"
"recipient_name_placeholder": "Display name",
"autocomplete_search_server": "Search the server",
"autocomplete_searching": "Searching..."
},
"confirm_dialog": {
"confirm": "Confirm",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Editar dirección de correo",
"recipient_edit_name": "Editar nombre para mostrar",
"recipient_email_placeholder": "Dirección de correo",
"recipient_name_placeholder": "Nombre para mostrar"
"recipient_name_placeholder": "Nombre para mostrar",
"autocomplete_search_server": "Buscar en el servidor",
"autocomplete_searching": "Buscando..."
},
"confirm_dialog": {
"confirm": "Confirmar",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "ویرایش آدرس ایمیل",
"recipient_edit_name": "ویرایش نام نمایشی",
"recipient_email_placeholder": "آدرس ایمیل",
"recipient_name_placeholder": "نام نمایشی"
"recipient_name_placeholder": "نام نمایشی",
"autocomplete_search_server": "جستجو در سرور",
"autocomplete_searching": "در حال جستجو..."
},
"confirm_dialog": {
"confirm": "تأیید",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Modifier l'adresse e-mail",
"recipient_edit_name": "Modifier le nom d'affichage",
"recipient_email_placeholder": "Adresse e-mail",
"recipient_name_placeholder": "Nom d'affichage"
"recipient_name_placeholder": "Nom d'affichage",
"autocomplete_search_server": "Rechercher sur le serveur",
"autocomplete_searching": "Recherche en cours..."
},
"confirm_dialog": {
"confirm": "Confirmer",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "E-mail-cím szerkesztése",
"recipient_edit_name": "Megjelenített név szerkesztése",
"recipient_email_placeholder": "E-mail-cím",
"recipient_name_placeholder": "Megjelenített név"
"recipient_name_placeholder": "Megjelenített név",
"autocomplete_search_server": "Keresés a kiszolgálón",
"autocomplete_searching": "Keresés..."
},
"confirm_dialog": {
"confirm": "Megerősítés",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Modifica indirizzo email",
"recipient_edit_name": "Modifica nome visualizzato",
"recipient_email_placeholder": "Indirizzo email",
"recipient_name_placeholder": "Nome visualizzato"
"recipient_name_placeholder": "Nome visualizzato",
"autocomplete_search_server": "Cerca nel server",
"autocomplete_searching": "Ricerca in corso..."
},
"confirm_dialog": {
"confirm": "Conferma",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "メールアドレスを編集",
"recipient_edit_name": "表示名を編集",
"recipient_email_placeholder": "メールアドレス",
"recipient_name_placeholder": "表示名"
"recipient_name_placeholder": "表示名",
"autocomplete_search_server": "サーバーを検索",
"autocomplete_searching": "検索中..."
},
"confirm_dialog": {
"confirm": "確認",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "이메일 주소 편집",
"recipient_edit_name": "표시 이름 편집",
"recipient_email_placeholder": "이메일 주소",
"recipient_name_placeholder": "표시 이름"
"recipient_name_placeholder": "표시 이름",
"autocomplete_search_server": "서버에서 검색",
"autocomplete_searching": "검색 중..."
},
"confirm_dialog": {
"confirm": "확인",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Rediģēt e-pasta adresi",
"recipient_edit_name": "Rediģēt parādāmo vārdu",
"recipient_email_placeholder": "E-pasta adrese",
"recipient_name_placeholder": "Parādāmais vārds"
"recipient_name_placeholder": "Parādāmais vārds",
"autocomplete_search_server": "Meklēt serverī",
"autocomplete_searching": "Meklē..."
},
"confirm_dialog": {
"confirm": "Apstiprināt",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "E-mailadres bewerken",
"recipient_edit_name": "Weergavenaam bewerken",
"recipient_email_placeholder": "E-mailadres",
"recipient_name_placeholder": "Weergavenaam"
"recipient_name_placeholder": "Weergavenaam",
"autocomplete_search_server": "Op de server zoeken",
"autocomplete_searching": "Bezig met zoeken..."
},
"confirm_dialog": {
"confirm": "Bevestigen",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Edytuj adres e-mail",
"recipient_edit_name": "Edytuj wyświetlaną nazwę",
"recipient_email_placeholder": "Adres e-mail",
"recipient_name_placeholder": "Wyświetlana nazwa"
"recipient_name_placeholder": "Wyświetlana nazwa",
"autocomplete_search_server": "Szukaj na serwerze",
"autocomplete_searching": "Wyszukiwanie..."
},
"confirm_dialog": {
"confirm": "Potwierdź",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Editar endereço de e-mail",
"recipient_edit_name": "Editar nome de exibição",
"recipient_email_placeholder": "Endereço de e-mail",
"recipient_name_placeholder": "Nome de exibição"
"recipient_name_placeholder": "Nome de exibição",
"autocomplete_search_server": "Pesquisar no servidor",
"autocomplete_searching": "Pesquisando..."
},
"confirm_dialog": {
"confirm": "Confirmar",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Editați adresa de e-mail",
"recipient_edit_name": "Editați numele afișat",
"recipient_email_placeholder": "Adresă de e-mail",
"recipient_name_placeholder": "Numele afișat"
"recipient_name_placeholder": "Numele afișat",
"autocomplete_search_server": "Caută pe server",
"autocomplete_searching": "Se caută..."
},
"confirm_dialog": {
"confirm": "Confirmare",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Изменить адрес эл. почты",
"recipient_edit_name": "Изменить отображаемое имя",
"recipient_email_placeholder": "Адрес эл. почты",
"recipient_name_placeholder": "Отображаемое имя"
"recipient_name_placeholder": "Отображаемое имя",
"autocomplete_search_server": "Искать на сервере",
"autocomplete_searching": "Поиск..."
},
"confirm_dialog": {
"confirm": "Подтвердить",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "E-posta adresini düzenle",
"recipient_edit_name": "Görünen adı düzenle",
"recipient_email_placeholder": "E-posta adresi",
"recipient_name_placeholder": "Görünen ad"
"recipient_name_placeholder": "Görünen ad",
"autocomplete_search_server": "Sunucuda ara",
"autocomplete_searching": "Aranıyor..."
},
"confirm_dialog": {
"confirm": "Onayla",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "Змінити адресу ел. пошти",
"recipient_edit_name": "Змінити відображуване ім'я",
"recipient_email_placeholder": "Адреса ел. пошти",
"recipient_name_placeholder": "Відображуване ім'я"
"recipient_name_placeholder": "Відображуване ім'я",
"autocomplete_search_server": "Шукати на сервері",
"autocomplete_searching": "Пошук..."
},
"confirm_dialog": {
"confirm": "Підтвердити",
+3 -1
View File
@@ -677,7 +677,9 @@
"recipient_edit_email": "编辑电子邮件地址",
"recipient_edit_name": "编辑显示名称",
"recipient_email_placeholder": "电子邮件地址",
"recipient_name_placeholder": "显示名称"
"recipient_name_placeholder": "显示名称",
"autocomplete_search_server": "在服务器上搜索",
"autocomplete_searching": "搜索中..."
},
"confirm_dialog": {
"confirm": "确认",