Gmail sync (SPEC: Gmail sync): - Provider fetches X-GM-LABELS when X-GM-EXT-1 is advertised; parses custom labels (system labels dropped, mUTF-7 decoded) onto RemoteMessage. - Engine syncs only system folders + All Mail for Gmail, skips every label folder, and dedupes the All Mail pass by Message-ID — kills the INBOX/All-Mail duplication. - Custom labels ride the message.new event; the labels plugin subscribes and maps them to chips as "<name> [Gmail]" (per-message + thread aggregate + known set), so labels fill in gradually with the sync window. Non-ASCII labels decode right. Labels self-healing (message-driven reconcile): - Per-message keys are the source of truth; t: aggregates and _labels are derived. Reconcile drops labels of deleted messages, regroups survivors by their current thread (fixing JWZ thread merges), rewrites changed t: keys, and rebuilds _labels from live messages — keeping user labels, dropping orphaned Gmail ones. - New SDK reads: sdk.threads.existing / sdk.messages.threads_of. Sidebar refreshes live via a plugin.labels.changed WS event on new labels. Account deletion: prune threads left empty after the cascade (they were user-scoped, so only messages cascaded) + de-list the account from surviving cross-account threads. Sync SPAM: opt-in per-account sync_spam (migration 0015, default off) — the engine skips the Junk folder in backfill and poll unless enabled; wizard checkbox added. Robustness / UX: - WebSocket auto-reconnects with backoff and resyncs on (re)connect, and account add/delete invalidates threads/labels — no more hard refresh for live updates. - Backfill banner + sidebar ring also require done < total, so a completed account can't leave a stuck "X of X". - Scrub lone UTF-16 surrogates from parsed headers/bodies so bad messages no longer crash the backfill on Postgres text/JSONB. - Ultimo signet logo in the Mail/Calendar/Contacts sidebar header (and at the top of the collapsed rail), via the shared plugin-ui.css + MailLayout. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U72FZiF1W1pb8XxyWBTREA
129 lines
4.7 KiB
YAML
129 lines
4.7 KiB
YAML
# Provider presets (config, not code) — SPEC §6.2 step 1.
|
|
# Matched by the domain of the email address. Each entry gives IMAP + SMTP
|
|
# host/port/tls, the auth kind, and an oauth provider id when applicable.
|
|
# tls: "ssl" (implicit TLS) | "starttls"; auth: "password" | "oauth2".
|
|
#
|
|
# auth_strategy (SPEC §6.2.1): ordered list of the credential flows the wizard
|
|
# offers, first = default. Values: app_password | oauth2 | password.
|
|
# - app_password → renders the ProviderCredentialPanel keyed by help.help_id
|
|
# (deep-link + guide + paste + test); the value is used as a normal IMAP/SMTP
|
|
# password, so it reuses the plain-password sync path (zero new sync code).
|
|
# - oauth2 → XOAUTH2 (M2); for Google it is the *fallback* offered when the app
|
|
# password path fails and GOOGLE_OAUTH_ENABLED is set.
|
|
# - password → the generic password box (self-hosted / ISP accounts).
|
|
# help (SPEC §6.2.2/6.2.3): data for the panel. steps are i18n message keys so
|
|
# the copy is translatable; app_name_hint is a suggested app-password label.
|
|
|
|
providers:
|
|
google:
|
|
domains: [gmail.com, googlemail.com]
|
|
imap: { host: imap.gmail.com, port: 993, tls: ssl }
|
|
smtp: { host: smtp.gmail.com, port: 465, tls: ssl }
|
|
auth: password
|
|
auth_strategy: [app_password, oauth2]
|
|
oauth_provider: google
|
|
help:
|
|
help_id: gmail
|
|
deep_link: https://myaccount.google.com/apppasswords
|
|
setup_link: https://myaccount.google.com/signinoptions/two-step-verification
|
|
app_name_hint: "ultimo.email"
|
|
button_after_step: 2
|
|
docs_url: https://support.google.com/mail/answer/185833
|
|
steps:
|
|
- wizard.help.gmail.step1
|
|
- wizard.help.gmail.step2
|
|
- wizard.help.gmail.step3
|
|
- wizard.help.gmail.step4
|
|
|
|
microsoft:
|
|
domains: [outlook.com, hotmail.com, live.com, msn.com]
|
|
imap: { host: outlook.office365.com, port: 993, tls: ssl }
|
|
smtp: { host: smtp.office365.com, port: 587, tls: starttls }
|
|
auth: password
|
|
auth_strategy: [app_password, oauth2]
|
|
oauth_provider: microsoft
|
|
help:
|
|
help_id: outlook
|
|
deep_link: https://account.microsoft.com/security
|
|
app_name_hint: "Webmail"
|
|
docs_url: https://support.microsoft.com/account-billing/using-app-passwords-with-apps-that-don-t-support-two-step-verification-5896ed9b-4263-e681-128a-a6f2979a7944
|
|
steps:
|
|
- wizard.help.outlook.step1
|
|
- wizard.help.outlook.step2
|
|
- wizard.help.outlook.step3
|
|
|
|
office365:
|
|
domains: [office365.com]
|
|
imap: { host: outlook.office365.com, port: 993, tls: ssl }
|
|
smtp: { host: smtp.office365.com, port: 587, tls: starttls }
|
|
auth: oauth2
|
|
auth_strategy: [oauth2]
|
|
oauth_provider: microsoft
|
|
|
|
yahoo:
|
|
domains: [yahoo.com, yahoo.co.uk, ymail.com, rocketmail.com]
|
|
imap: { host: imap.mail.yahoo.com, port: 993, tls: ssl }
|
|
smtp: { host: smtp.mail.yahoo.com, port: 465, tls: ssl }
|
|
auth: password
|
|
auth_strategy: [app_password]
|
|
help:
|
|
help_id: yahoo
|
|
deep_link: https://login.yahoo.com/account/security/app-passwords
|
|
app_name_hint: "Webmail"
|
|
docs_url: https://help.yahoo.com/kb/SLN15241.html
|
|
steps:
|
|
- wizard.help.yahoo.step1
|
|
- wizard.help.yahoo.step2
|
|
- wizard.help.yahoo.step3
|
|
|
|
icloud:
|
|
domains: [icloud.com, me.com, mac.com]
|
|
imap: { host: imap.mail.me.com, port: 993, tls: ssl }
|
|
smtp: { host: smtp.mail.me.com, port: 587, tls: starttls }
|
|
auth: password
|
|
auth_strategy: [app_password]
|
|
help:
|
|
help_id: icloud
|
|
deep_link: https://account.apple.com/account/manage
|
|
app_name_hint: "Webmail"
|
|
docs_url: https://support.apple.com/102654
|
|
steps:
|
|
- wizard.help.icloud.step1
|
|
- wizard.help.icloud.step2
|
|
- wizard.help.icloud.step3
|
|
|
|
gmx:
|
|
domains: [gmx.com, gmx.net, gmx.de]
|
|
imap: { host: imap.gmx.com, port: 993, tls: ssl }
|
|
smtp: { host: mail.gmx.com, port: 587, tls: starttls }
|
|
auth: password
|
|
auth_strategy: [password]
|
|
|
|
wp:
|
|
domains: [wp.pl]
|
|
imap: { host: imap.wp.pl, port: 993, tls: ssl }
|
|
smtp: { host: smtp.wp.pl, port: 465, tls: ssl }
|
|
auth: password
|
|
auth_strategy: [password]
|
|
|
|
onet:
|
|
domains: [onet.pl, poczta.onet.pl, op.pl]
|
|
imap: { host: imap.poczta.onet.pl, port: 993, tls: ssl }
|
|
smtp: { host: smtp.poczta.onet.pl, port: 465, tls: ssl }
|
|
auth: password
|
|
auth_strategy: [password]
|
|
|
|
o2:
|
|
domains: [o2.pl, tlen.pl]
|
|
imap: { host: imap.poczta.o2.pl, port: 993, tls: ssl }
|
|
smtp: { host: smtp.poczta.o2.pl, port: 465, tls: ssl }
|
|
auth: password
|
|
auth_strategy: [password]
|
|
|
|
interia:
|
|
domains: [interia.pl, interia.eu]
|
|
imap: { host: imap.poczta.interia.pl, port: 993, tls: ssl }
|
|
smtp: { host: smtp.poczta.interia.pl, port: 465, tls: ssl }
|
|
auth: password
|
|
auth_strategy: [password]
|