KamoCRM

Sincronizzazione reale di calendari e contatti — Google, Microsoft 365, iCloud, CalDAV/CardDAV

FeatureEmailService
Shipped
15 novembre 2026 alle ore 10:00 UTC
Author
Kamo
Commit
3b85588

Impostazioni › Email › CalDAV/CardDAV salvava le connessioni esterne e mostrava "Ultimo "Non sincronizzato" per una sincronizzazione che non ha recuperato nulla (i lavori di DaemonService hanno bloccato i contatori e ha contrassegnato tutto come IDLE; le classi dei provider erano TODO) Li sincronizza in tempo reale (groupware/sync): - CalDAV/CardDAV: scoperta (indirizzo → principale → home set → collezioni, con /.fallback ben noto, un indirizzo di calendario singolo incollato funziona), CTag/sync-token check, calendar-query ETag lista (ultimi 366 giorni), multiget di ciò che è cambiato, PUT/DELETE con If-Match/If-None-Match. iCloud imposta di default i suoi indirizzi. - Google Calendar + Persone, Microsoft Calendari grafici + contatti sulla concessione /oauth memorizza il flusso; i token aggiornati (e i token di aggiornamento ruotati mantenuti) con un Scrive che sostituisce solo l'esatto blob che ha aggiornato. - Gli eventi atterrano tramite IcsImportService.upsert (serie, eccezioni, EXDATEs) e Contatti tramite ContactService + ContactDetailStore — nessun invito, nessun Promemoria, nessuna tabella grezza scrive. - La contabilità per collezione / elemento (nuove tabelle groupware_sync_*) fornisce aggiornamenti, Cancellazioni e a due vie: tirare prima (la copia esterna vince un pareggio), poi spingere Kamo Modifica/crea/cancella quando l'integrazione è bidirezionale e la raccolta Guardie: nulla rimosso su un elenco non riuscito o sospettamente vuoto, niente Kamo non importava, niente che invecchiasse solo fuori dalla finestra; un passaggio Una richiesta che cancellerebbe la maggior parte di una collezione là fuori è rifiutata. - Lo stato è onesto: SYNCING durante l'esecuzione, IDLE + lastSyncedAt solo dopo un pieno fetch, ERROR + plain-words errorMessage altrimenti; scritto colonna per colonna così Per-collezione lastError e i conteggi sono in Il payload delle impostazioni (syncSupported, calendarsSynced, eventsSynced, addressBooksSynced, contactsSynced, collezioni[]). - Schedulazione: **************** (orologio di DaemonService) e /integrations/{id} (Sincronizza ora tramite daemon.sync.trigger, fallback locale senza NATS); per l'integrazione SingletonTaskRunner lease in modo che i pods non vengano mai eseguiti due volte. - Test Connection ora accede e elenca; le righe dei membri registrano la loro organizzazione; L'eliminazione di un'integrazione stacca (mantene) ciò che è stato sincronizzato; Deve essere https a un host pubblico (nessuna portata cluster/SSRF); le credenziali non vengono mai registrate. - Rimuovendo gli stub morti del provider TODO e i loro aggiornamenti inutilizzati.

All changes

Like what you see shipping?

All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.

Start Free ForeverView Pricing