feat(account): Prioritize dedicated name field for IMAP authentication username #28

Refactor account authentication logic to prioritize the `name` field over the `email` field during the IMAP connection phase.

- The `name` field now serves as the primary IMAP login credential and is no longer treated purely as an optional, descriptive field.
- If the `name` field is empty or unset, the system will fall back to using the full `email` address for authentication.
- This change supports IMAP providers that require a username different from the full email address (e.g., employee ID, specific account name).
This commit is contained in:
rustmailer
2025-12-03 03:48:39 +08:00
parent 3a2b42f5c3
commit 454950374f
22 changed files with 25 additions and 7 deletions
Generated
+1 -1
View File
@@ -424,7 +424,7 @@ dependencies = [
[[package]] [[package]]
name = "bichon" name = "bichon"
version = "0.1.1" version = "0.1.2"
dependencies = [ dependencies = [
"ahash", "ahash",
"async-imap", "async-imap",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "bichon" name = "bichon"
version = "0.1.1" version = "0.1.2"
edition = "2021" edition = "2021"
[[bin]] [[bin]]
+3 -2
View File
@@ -67,6 +67,7 @@ impl ImapConnectionManager {
) -> BichonResult<Session<Box<dyn SessionStream>>> { ) -> BichonResult<Session<Box<dyn SessionStream>>> {
assert_eq!(account.account_type, AccountType::IMAP); assert_eq!(account.account_type, AccountType::IMAP);
let imap = account.imap.as_ref().unwrap(); let imap = account.imap.as_ref().unwrap();
let username = account.name.clone().unwrap_or(account.email.clone());
match &imap.auth.auth_type { match &imap.auth.auth_type {
AuthType::Password => { AuthType::Password => {
let password = &imap.auth.password.clone().ok_or_else(|| { let password = &imap.auth.password.clone().ok_or_else(|| {
@@ -77,7 +78,7 @@ impl ImapConnectionManager {
})?; })?;
let password = decrypt!(&password)?; let password = decrypt!(&password)?;
client.login(&account.email, &password).await client.login(&username, &password).await
} }
AuthType::OAuth2 => { AuthType::OAuth2 => {
let record = OAuth2AccessToken::get(self.account_id).await?; let record = OAuth2AccessToken::get(self.account_id).await?;
@@ -89,7 +90,7 @@ impl ImapConnectionManager {
) )
})?; })?;
client client
.authenticate(OAuth2::new(account.email.clone(), access_token)) .authenticate(OAuth2::new(username, access_token))
.await .await
} }
} }
@@ -190,7 +190,7 @@ export function NoSyncAccountDialog({ currentRow, open, onOpenChange }: Props) {
</FormItem> </FormItem>
)} )}
/> />
<FormField {/* <FormField
control={form.control} control={form.control}
name="name" name="name"
render={({ field }) => ( render={({ field }) => (
@@ -205,7 +205,7 @@ export function NoSyncAccountDialog({ currentRow, open, onOpenChange }: Props) {
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} )}
/> /> */}
<FormField <FormField
control={form.control} control={form.control}
name='enabled' name='enabled'
@@ -77,7 +77,7 @@ export default function Step1({ isEdit }: StepProps) {
<FormControl> <FormControl>
<Input placeholder={t('accounts.namePlaceholder')} {...field} /> <Input placeholder={t('accounts.namePlaceholder')} {...field} />
</FormControl> </FormControl>
<FormDescription>{t('accounts.optional')}</FormDescription> <FormDescription>{t('accounts.nameDescription')}</FormDescription>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} )}
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "مثال: john.doe@example.com", "emailPlaceholder": "مثال: john.doe@example.com",
"namePlaceholder": "مثال: john.doe", "namePlaceholder": "مثال: john.doe",
"optional": "اختياري", "optional": "اختياري",
"nameDescription": "اسم مستخدم اتصال IMAP. اترك هذا الحقل فارغًا إذا كنت تستخدم عنوان بريدك الإلكتروني الكامل كاسم مستخدم للاتصال.",
"emailCannotBeModified": "لا يمكن تعديل عنوان حساب البريد الإلكتروني أثناء التحرير.", "emailCannotBeModified": "لا يمكن تعديل عنوان حساب البريد الإلكتروني أثناء التحرير.",
"addAccount": "إضافة حساب", "addAccount": "إضافة حساب",
"updateAccount": "تحديث الحساب", "updateAccount": "تحديث الحساب",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "f.eks. hans.hansen@eksempel.dk", "emailPlaceholder": "f.eks. hans.hansen@eksempel.dk",
"namePlaceholder": "f.eks. Hans Hansen", "namePlaceholder": "f.eks. Hans Hansen",
"optional": "Valgfri", "optional": "Valgfri",
"nameDescription": "IMAP-forbindelsesbrugernavn. Lad dette felt være tomt, hvis du bruger din fulde e-mailadresse som forbindelsesbrugernavn.",
"emailCannotBeModified": "Kontoens e-mailadresse kan ikke ændres under redigering.", "emailCannotBeModified": "Kontoens e-mailadresse kan ikke ændres under redigering.",
"addAccount": "Tilføj konto", "addAccount": "Tilføj konto",
"updateAccount": "Opdater konto", "updateAccount": "Opdater konto",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "z.B. max.mustermann@beispiel.de", "emailPlaceholder": "z.B. max.mustermann@beispiel.de",
"namePlaceholder": "z.B. Max Mustermann", "namePlaceholder": "z.B. Max Mustermann",
"optional": "Optional", "optional": "Optional",
"nameDescription": "IMAP-Verbindungsbenutzername. Lassen Sie dieses Feld leer, wenn Sie Ihre vollständige E-Mail-Adresse als Verbindungsbenutzernamen verwenden.",
"emailCannotBeModified": "Die E-Mail-Adresse des Kontos kann während der Bearbeitung nicht geändert werden.", "emailCannotBeModified": "Die E-Mail-Adresse des Kontos kann während der Bearbeitung nicht geändert werden.",
"addAccount": "Konto hinzufügen", "addAccount": "Konto hinzufügen",
"updateAccount": "Konto aktualisieren", "updateAccount": "Konto aktualisieren",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "e.g john.doe@example.com", "emailPlaceholder": "e.g john.doe@example.com",
"namePlaceholder": "e.g john.doe", "namePlaceholder": "e.g john.doe",
"optional": "Optional", "optional": "Optional",
"nameDescription": "IMAP Connection Username. Leave this field blank if you use your full email address as the connection username.",
"emailCannotBeModified": "The email account address cannot be modified when editing.", "emailCannotBeModified": "The email account address cannot be modified when editing.",
"addAccount": "Add Account", "addAccount": "Add Account",
"updateAccount": "Update Account", "updateAccount": "Update Account",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "ej. juan.perez@ejemplo.com", "emailPlaceholder": "ej. juan.perez@ejemplo.com",
"namePlaceholder": "ej. Juan Pérez", "namePlaceholder": "ej. Juan Pérez",
"optional": "Opcional", "optional": "Opcional",
"nameDescription": "Nombre de usuario de conexión IMAP. Deje este campo en blanco si utiliza su dirección de correo electrónico completa como nombre de usuario de conexión.",
"emailCannotBeModified": "La dirección de correo electrónico de la cuenta no se puede modificar durante la edición.", "emailCannotBeModified": "La dirección de correo electrónico de la cuenta no se puede modificar durante la edición.",
"addAccount": "Añadir cuenta", "addAccount": "Añadir cuenta",
"updateAccount": "Actualizar cuenta", "updateAccount": "Actualizar cuenta",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "esim. matti.meikäläinen@esimerkki.fi", "emailPlaceholder": "esim. matti.meikäläinen@esimerkki.fi",
"namePlaceholder": "esim. matti.meikäläinen", "namePlaceholder": "esim. matti.meikäläinen",
"optional": "Valinnainen", "optional": "Valinnainen",
"nameDescription": "IMAP-yhteyden käyttäjänimi. Jätä tämä kenttä tyhjäksi, jos käytät koko sähköpostiosoitettasi yhteyden käyttäjänimenä.",
"emailCannotBeModified": "Tilin sähköpostiosoitetta ei voi muokata muokkauksen aikana.", "emailCannotBeModified": "Tilin sähköpostiosoitetta ei voi muokata muokkauksen aikana.",
"addAccount": "Lisää tili", "addAccount": "Lisää tili",
"updateAccount": "Päivitä tili", "updateAccount": "Päivitä tili",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "ex. jean.dupont@exemple.com", "emailPlaceholder": "ex. jean.dupont@exemple.com",
"namePlaceholder": "ex. jean.dupont", "namePlaceholder": "ex. jean.dupont",
"optional": "Facultatif", "optional": "Facultatif",
"nameDescription": "Nom d'utilisateur de connexion IMAP. Laissez ce champ vide si vous utilisez votre adresse e-mail complète comme nom d'utilisateur de connexion.",
"emailCannotBeModified": "L'adresse e-mail du compte ne peut pas être modifiée lors de l'édition.", "emailCannotBeModified": "L'adresse e-mail du compte ne peut pas être modifiée lors de l'édition.",
"addAccount": "Ajouter un Compte", "addAccount": "Ajouter un Compte",
"updateAccount": "Mettre à jour le Compte", "updateAccount": "Mettre à jour le Compte",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "es. john.doe@esempio.com", "emailPlaceholder": "es. john.doe@esempio.com",
"namePlaceholder": "es. john.doe", "namePlaceholder": "es. john.doe",
"optional": "Opzionale", "optional": "Opzionale",
"nameDescription": "Nome utente di connessione IMAP. Lasciare vuoto questo campo se si utilizza l'indirizzo email completo come nome utente di connessione.",
"emailCannotBeModified": "L'indirizzo email dell'account non può essere modificato durante la modifica.", "emailCannotBeModified": "L'indirizzo email dell'account non può essere modificato durante la modifica.",
"addAccount": "Aggiungi Account", "addAccount": "Aggiungi Account",
"updateAccount": "Aggiorna Account", "updateAccount": "Aggiorna Account",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "例: john.doe@example.com", "emailPlaceholder": "例: john.doe@example.com",
"namePlaceholder": "例: john.doe", "namePlaceholder": "例: john.doe",
"optional": "オプション", "optional": "オプション",
"nameDescription": "IMAP接続のユーザー名。接続ユーザー名として完全なメールアドレスを使用する場合は、このフィールドを空欄にしてください。",
"emailCannotBeModified": "編集時にはメールアカウントアドレスは変更できません。", "emailCannotBeModified": "編集時にはメールアカウントアドレスは変更できません。",
"addAccount": "アカウントを追加", "addAccount": "アカウントを追加",
"updateAccount": "アカウントを更新", "updateAccount": "アカウントを更新",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "예: john.doe@example.com", "emailPlaceholder": "예: john.doe@example.com",
"namePlaceholder": "예: john.doe", "namePlaceholder": "예: john.doe",
"optional": "선택 사항", "optional": "선택 사항",
"nameDescription": "IMAP 연결 사용자 이름. 전체 이메일 주소를 연결 사용자 이름으로 사용하는 경우, 이 필드를 비워 두십시오.",
"emailCannotBeModified": "편집 시 계정 이메일 주소는 수정할 수 없습니다.", "emailCannotBeModified": "편집 시 계정 이메일 주소는 수정할 수 없습니다.",
"addAccount": "계정 추가", "addAccount": "계정 추가",
"updateAccount": "계정 업데이트", "updateAccount": "계정 업데이트",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "bv. john.doe@voorbeeld.com", "emailPlaceholder": "bv. john.doe@voorbeeld.com",
"namePlaceholder": "bv. john.doe", "namePlaceholder": "bv. john.doe",
"optional": "Optioneel", "optional": "Optioneel",
"nameDescription": "IMAP-verbindingsgebruikersnaam. Laat dit veld leeg als u uw volledige e-mailadres als verbindingsgebruikersnaam gebruikt.",
"emailCannotBeModified": "Het e-mailadres van het account kan niet worden gewijzigd tijdens het bewerken.", "emailCannotBeModified": "Het e-mailadres van het account kan niet worden gewijzigd tijdens het bewerken.",
"addAccount": "Account Toevoegen", "addAccount": "Account Toevoegen",
"updateAccount": "Account Bijwerken", "updateAccount": "Account Bijwerken",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "f.eks. ola.nordmann@eksempel.no", "emailPlaceholder": "f.eks. ola.nordmann@eksempel.no",
"namePlaceholder": "f.eks. ola.nordmann", "namePlaceholder": "f.eks. ola.nordmann",
"optional": "Valgfritt", "optional": "Valgfritt",
"nameDescription": "IMAP-tilkoblingsbrukernavn. La dette feltet stå tomt hvis du bruker hele e-postadressen din som tilkoblingsbrukernavn.",
"emailCannotBeModified": "E-postadressen til kontoen kan ikke endres under redigering.", "emailCannotBeModified": "E-postadressen til kontoen kan ikke endres under redigering.",
"addAccount": "Legg til konto", "addAccount": "Legg til konto",
"updateAccount": "Oppdater konto", "updateAccount": "Oppdater konto",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "Ex: john.doe@example.com", "emailPlaceholder": "Ex: john.doe@example.com",
"namePlaceholder": "Ex: john.doe", "namePlaceholder": "Ex: john.doe",
"optional": "Opcional", "optional": "Opcional",
"nameDescription": "Nome de usuário de conexão IMAP. Deixe este campo em branco se você usar seu endereço de e-mail completo como nome de usuário de conexão.",
"emailCannotBeModified": "O endereço de email da conta não pode ser modificado ao editar.", "emailCannotBeModified": "O endereço de email da conta não pode ser modificado ao editar.",
"addAccount": "Adicionar Conta", "addAccount": "Adicionar Conta",
"updateAccount": "Atualizar Conta", "updateAccount": "Atualizar Conta",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "например, john.doe@example.com", "emailPlaceholder": "например, john.doe@example.com",
"namePlaceholder": "например, john.doe", "namePlaceholder": "например, john.doe",
"optional": "Необязательно", "optional": "Необязательно",
"nameDescription": "Имя пользователя для IMAP-подключения. Оставьте это поле пустым, если вы используете свой полный адрес электронной почты в качестве имени пользователя для подключения.",
"emailCannotBeModified": "Адрес электронной почты нельзя изменить при редактировании.", "emailCannotBeModified": "Адрес электронной почты нельзя изменить при редактировании.",
"addAccount": "Добавить аккаунт", "addAccount": "Добавить аккаунт",
"updateAccount": "Обновить аккаунт", "updateAccount": "Обновить аккаунт",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "t.ex. sven.svensson@exempel.se", "emailPlaceholder": "t.ex. sven.svensson@exempel.se",
"namePlaceholder": "t.ex. sven.svensson", "namePlaceholder": "t.ex. sven.svensson",
"optional": "Valfritt", "optional": "Valfritt",
"nameDescription": "IMAP-anslutningsanvändarnamn. Lämna detta fält tomt om du använder din fullständiga e-postadress som anslutningsanvändarnamn.",
"emailCannotBeModified": "Kontots e-postadress kan inte ändras vid redigering.", "emailCannotBeModified": "Kontots e-postadress kan inte ändras vid redigering.",
"addAccount": "Lägg till konto", "addAccount": "Lägg till konto",
"updateAccount": "Uppdatera konto", "updateAccount": "Uppdatera konto",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "例如:john.doe@example.com", "emailPlaceholder": "例如:john.doe@example.com",
"namePlaceholder": "例如:john.doe", "namePlaceholder": "例如:john.doe",
"optional": "選填", "optional": "選填",
"nameDescription": "IMAP 連線使用者名稱。如果您使用完整的電子郵件地址作為連線使用者名稱,請將此欄位留空。",
"emailCannotBeModified": "編輯時無法修改電子郵件帳號地址。", "emailCannotBeModified": "編輯時無法修改電子郵件帳號地址。",
"addAccount": "新增帳號", "addAccount": "新增帳號",
"updateAccount": "更新帳號", "updateAccount": "更新帳號",
+1
View File
@@ -163,6 +163,7 @@
"emailPlaceholder": "例如:john.doe@example.com", "emailPlaceholder": "例如:john.doe@example.com",
"namePlaceholder": "例如:john.doe", "namePlaceholder": "例如:john.doe",
"optional": "可选", "optional": "可选",
"nameDescription": "IMAP 连接用户名。如果您使用完整的电子邮件地址作为连接用户名,请将此字段留空。",
"emailCannotBeModified": "编辑时无法修改邮箱账户地址。", "emailCannotBeModified": "编辑时无法修改邮箱账户地址。",
"addAccount": "添加账户", "addAccount": "添加账户",
"updateAccount": "更新账户", "updateAccount": "更新账户",