Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· kamo-internal
"Tutti i lead / account / applicazioni" su una campagna, a qualsiasi dimensione
Ogni casella id dell'editor di campagna ora ha una casella "All ..." accanto a esso. Ticked, la scatola si piega in un pannello live per tutti di questo tipo il membro firmato può vedere, con quanti indirizzi che viene a — contato per una piccola organizzazione, deferito per una grande ("≈ 4.9 miliardi ± 2%") e raffinazione in luogo come EmailService annuncia una figura migliore. Una scatola che il membro non può usare dice perché. Nulla nell'editor detiene più l'intera lista: - L'elenco salvato è una griglia server-paged (ricerca per indirizzo, filtro per stato, contrassegnare le righe da prendere off), e Save invia le modifiche della pagina come fette con una barra di progresso — non la lista. - "Anteprima come" è una ricerca attraverso i nuovi indirizzi di questa pagina, l'elenco salvato e ogni spuntato pubblico, una pagina alla volta, invece di un menu dei primi cinquanta indirizzi caricati nel browser. - Il riassunto del destinatario aggiunge la lista, ciò che Save aggiungerà e ogni pubblico, e dice chiaramente che nessuno è e-mail due volte e opt-outs uscire come si invia. - Una campagna di invio mostra quanto è stato raccolto ogni pubblico. La casella di posta in scena, il riepilogo dello spazio di lavoro e la fetta di uscita dell'editor non sonda più: hanno riletto sulle cornici di avanzamento della campagna.
· EmailService
Una campagna può andare ad ogni lead, account o applicazione che un membro può vedere
"Tutti i lead / account / applicazioni" è una regola, non una lista. Viene memorizzato con la campagna (la blob, campagnaAudiences — no DDL), corre sull'accesso di chi l'ha impostata o pressata Invia, ed è raccolto dal mittente spazzare solo poche migliaia di destinatari davanti a ciò che i host in uscita possono prendere, quindi un pubblico di miliardi non esiste mai come una lista ovunque. - Raggiungere: esattamente quello che il membro poteva leggere smascherato — la regola degli schermi di piombo (capi propri; altri' con Visualizza informazioni di contatto di altri; non firmati ha anche bisogno di Visualizzare i lead non firmati o un free-for-all prodotto), conti con Visualizza account che hanno accettato di marketing, applicazioni con una pipeline. - Lettura: piccole organizzazioni attraverso il proprio indice da id; grandi da hash-bucket spazzata di la tabella (yb hash code sulla chiave principale, pinned con un suggerimento) — l'unico intervallo questi i tavoli affusolati possono cercare. - Conteggio: esatto per le piccole organizzazioni, inferred per grandi da secchi di hash casuali con un 95% gamma, raffinata dal vivo su NATS (email-audience) e cache per portata in Redis. - Le righe riunite sono destinatari ordinari, opt-out controllati, inseriti SU CONFLICT NON HING (mai un indirizzo due volte) e contrassegnato così instancabile una fonte riprende solo quello che ha messo in scena. Una campagna non è finito mentre il suo pubblico è ancora in fase di raccolta; cancellando tutto ciò che è rimasto lo ferma. - La lista di invio è paginata (/recipienti/pagina, una ricerca sull'indice dell'indirizzo) e modificata in fette (/recipienti/append, /recipients/remove); eliminare e duplicare non caricarlo più, e rilasciare i tempi sono assegnati una pagina alla volta. - Anteprima: /campaigns/audience/browse pagine un pubblico con una ricerca id e una ricerca time-boxed. - Gli inquilini PHI ottengono la traccia di accesso per-registrato della griglia di piombo per ogni vantaggio che un pubblico legge.
· EmailService
La pagina di preferenza in ogni lingua il prodotto parla
La pagina dietro ogni link disiscrizione parlava solo inglese. Ora parla tutte le 22 lingue il prodotto UI navi: Inglese, Cinese, Hindi, Spagnolo, Francese, Arabo, Bengali, Russo, Portoghese, Indonesiano, Tedesco, Giapponese, swahili, turco, tamil, vietnamita, coreano, italiano, tailandese, polacco, Ucraino e rumeno. - Ogni frase che la pagina si dice ora vive in un pacchetto di messaggi, # Con l'inglese come fonte # l'inconveniente per qualcosa che manca. I numeri prendono il modulo plurale giusto per ogni lingua, e le date sono scritte il modo di lingua (UTC). - La lingua viene scelta per richiesta: un parametro lang vince, poi il browser's Accept-Language (valori di qualità onorati, pt-BR torna a pt), poi inglese. Una lingua che il lettore sceglie rimane scelto attraverso ogni forma e reindirizzare. La pagina imposta <html lang>, Content-Language e Vary, e elenca ogni lingua, chiamata in sé, in fondo come semplice collegamenti. - L'arabo è posto a destra a sinistra: dir="rtl", CSS logico, uno specchio interruttore, e le parole proprie dell'organizzazione (nome, soggetto, indirizzo) tenuto nella loro direzione. Quelle parole non sono mai tradotte. - Su schermi la pagina ora utilizza la larghezza completa: per chi è e perché da un lato, le scelte accanto a esso in colonne, le note e piè di pagina sotto. Sotto 720px è la stessa singola colonna come prima. - Nient'altro cambia: ogni valore è ancora sfuggito (testo tradotto anche intorno a esso), nessuna sceneggiatura, le stesse intestazioni bloccate, GET ancora mai cambia qualcosa, e un link che non nomina nessuno ottiene ancora lo stesso pagina neutrale, ora nella lingua del lettore. I test verificano che ogni bundle ha esattamente le chiavi inglesi e titolari e un ramo per ogni forma plurale della sua lingua, e coprire la negoziazione della lingua, l'uscita di destra a sinistra, le date, la fuga e lingua superstite un salvataggio e il suo reindirizzamento.
· kamo-internal
Pagine refetch su org cambia eventi invece di caricare una volta
Ogni scrittura di successo attraverso forwardToApi ora pubblica rt.org.{orgId}.{domain} sul core NATS (il dominio è il primo segmento del percorso backend, saltando la sicurezza/). MediaService lo trasmette a /topic/rt/org/{orgId}/{domain} e all'usoOrgChanges abbonamenti sulla presa condivisa, carbonesce scoppia e incendi di nuovo dopo un ricollegare. Le rotte los, fatturazione e oauth-config, che non passano attraverso forwardToApi, pubblicarsi. Pagine che caricano una volta ora si rifanno silenziosamente quando il loro dominio cambia: no scheletri flash, e mai sopra input non salvato. - Conti: assegnare, e la visualizzazione del conto (overview, cronologia, lead, membri, note, ordini) - Note - Commercio: ordini, accordi, prenotazioni, appalti, richieste, lavori di servizio, richieste di assistenza, iscrizioni, abbonamenti, prestiti personali e la relazione di invecchiamento - Prestiti, dettagli di prestito e offerte - Base di conoscenza casa e articolo - Carriere, legalità e conformità - Impostazioni, impostazioni dell'account, integrazioni, pagina della categoria del documento e il mercato e le pagine del piano di abbonamento Il calendario esce il suo feed di cambiamento esistente. I risultati seguono argomento di sblocco del membro.
· EmailService
Un disiscrizione per e-mail è onorato, non caduto
Ogni messaggio all'ingrosso e all'articolo condiviso ha offerto unsubscribe@ nella sua lista-Unsubscribe intestazione, ma niente leggere quella casella di posta - per un inquilino non era nemmeno il nostro dominio - così ogni opt-out inviato quel modo è stato perso. - La mailto ora nomina unsubscribe@hello.kamocrm.com Per ogni org, con il token del destinatario. nel soggetto: E' il momento giusto. Il link https one-click e List-Unsubscribe-Post sono invariati. - POST /api/internal/unsubscribe/mail prende ciò che arriva lì, come riportato dal sidecar del server di posta. Trova il token nell'abito più, soggetto (con Re:, in capitali, codificato URL sinistro o codificato RFC 2047) o un link inoltrato, risolve esattamente come fa la pagina di preferenza, e cancella l'indirizzo di tale org attraverso il registro di opt-out (fonte "mailto", con il Messaggio-ID). Una fila di campagna ancora in attesa di essere inviato è tirato, come con il link di un clic. Fare due volte non cambia nulla. - Un messaggio senza un token che nomina qualcuno non cambia nulla: nessuno è non sottoscritto da un'ipotesi dall'indirizzo From, che chiunque può scrivere. Niente e' mai stato rimandato. Il registro mantiene il risultato, org, dominio del mittente e Message-ID, mai soggetto o corpo. - Si siede dietro l'InternoAuthFilter come il resto di /api/internal, rifiuta richiede oltre 64 KiB, e prova al massimo cinque token candidati per messaggio.
· kamo-internal
La scheda Opt Out e l'aggiornamento del chip di piombo dal vivo
Abbonati a entrambi. (EmailService e SecurityService pubblicano dopo ogni cambiamento commesso; MediaService relays), quindi un destinatario siscrizione, un rimbalzo o una modifica di un collega mostra subito al posto del carico successivo. L'org id è l'accessor string, mai un numero arrotondato. Un cambiamento semifatto nell'editor viene mantenuto quando l'indirizzo si sposta sotto di esso, con una nota che lo dice. Anche scende i tappi di larghezza che la scheda aveva su una selezione e due paragrafi.
· EmailService
Gli schermi Opt-out rinfrescano dal vivo quando qualcuno cambia l'elenco
Il registro principale ora dice OptOutChange Publisher dopo ogni cambiamento impegnato - un destinatario sulla pagina di preferenza, un rimbalzo, un membro in Impostazioni - e pubblica rt.org.{orgId}.email-opt-outs sul core NATS per MediaService relay. La cornice non porta alcun indirizzo; lo schermo rilegge ciò che il suo visualizzatore può vedere.
· SecurityService
Il cambiamento opt-out di un lead rinfresca gli schermi aperti dal vivo
Il registro qui dice OptOutChange Publisher dopo il cambiamento si impegna, che pubblica rt.org.{orgId}.email-opt-outs sul core NATS (il flusso JetStream di questo servizio è chat.>), relè da MediaService. Nessun indirizzo nella cornice.
· kamo-shared-library
Il registro opt-out dice quando la lista di un'organizzazione è cambiata
Un ascoltatore opzionale, detto dopo la modifica commette, in modo che gli schermi che mostrano l'elenco possono rinfrescare dal vivo invece di caricare una volta. Essa svolge solo l'organizzazione: chi ha optato è dietro la sua destra, così lo schermo rilegge ciò che il suo spettatore può vedere. I costruttori esistenti sono invariati.
· KlusterServices
Mail to unsubscribe@hello.kamocrm.com raggiunge EmailService
Ogni messaggio all'ingrosso e all'articolo condiviso offre un disiscrizione via e-mail (List-Unsubscribe mailto), ma la posta a quell'indirizzo è andata al postmaster e non è mai stato agito. Ora postfix mani esattamente quell'indirizzo, e unsubscribe+anything@ sullo stesso dominio, a un piccolo tubo che rompa messaggio, e un nuovo sidecar unsubscribe-mail lo invia a EmailService's /api/internal/unsubscribe/mail. EmailService trova il token del destinatario in l'oggetto (o l'indirizzo più, o il link inoltrato) e si cancella loro esattamente come fa il link di un clic; qualsiasi cosa senza un token valido è accettato e caduto. - Ogni altro indirizzo è indirizzato come prima: la linea regexp unsubscribe@hello.kamocrm.com siede sopra il postmaster catch-all, e transport maps nomina solo lo pseudo-dominio a cui riscrive. - Niente è mai rimbalzato o risposto a: il tubo risponde solo mai "delivered" o "proviamo più tardi", e cattura la sua bobina a 5000 messaggi. - Il sidecar riutilizza la copia postfix-bulk-delivery-events dell'interno segreto, facoltativamente, e mai esce, quindi non può mantenere il postfix da iniziare o togliere il baccello dal suo Servizio.
· AIService
L'agente di vendita onora l'email di opt-out list dell'organizzazione
Prima di qualsiasi email toccare il cancello in uscita ora chiede l'e-mail dell'organizzazione opt-out ledger sull'indirizzo del contatto. L'indirizzo è quello del contatto punti chiave in: l'email del piombo per il piombo: <uid>, il membro (o il suo utente) per membro: <id>, e solo quando quel piombo o membro appartiene allo stesso organizzazione. Un indirizzo nella lista di non e-mail, o in pausa, viene rifiutato come SUPPRESSED OPT OUT con un motivo che inizia EMAIL OPTED OUT ORG LIST. È controllato subito dopo l'opt-out del contatto e davanti a tutto incidentale, e si applica anche a un contatto che l'agente non ha mai toccato. Se l'elenco non può essere letto anche l'e-mail è rifiutata (EMAIL OPT OUT CHECK FAILED): agente outreach non è richiesto, quindi un controllo senza risposta non deve mai diventare un manda. Altri canali sono invariati. Un opt-out registrato tramite recordOptOut per e-mail, o per ogni canale, ora mette anche l'indirizzo nella lista do-not-email dell'organizzazione (reason UNSUBSCRIBE, sorgente ai-agent-opt-out, contesto AI CONTACT con la chiave di contatto), così ogni mittente nell'organizzazione e la pagina principale vedere. Ledger legge e scrive eseguito in una transazione del proprio e mai lanciare. The ledger è transazionale stesso, e un'eccezione all'interno del chiamante l'operazione riporterà indietro la riga di audit del rifiuto o il contatto opt-out. Una scrittura fallita è registrata e il contatto stesso opt-out è ancora in piedi. Il registro è dichiarato come un fagiolo sui suoi tre depositi. La sua sonda per nuovi tavoli opt-out è costruito dal primario DataSource, l'unico questo servizio ha. com.kamo.z.shared.email entra nella scansione del repository; il fagiolo e la scansione deve cambiare insieme.
· MediaService
Relè org modifica eventi a /topic/rt/org/{orgId}/{domain}
Gli scrittori pubblicano rt.org.{orgId}.{domain} sul core NATS dopo un cambiamento di successo; ogni pod lo relè all'argomento dell'org così gli schermi aperti si rifanno invece di caricare una volta. SUBSCRIBE è controllato contro la sessione org, e client SEND al prefisso è rifiutato.
· kamo-marketing
Una ricerca nascosta, per-visitor sito per una promozione incappucciata, e segnali che portano i visitatori in esso
La caccia: sette serrature per visitatore, generate da un seme e HUNT SECRET, enciphered con la risposta precedente, nascosta in una pagina che muove ogni UTC mezzanotte, con cancelli del tempo e un minimo di 72 ore. Token firmati senza Stato; il premio è un codice personale rilasciato da SecurityService da un modello promozione, derivata dal seme del risolutore in modo che una riprova non prenda mai un secondo slot. script/check-hunt.ts gioca 400 caccia alla fine e non riesce la costruzione se una fase non può essere risolta da ciò che un risolutore è mostrato. Il modo di entrare, per qualcuno che non ne ha mai sentito parlare: tre segnali. Una parola nella pagina di atterraggio copia glitch; trovarlo nomina la pagina successiva (Pricing primo) e link lì, il collegamento nav a esso brilla, una pillola mantiene il conteggio attraverso le pagine, e la terza apre la caccia. Uscita desktop intento una volta per sessione, e "start free" ad ogni passo. Ogni passo è un evento di ricerca-* di analisi. Tutto non si chiude: nessun modello, nessun segreto o nessun codice lasciato significa no Footer line, nessun segnale e /api/hunt risponde CLOSED. /hunt afferma che termini esattamente come il modello li definisce.
· SecurityService
Emettere codici personali di uso singolo da una promozione modello
Il sito kamocrm.com caccia mani ogni risolutore un codice del proprio, e solo I primi risolutori N ne ottengono uno. Un codice condiviso non poteva farlo: primo risolutore per postare avrebbe consegnato lo sconto a tutti. - PromotionCodeIssuer: una promozione INACTIVE è il modello; il suo maxRedemptions è quanti codici personali possono essere emessi. Le fessure sono prese da un UPDATE condizionale in modo che due repliche non possono sovrastampare. Un chiamante può nome il codice, e chiedere di nuovo per un codice rilasciato lo restituisce senza prendere una seconda slot. E' una cosa che non va. segreto interno. - Le promozioni pubbliche si nutrono di codici monouso, quindi un codice personale non può mai essere elencato o pubblicizzato nell'eroe di homepage.
· EmailService
Una pagina di preferenza reale dietro ogni link disiscrizione
Il link di cancellazione ha aperto una carta di conferma o di rilascio nudo. Qualcuno che solo voluto meno e-mail non aveva modo di dire così, e nulla ha detto loro perché erano stati spediti, che cosa avrebbe continuato ad arrivare, o che la loro scelta è stato mantenuto in record. Il link ora apre una pagina di preferenza per quell'indirizzo e mittente. La siscrizione da tutto viene prima ed è una stampa. Dopo, il lettore può spegnere un tipo di posta (quando c'è più di uno scegliere tra, o uno è già spento) o mettere in pausa tutto per 30, 60 o 90 giorni. Una volta cancellate possono riscrivere con un pulsante, o dica al mittente perché se ne sono andati. La pagina dice perché è arrivata l'email, cosa riceveranno ancora, e che ogni cambiamento viene registrato. Ogni cambiamento passa attraverso il registro opt-out insieme alla richiesta è venuto da, così la storia mostra che la scelta era il lettore. Aprire la pagina registra una vista e non cambia nulla. Richieste di un clic dai client di posta (RFC 8058) ancora annullare l'iscrizione da tutto, sempre rispondere 200, e ancora tirare una fila di campagna in coda dal suo invio. Un link che non nomina nessuno ottiene la stessa pagina neutrale su ogni percorso e mai raggiunge il registro. La pagina è forma HTML semplice senza script. È disegnato nel mittente colore del marchio, regolato fino a soddisfare il contrasto WCAG sia in luce che in temi scuri, e funziona da 320px largo. Ogni risposta porta rigorosa politica di sicurezza dei contenuti, nessun referrer (il token è nell'URL), no-store, noindex e un frame ban. Rendering vive in soppressione / pagina: un record di vista, un renderer puro che test e anteprime chiamare direttamente, e un servizio che risolve token e parla con il registro. Il controller effettua solo percorsi e intestazioni.
· kamo-internal
Email opt-out chip e pannello nella pagina di piombo
Accanto all'indirizzo e-mail del piombo c'è ora un chip che dice se la persona può essere inviato via email: E-mail consentite, Opted da tutte le email, Paused fino a una data, Alcune email spente, o Nessun indirizzo email. Si apre un pannello che spiega stato attuale in parole semplici (che lo ha cambiato, quando e perché), con interruttori per ogni tipo di e-mail, un "opt out of all email", una pausa di 30/60/90-day o terminare uno, e la storia recente con i dettagli della richiesta dietro un gioco. Ogni volta che un cambiamento avrebbe lasciato e-mail raggiungere nuovamente la persona, la nota diventa richiesto, dice perché, e Save aspetta per esso. Un membro che non può cambiarlo è ha detto perché e vede tutto in sola lettura; prima che i tavoli di storia esistano il pannello dice così tranquillamente invece di fallire. L'azione rapida e-mail ora chiede prima quando la persona ha optato per tutte le e-mail o lo ha messo in pausa, e lascia che il membro scrivi comunque per una risposta one-to-one. Aggiunge l'itinerario del proxy per il passaggio del campo e codice del server attraverso in modo che il pannello possa inserire un errore accanto alla destra ingresso.
· SecurityService
Vedere e modificare l'opt-out email di un lead dal comando
Un membro che lavora un lead può ora vedere se questa persona può essere e-mail, e cambiarlo, senza l'elenco delle impostazioni di opt-out a livello org. E' il momento giusto. risposte con lo stato dell'indirizzo il registro opt-out dell'organizzazione, i suoi dieci cambiamenti più recenti e gli argomenti un indirizzo può fermarsi. Chi può leggerlo segue il piombo stesso (401/404/403 come per l'apertura del comando, free-for-all lead incluso). Un chiamante la cui visione i dettagli di contatto di piombo è mascherato ottiene l'indirizzo mascherato allo stesso modo e nessun Dati IP, browser o sessione sulle righe di storia. PUT sulla stessa strada lo cambia. È permesso esattamente quando si modifica questo i recapiti di piombo sono consentiti (l'assegno, o EDIT LEAD CONTACT INFO OTHERS più VIEW UNASSIGNED LEADS per un lead non firmato) e mai mentre l'indirizzo è mascherato. Il cambiamento viene registrato come MANUAL da "lead: <id>", con il membro, gli indirizzi e il browser della richiesta e un hash della sessione. Permettere e-mail di nuovo ha bisogno di una nota, che il registro fa rispettare (400 con campo "commento"); fino a i tavoli di storia esistono un cambiamento viene rifiutato con 503 HISTORY UNAVAILABLE. Ogni cambiamento lascia anche una riga sulla scheda Storia del piombo. Il registro è dichiarato qui con la sua sonda schema, come fa EmailService.
· EmailService
Un amministratore org può vedere e modificare l'intera lista di opt-out
Impostazioni - > E-mail -> Opzione Out ha ora la sua API sotto /api/email/opt-outs, dietro MANAGE EMAIL OPT OUTS (god bypasses): un riassunto con gli ultimi 30 giorni, la lista filtrato da stato, ragione e indirizzo, un indirizzo con la sua storia completa e ovunque esso appare nell'organizzazione, l'attività org-wide, un CSV esportazione, e modifiche e note effettuate attraverso il registro opt-out. Ogni cambiamento è registrato contro il membro, l'indirizzo del cliente il proxy passato, e un hah della loro sessione. Ids sono inviati come stringhe e tempi come ISO-8601, come il web app si aspetta. Fino a quando le tabelle di storia non esistono l'elenco, il sommario, l'indirizzo e l'esportazione ancora lavorare dalla lista do-not-email da solo, e una modifica risponde 503 con STORIA NON DISPONIBILE invece di essere fatto a metà. La sonda di schema ora costruisce la sua query sul database primario. Era stato dato l'unico fagiolo JdbcTemplate in questo servizio, il server di posta MySQL uno, in modo da non poter mai vedere i tavoli di opt-out e il cambiamento di ogni membro avrebbe è stato rifiutato.
· kamo-internal
Impostazioni - > E-mail -> Opzione Fuori, l'organizzazione e' una lista di non e-mail
Tutti coloro che hanno chiesto di non essere e-mail, in un posto. Una testata dice quanti sono fuori tutti e-mail e perché (non sottoscritta, rimbalzata, contrassegnata come spam, ci ha chiesto di smettere), quanti si sono fermati solo alcuni tipi o si è fermato, e come la lista si è spostata oltre trenta giorni. La lista è ricercabile e filtrabile; un indirizzo si apre accanto a esso con: quello che ricevono una riga per tutte le email, una per tipo di posta, e una pausa, salvata come una Progetto. Lasciare la posta raggiungere qualcuno di nuovo ha bisogno di una nota che dice chi ha chiesto e quando, perché questa nota è la registrazione del loro consenso. conosciuto come il piombo, contatto, campagna invia, domanda di lavoro, avvisi di lavoro e AI assistente opt-out che condividono l'indirizzo storia ogni cambiamento come una linea temporale: quello che si muoveva (prima/dopo), che lo fece e attraverso che, la nota, e la richiesta è venuto da (indirizzo di rete, catena di trasmissione, browser, lingua) Inoltre un feed di attività a livello org, aggiungendo un indirizzo a mano e un'esportazione CSV. Gated da MANAGE EMAIL OPT OUTS (figlio di MANAGE EMAIL SETTINGS), specchiato in RoleRightType.ts e rightsHierarchy.ts; la scheda, la voce del menu e la scheda delle impostazioni appaiono solo con esso.
· kamo-internal
Piazza, pulsanti smussati e un pollice a 2px su ogni barra di scorrimento
I quattro pulsanti della barra (giunto per iniziare, passo indietro, passo avanti, salto alla fine) sono ora 20px quadrati con angoli duri, e il pollice mantiene solo un raggio 2px. Entrambi portano una bevel a inset da un pixel - luce lungo la parte superiore e sinistra, scuro lungo il fondo e la destra - in bianco traslucido e nero, quindi lo stesso bevel siede in ardesia della pagina, un brand tint, la tavolozza buia del terminale. Il singolo `rounding` frazione della pelle diventa due pixel radii, thumbRadius e PulsanteRadius, perché "un paio di pixel" è un assoluto. La chiave quadrata è geometria piuttosto che pelle: tiene su una barra corta (10x10 su una striscia 72px) e sulla pelle arcade, il cui sguardo è altrimenti invariato.
· EmailService
Ogni controllo di soppressione e rimbalzo passa attraverso il registro di opt-out
SuppressionService ora chiede EmailOptOutLedger, quindi un assegno vede la lista di non-email, pause e argomenti allo stesso modo, e un rimbalzo atterra nella stessa storia di unsubscribe. I chiamanti chiamano il tipo di posta che stanno per inviare: campagne (materializzare, ripristinare, il cancello tardivo) chiedere circa MARKETING CAMPAIGNS, l'articolo condivide su SHARED ARTICLES. I rimbalzi portano la risposta del server e la campagna nella fila di storia. OptOutSchemaProbe racconta se KamoInitializerService ha creato i due nuovi tavoli ancora; fino a quando non lo ha, inviando onori la lista da sola invece di mancare su una tabella mancante.
· kamo-shared-library
Un registro opt-out, argomenti, pause e una storia di ogni cambiamento
La lista non-email potrebbe essere scritta a ma non leggere, cambiato o spiegato. Questo aggiunge l'unico posto da cui viene letto e scritto, per ogni servizio: email optout topics un indirizzo che ha fermato un tipo di posta, o ha sospeso tutto email optout events cronologia degli inserti: chi (recipiente, membro, sistema), da dove (IP corrente, l'intero X-Forwarded-Per catena, agente utente, lingua, host, referer, session hash), perché (reason, fonte, nota, feedback), attraverso che (campagna, piombo), e lo stato prima e dopo email suppressions mantiene il suo significato, così ogni mittente che già lo onora lo fa ancora. EmailOptOutLedger risponde "può questo essere inviato" da tutti e tre e scrive una riga di storia per parte dello stato un cambiamento effettivamente spostato. Un membro che consente di nuovo la posta deve dire perché; che nota è la registrazione del consenso. Fino a quando non esistono le nuove tabelle, il registro cade nella lista da solo e rifiuta i cambiamenti che non può registrare, piuttosto che fallire manda. Plain class, non un @Service: ogni servizio scansisce com.kamo, e uno senza l'e-mail i repository non avrebbero iniziato a costruirlo. Ogni servizio lo dichiara con @Bean. Anche MANAGE EMAIL OPT OUTS (320), il diritto org per Impostazioni -> E-mail -> Opt Out, un bambino MANAGE EMAIL SETTINGS.
· kamo-internal
Host e-mail in uscita, inviare finestre, per-host warm-up e la scatola in uscita
- Impostazioni → Piattaforma → Configurazione guadagna una scheda E-Mail Host in uscita, dietro la piattaforma MANAGE OUTBOUND EMAIL HOSTS: gli host condivisi con ogni organizzazione e quelli tenuti per l'organizzazione della piattaforma, con ogni impostazione di connessione, disponibilità, controlli di connessione, il test invia e il riscaldamento di ogni ospite. - Impostazioni → Email → Bulk Email Sender è ricostruito su GET bulk-provider/overview: la rotazione di gli host dell'organizzazione e la piattaforma (switchable per organizzazione), una rotonda-robina vista, il mittente, un editor di finestra invio (giorni di settimana, diversi intervalli di tempo, intervalli di pernottamento, la propria fuso orario o l'organizzazione), e un rapporto di riscaldamento in lingua normale per host. Il riscaldamento può non essere più spento. - /marketing/email/outbox elenca ogni posta elettronica in fase — composta solo quando un host può prenderlo — e cancella le singole e-mail, una selezione, o tutto il resto, con annullare. Lo spazio di lavoro, il pacing banner e l'editor campagna link ad esso e leggere la nuova capacità per-host. - Editor host condiviso con preflight live (indirizzi risolti, duplicati e indirizzi privati rifiuti), gli host in uscita e i client API in uscita, e lo stato del destinatario CANCELLED.
· EmailService
Diversi host in uscita per org, inviato rotonda-robin, ciascuno riscaldato da solo, all'interno di una finestra di invio
La posta di campagna di un'organizzazione ora lascia attraverso qualsiasi numero di host in uscita, un messaggio ad un tempo in rotazione, invece di un fornitore di massa. - Host: un'organizzazione propria (outboundHosts nel suo provider di massa blob) e la piattaforma (platformOutboundHosts nel blob dell'organizzazione della piattaforma), CONDIVIDI con ogni organizzazione o PLATFORM ONLY. Ogni impostazione SMTP è esplicita: sicurezza, meccanismo SASL, verifica TLS e protocolli, nome HELO, mittente busta, timeouts, limiti orari / giornalieri, DSN, 8BITMIME, SOCKS. HostSessionFactory costruisce la sessione da loro; EmailSmtpService.sendVia invia attraverso di essa. - Lo stesso server non viene mai aggiunto due volte (stesso nome o qualsiasi indirizzo condiviso, qualunque sia la porta o login), e l'host di un'organizzazione deve essere un server pubblico: nomi privati e in-cluster e gli indirizzi sono rifiutati su salvare e ancora prima di ogni connessione. - Il riscaldamento e' per ospite e continua sempre. WarmupService funziona su un WarmupHandle; un host piattaforma ha uno riscaldamento condiviso da ogni organizzazione che lo utilizza. Le nuove piste partono dall'inizio della giornata locale. - WarmupReleaser è l'unico mittente: rotonda-robina tra gli host di ogni organizzazione, saltando un host in attesa della sua fessura, al suo berretto, frenato, al proprio limite o appoggiato dopo aver fallito connettersi. Una connessione, TLS o un guasto di firma non conta più un tentativo contro il destinatario. - Invia finestra per organizzazione (giorni, una o più gamme, zona propria o org). WarmupPacer si diffonde ogni giorno il cappello dall'altra parte della finestra. - Posta in uscita: /api/email/campaigns/outbox elenca destinatari in coda e cancella o li ripristina. Un destinatario cancellato è SUPPRESSED con una nota (senza stato DDL) e legge come CANCELLED. - Punti finali: E' il momento giusto. host della piattaforma E' dietro a MANAGE OUTBOUND EMAIL HOSTS. L'unico ospite scrive Rispondi 410. - OutboundHostBackfill semi il relè k3m1 come host PLATFORM ONLY e migra i blobs di un host. Nessun cambiamento di schema.
· KlusterServices
Postfix-bulk accetta qualsiasi mittente da EmailService [skip ci]
Il relè è ora un ospite in uscita della piattaforma che ogni email di campagna di organizzazione può andare attraverso, come qualsiasi cosa da quell'organizzazione manda come. Solo il mittente nullo è ancora rifiutato, con un 4xx. La raggiungibilità è invariata: le reti e la NetworkPolicy lo limitano a EmailService. Applicare direttamente (kubectl applicherà -f)
· kamo-shared-library
MANAGE OUTBOUND EMAIL HOSTS, host di posta elettronica in uscita della console della piattaforma
Una piattaforma destra per l'e-mail di uscita ospita la campagna di posta lascia attraverso: gli host condivisi con ogni organizzazione e quelli tenuti per l'organizzazione della piattaforma, le loro credenziali, disponibilità e riscaldamento. forzato dalla piattaforma di EmailServiceOutboundHostsController attraverso PlatformRightsResolver. Appendato, quindi nessun diritto esistente viene rinumerato.
· kamo-internal
Eliminare, filtrare e spegnere NoReply righe in uscita
La pagina di audit acquisisce una colonna e un filtro del sottosistema, selezione della casella di controllo con "selezionare tutto" e "selezionare tutti gli abbinamenti", ed elimina per una riga, le righe selezionate, tutto corrispondente ai filtri, o tutto, ogni dietro una conferma che nomina la tabella dalle righe. "Recording & retention" attiva o disattiva la registrazione di ciascun sottosistema e imposta come le righe lunghe sono tenute. La richiesta ogni cancellazione diventa, e come il modello di selezione della griglia è Leggete, vivete con i loro test.
· EmailService
Il registro NoReply può essere filtrato dal sottosistema, pruned, e detto cosa registrare
Ogni riga ora nomina il sottosistema che l'ha inviato e, per un modello invia, la chiave del modello. EmailTemplateService e il mittente della campagna aprono un NoReplyOutboundSource portata intorno al loro SMTP inviare; qualsiasi altra cosa è Imbarazzato. NoReplySubsystem mappa le chiavi del modello canonico per sottosistemi, e un test non riesce se un modello canonico non mappa a nessuno. Elimina andare alla tabella stessa attraverso NoReplyOutboundLedger: una riga, fino a 1000 righe selezionate, ogni riga corrispondente ai filtri dell'elenco, o intero registro (TRUNCATE), che deve essere chiesto con confermaAll. Bulk cancella in pezzi di 500. NoReplyOutboundSettings memorizza un interruttore di registrazione per sottosistema e il ritenzione (30 giorni per impostazione predefinita, 0 mantiene le righe fino a eliminare), memorizzate nella cache per 15 secondi per capsula. NoReplyOutboundRetentionSweep purges oraria su uno Pod. Tutti i nuovi endpoint sono solo dio, come la lista.
· InitializerService
L'indice unico (campagna, indirizzo) per un ambiente fresco
E-mailService usato per creare **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** avvio; DDL su questo cluster appartiene invece qui. Idemponte, autocommesso (YugabyteDB costruisce indici online), e i duplicati sono contati e registrati, mai cancellato - una riga contattata è il record permanente di una campagna di un indirizzo. EmailService ora controlla solo l'indice con questo nome.
· kamo-internal
L'editor di campagna scrive bordo a bordo, unisci i gettoni nella loro colonna
Il soggetto siede sotto il titolo della campagna e il pubblico accanto al chip di stato, quindi la composizione passo è il corpo e-mail da solo, riempiendo il centro della pagina, con i gettoni di fusione in una colonna su a destra. Nulla salva da solo, quindi la pagina ora segna le modifiche del server non ha visto e chiede prima di partire li scaricherebbe; TemplateInlineEditor riporta il corpo del membro modifica a parte dalla normalizzazione del tempo di carico di Quill in modo che il marchio non sia sollevato semplicemente aprendo una campagna.

Il tuo universo ti sta aspettando.
Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.
Gratis per sempre — nessuna carta di credito richiesta