Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· kamo-internal
"Todos os leads / contas / aplicações" em uma campanha, em qualquer tamanho
Cada id caixa no editor de campanha agora tem uma caixa "All ..." ao lado dele. Assinalado, a caixa dobra- se em um painel ao vivo para todos desse tipo o membro assinado pode ver, com quantos endereços que — contabilizada para uma pequena organização, inferida para uma grande organização ("'4,9 mil milhões ± 2%") e refino no local como EmailService anuncia uma figura melhor. Uma caixa que o membro não pode usar diz porquê. Nada no editor detém mais toda a lista: - A lista salva é uma grade server-paged (pesquisa por endereço, filtro por status, marcar linhas para levar off), e Save envia as alterações da página como fatias com uma barra de progresso — não a lista. - "Preview as" é uma pesquisa através dos novos endereços desta página, a lista salva e cada tique público, uma página de cada vez, em vez de um menu dos primeiros cinquenta endereços carregados no navegador. - O resumo do destinatário adiciona a lista, o que Save irá adicionar e cada público, e diz claramente que Ninguém é enviado por e-mail duas vezes e opt-outs saem como ele envia. - Uma campanha de envio mostra o quão longe cada público foi reunido. A caixa de saída encenada, o resumo da caixa de saída do espaço de trabalho e o corte da caixa de saída do editor já não fazem pesquisa: Eles re-ler no socket de campanhas quadros de progresso.
· EmailService
Uma campanha pode ir para cada lead, conta ou aplicativo que um membro pode ver
"Todos os leads / contas / aplicações" é uma regra, não uma lista. É armazenado com a campanha (o bulk-fornecedor blob, campanhaAudiências - sem DDL), funciona no acesso de quem o configurou ou pressionado Envia, e é reunido pelo expedidor varrer apenas alguns milhares de destinatários à frente do que o anfitriões de saída podem levar, então uma audiência de bilhões nunca existe como uma lista em qualquer lugar. - Alcance: exatamente o que o membro poderia ler desmascarado — a regra das telas de chumbo (próprios leads; outros' com Ver informações de contato de outros; sem atribuição também precisa Ver leads não atribuídos ou um free-for-all produto), contas com View Accounts que concordaram com marketing, aplicações com um pipeline. - Leitura: pequenas organizações através de seu próprio índice por id; grandes por hash-bucket varrimento de a tabela (yb hash code na chave primária, presa com uma dica) — o único intervalo destes tabelas hash-sharded pode procurar. - Contagem: exata para pequenas organizações, inferida para grandes de baldes de hash aleatórios com um intervalo de 95%, ao vivo refinado sobre NATS (email-audience) e cached por alcance em Redis. - As linhas reunidas são destinatários comuns, opt-out verificados, inseridas NO CONFLICT NÃO FAZEM NADA (nunca endereço duas vezes) e marcado tão desmarcando uma fonte leva de volta apenas o que ele encenado. Uma campanha não é terminou enquanto o seu público ainda está a ser reunido; cancelar tudo o que resta para-lo. - A lista de envios é páginada (/recipientes/página, uma busca no índice de endereço) e alterada em fatias (/recipientes/append, /recipientes/remove); apagar e duplicar não carregar mais, e liberar os tempos são atribuídos uma página de cada vez. - Preview: /campaigns/audience/browse pages um público com uma pesquisa de ID e uma busca com caixa de tempo. - Os inquilinos da PHI têm o rasto de acesso por registo para cada pista que o público lê.
· EmailService
A página de preferência em cada idioma que o produto fala
A página por trás de cada link de cancelamento só falava inglês. Agora fala todos os 22 idiomas o produto UI navios: Inglês, chinês, hindi, espanhol, Francês, árabe, bengali, russo, português, indonésio, alemão, japonês, Suaíli, turco, tâmil, vietnamita, coreano, italiano, tailandês, polonês, Ucraniano e romeno. Cada frase que a página diz agora vive num pacote de mensagens, ******************* com inglês como fonte e O retorno para qualquer coisa que falta. Números tomam a forma plural direita para cada idioma, e as datas são escritas do próprio modo do idioma (UTC). - O idioma é escolhido por pedido: um parâmetro lang ganha, em seguida, o Aceitar-Idioma do navegador (valores de qualidade honrados, pt-BR pt), então Inglês. Um idioma que o leitor escolhe permanece escolhido Cada forma e redirecionamento. A página define <html lang>, Content-Language e Vary, e lista cada idioma, nomeado em si mesmo, no fundo como simples links. - Árabe é colocado para a direita para a esquerda: dir="rtl", CSS lógico, um espelho mudar, e as próprias palavras da organização (nome, assunto, endereço) mantidas na sua própria direcção. Essas palavras nunca são traduzidas. - Em telas largas a página agora usa a largura completa: para quem é e por que de um lado, as escolhas ao lado dele em colunas, as notas e rodapé abaixo. Sob 720px é a mesma coluna que antes. - Nada mais muda: cada valor ainda está escapado (texto traduzido em torno dele também), nenhum script, os mesmos cabeçalhos bloqueados, GET ainda nunca muda qualquer coisa, e um link que nomeia ninguém ainda recebe o mesmo página neutra, agora na língua do leitor. Testes verificar que cada pacote tem exatamente as chaves inglesas e placeholders e um ramo para cada forma plural da sua língua, e cobertura a negociação de linguagem, saída direita-esquerda, datas, fuga, idioma sobrevivendo a uma poupança e seu redirecionamento.
· kamo-internal
Páginas refazer em org alterar eventos em vez de carregar uma vez
Cada escrita bem sucedida através do forwardToApi agora publica rt.org.{orgId}.{domínio} no núcleo NATS (o domínio é o primeiro segmento do caminho da infraestrutura, pulando segurança/). O MediaService retransmite- o para o /topic/rt/org/{orgId}/{domain} e usa o OrgChanges assina sobre o soquete compartilhado, coalesces explode e dispara novamente após um Reconectar. As rotas los, billing e oauth-config, que não passam AvanceToApi, publique-se. Páginas que carregaram uma vez agora refetch silenciosamente quando seu domínio muda: não flash esqueleto, e nunca mais entrada não salva. - Contas: atribuir, e a visão de conta (visão geral, histórico, leads, membros, notas, ordens) - Notas - Comércio: encomendas, acordos, reservas, contratos, pedidos, serviços, solicitações de serviço, inscrições, assinaturas, empréstimos pessoais e o relatório de envelhecimento - Empréstimos, detalhes de empréstimo e ofertas - Base de conhecimento casa e artigo - Carreiras, legal e conformidade - Configurações, configurações de conta, integrações, a página de categoria do documento, e o mercado e as páginas do plano de subscrição O calendário coalesce sua alimentação de mudança existente. As realizações seguem o tópico desbloqueio do membro.
· EmailService
Um cancelamento por e- mail é honrado, não deixado cair
Todas as mensagens em massa e de artigos compartilhados oferecidas unsubscribe@<sender's domain> em seu cabeçalho List-Unsubscribe, mas nada leu essa caixa de correio - para um inquilino Nem sequer era o nosso domínio - então cada opt-out enviado dessa forma foi perdido. - O mailto agora nomes cancelar a subscrição@hello.kamocrm.com Para cada org, com o símbolo do destinatário no assunto: **************************** O link https com um clique e List- Unsubscribe-Post estão inalterados. - POST /api/internal/não-assinatura/mail leva o que chega lá, como relatado pelo sidecar do servidor de correio. Encontra o símbolo no endereço, o assunto (com Re:, em maiúsculas, codificado com URL à esquerda, ou RFC 2047 codificado) ou um link enviado, resolve-lo exatamente como a página de preferência, e cancela a inscrição desse endereço para essa org através do livro de registos opt-out (fonte "mailto", com a Mensagem-ID). Uma linha de campanha ainda à espera de ser enviada é puxado, como com o link de um clique. Fazer isso duas vezes não muda nada. - Uma mensagem sem um símbolo que nomeia alguém não muda nada: ninguém é Cancelado por um palpite do endereço From, que qualquer um pode escrever. Nada é devolvido. O log mantém o domínio resultado, org, remetente e Mensagem-ID, nunca o sujeito ou corpo. - Fica atrás do InternalAuthFilter como o resto do /api/internal, recusa solicita mais de 64 KiB, e tenta no máximo cinco fichas candidatas por mensagem.
· kamo-internal
A aba Opt Out e a atualização do chip principal ao vivo
Ambos subscrevem o número. (EmailService e SecurityService publicam após todas as alterações cometidas; relés MediaService), então um destinatário não assinante, um salto ou uma edição de um colega mostra imediatamente em vez de na próxima carga. O id org é o acessor de cordas, nunca um número arredondado. Uma mudança semi-made no editor é mantida quando o endereço se move por baixo dele, com uma nota dizendo isso. Também deixa cair as tampas de largura que a aba tinha em um select e dois parágrafos.
· EmailService
Ecrãs de saída atualizam ao vivo quando alguém altera a lista
O livro de registros agora diz ao OptOutChangePublisher depois de cada alteração cometida - um destinatário na página de preferência, um salto, um membro em Configurações - e ele publica rt.org.{orgId}.email-opt-outs no núcleo NATS para que o MediaService retransmita. O quadro não carrega nenhum endereço; a tela re-ler o que seu visualizador pode ver.
· SecurityService
A mudança de opt-out de um lead atualiza telas abertas ao vivo
O livro de registros aqui diz OptOutChange Publisher após os commits de alterações, que publica rt.org.{orgId}.email-opt-outs no núcleo NATS (o stream JetStream deste serviço é chat.>), transmitido pela MediaService. Nenhuma morada na moldura.
· kamo-shared-library
O livro de registros opt-out diz quando a lista de uma organização mudou
Um ouvinte opcional, dito após a mudança de commits, para que as telas que mostram a lista possam atualizar ao vivo em vez de carregar uma vez. Ele carrega apenas a organização: quem optou por fora está por trás de seu próprio direito, de modo que a tela re-ler o que seu espectador pode ver. Os construtores existentes estão inalterados.
· KlusterServices
Correio para cancelar a subscrição@hello.kamocrm.com
Cada mensagem em massa e de artigo compartilhado oferece um cancelamento por e-mail (List-Unsubscribe mailto), mas o e-mail para esse endereço foi para Nunca actuou. Agora mãos postfix exatamente que endereço, e cancelar a subscrição+qualquer coisa@ no mesmo domínio, para um pequeno tubo que mensagem, e um novo sunscribe-mail sidecar posta-lo para EmailService's /api/internal/dessubscribe/mail. O EmailService encontra o token do destinatário o assunto (ou o endereço, ou o link enviado) e cancelar a inscrição eles exatamente como o link de um clique faz; qualquer coisa sem um token válido é aceite e caiu. - Cada outro endereço é encaminhado como antes: a linha de uma expressão regular correspondente aubscribe@hello.kamocrm.com fica acima do pós-master catch-all, e transport maps nomeia apenas o pseudo-domínio para o qual reescreve. - Nada é repelido ou respondido: o tubo só responde "entrega" ou "tentar mais tarde", e caps seu carretel em 5000 mensagens. - O sidecar reutiliza o postfix-bulk-entrega-eventos da cópia interna secreto, opcionalmente, e nunca sai, então ele não pode manter postfix de iniciar ou retirar a cápsula do seu Serviço.
· AIService
O agente de vendas honra a lista de opt-out de email da organização
Antes de qualquer e-mail tocar no portão de saída agora pergunta o e-mail da organização Opt-out livro de registos sobre o endereço do contacto. O endereço é aquele que o contato pontos chave em: e-mail do lead para lead:<uid>, do membro (ou de seu usuário) para membro:<id>, e somente quando esse líder ou membro pertence ao mesmo organização. Um endereço na lista de não- e- mail, ou pausado, é recusado como SUPRESSED OPT OUT com uma razão que começa EMAIL OPTED OUT ORG LIST. Está. verificado diretamente após o próprio opt-out do contato e antes de tudo incidental, e aplica-se mesmo a um contacto que o agente nunca tocou. Se a lista não pode ser lida o email é recusado também (EMAIL OPT OUT CHECK FAILED): A divulgação de agentes não é solicitada, por isso um cheque sem resposta nunca deve tornar-se enviar. Outros canais estão inalterados. Um opt-out gravado através do recordOptOut para email, ou para cada canal, agora também coloca o endereço na lista do-no-email da organização (razão UNSUBSCRIBE, fonte ai-agent-opt-out, contexto AI CONTACT com a chave de contacto), Assim, cada remetente da organização e da página principal vê-lo. Ledger lê e escreve executar em uma transação própria e nunca lançar. A o livro de registros é transacional em si, e uma exceção dentro do a operação iria voltar atrás a linha de auditoria da recusa ou do próprio contato Opt-out. Uma gravação falhada é registrada e o próprio opt-out do contato ainda permanece. O livro é declarado como um feijão sobre seus três repositórios. A sua sonda para o novas tabelas opt-out são construídas a partir do DataSource primário, o único O serviço tem. com.kamo.z.shared.email junta-se à verificação do repositório; o feijão e O exame deve mudar em conjunto.
· MediaService
A transferência de org muda os eventos para /topic/rt/org/{orgId}/{domínio}
Os escritores publicam rt.org.{orgId}.{domain} no núcleo NATS após uma mudança bem sucedida; cada pod retransmite-o para o tópico do org, para que as telas abertas refetizem em vez de carregar uma vez. O SUBSCRIBE é verificado em relação ao org da sessão, e o cliente SEND ao prefixo é recusado.
· kamo-marketing
Uma caça escondida, por visitador local para uma promoção capped, e sinais que levam visitantes para ele
A caça: sete fechaduras por visitante, geradas a partir de uma semente e HUNT SECRET, encriptado com a resposta anterior, oculto numa página que move cada UTC meia-noite, com portões de tempo e um mínimo de 72 horas. Símbolos apátridas assinados; o prêmio é um código pessoal emitido pelo SecurityService a partir de um modelo promoção, derivada da semente do solucionador para que uma repetição nunca leva um segundo slot. scripts/check-hunt.ts joga 400 caças até o fim e falha na compilação se qualquer etapa não puder ser resolvida a partir do que um solucionador é mostrado. A entrada, para alguém que nunca ouviu falar: três sinais. Uma palavra nas falhas de cópia da landing page; descobrindo o nome da página seguinte (Pricing primeiro) e links lá, o link de navegação para ele brilha, uma pílula mantém a contagem através das páginas, e o terceiro abre a caça. Intenção de saída da área de trabalho uma vez por sessão, e "começar livre" em cada passo. Cada passo é um evento de busca analítica-*. Tudo falha ao fechar: nenhum modelo, nenhum segredo ou nenhum código linha de rodapé, sem sinais e /api/hunt respostas FECHADAS. /canta declara o termos exatamente como o modelo os define.
· SecurityService
Emitir códigos pessoais de uso único de uma promoção de modelo
O site de caça kamocrm.com dá a cada solucionador um código próprio, e apenas Os primeiros solucionadores de N têm um. Um código partilhado não poderia fazer isso: A primeira solução a publicá-lo entregaria o desconto a todos. - PromotionCodeIssuer: uma promoção INACTIVE é o modelo; seu maxRedemptions é o número de códigos pessoais que podem ser emitidos. As fendas são tomadas por uma ATUALIZAÇÃO condicional para que duas réplicas não possam ser sobre-editadas. Um ouvinte pode nomeie o código, e pedindo novamente um código emitido devolve-lo sem Tomando uma segunda vaga. - Está bem. segredo interno. - O feed de promoções públicas deixa cair códigos de uso único, então um código pessoal nunca pode ser listado ou anunciado no herói da página inicial.
· EmailService
Uma página de preferência real por trás de cada link de cancelamento
O link de cancelamento abriu um cartão de confirmação ou de saída. Alguém que... só queria menos e-mails não tinha como dizer, e nada lhes disse por que eles estavam sendo enviados, o que iria continuar chegando, ou que a sua escolha ficou registado. O link agora abre uma página de preferência para esse endereço e remetente. Suspender de tudo vem em primeiro lugar e é uma imprensa. Depois disso, o leitor pode desligar um tipo de correio (quando há mais de um escolher entre, ou um já está desligado) ou pausar tudo para 30, 60 ou 90 dias. Uma vez descriminados, eles podem voltar a assinar com um botão, Ou diga ao remetente porque se foram embora. A página diz por que o email veio, o que Eles ainda receberão, e que cada mudança é registrada. Cada mudança passa pelo livro de opt-out juntamente com o pedido de onde veio, então a história mostra que a escolha era do leitor. Abrir a página registra uma visão e não muda nada. Pedidos de um clique de clientes de email (RFC 8058) ainda cancelar a subscrição de tudo, sempre responder 200, e ainda puxar uma fila de campanha em fila do seu envio. Uma ligação que nomes ninguém recebe a mesma página neutra em cada rota e nunca Chega ao livro. A página é simples formulários HTML sem script. Está desenhado no remetente cor da marca, ajustada até encontrar o contraste WCAG em luz e temas escuros, e funciona a partir de 320px de largura. Cada resposta contém uma política de segurança de conteúdo estrita, sem referência (o token está na URL), No-store, noindex e uma proibição de quadros. Renderização vive em supressão/página: um registro de visualização, um renderizador puro que testes e pré-visualizações chamam diretamente, e um serviço que resolve tokens e Fala com o livro. O controlador apenas roteia e define os cabeçalhos.
· kamo-internal
E-mail chip opt-out e painel na página principal
Além do endereço de e-mail do líder, há agora um chip dizendo se a pessoa pode ser enviado por e-mail: E-mails permitidos, Opted fora de todos os e-mails, Pausado até uma data, Alguns e-mails desligados, ou Sem endereço de e-mail. Abre um painel que explica o estado atual em palavras simples (quem mudou, quando e por que), com cada tipo de email, um interruptor "opt out of all email", uma pausa de 30/60/90-dia ou finalizando um, e o histórico recente com os detalhes da solicitação por trás de uma alternância. Sempre que uma mudança deixaria o email chegar à pessoa novamente, a nota torna-se necessário, diz porquê, e guardar espera por ele. Um membro que não pode mudá-lo é disse por que e vê tudo somente leitura; antes que as tabelas de história existam O painel diz isso calmamente em vez de falhar. A ação rápida do email agora pergunta primeiro quando a pessoa optou por fora de todos os emails ou pausado, e deixa o membro escrever de qualquer maneira para uma resposta de um para um. Adiciona a rota de procuração para o passar do campo e código do servidor para que o painel possa colocar um erro ao lado da direita entrada.
· SecurityService
Veja e mude o opt-out de e-mail de um lead do lead
Um membro que trabalha com uma liderança pode agora ver se essa pessoa pode ser enviada por e-mail, e altere-o, sem a lista de configurações de opt-out de toda a ordem. - Está bem. respostas com o estado do endereço em o livro de opt-out da organização, suas dez alterações mais recentes e os tópicos Um endereço pode parar. Quem o pode ler segue o próprio chumbo (401/404/403 como para abrir o chumbo, livre-para-todos os leads incluídos). Um chamador cuja visão do detalhes de contato do lead é mascarado recebe o endereço mascarado da mesma forma e não Detalhes de IP, navegador ou sessão nas linhas de histórico. Colocar no mesmo caminho muda-o. É permitido exatamente ao editar isto Dados de contato do lead são permitidos (o cessionário, ou EDIT LEAD CONTACT INFO OTHERS mais VEZ UNASSIGNED LEADS para um lead não atribuído) e nunca enquanto o endereço Está mascarado. A mudança é registrada como MANUAL de "leader:<id>", com o membro, os endereços e navegadores da solicitação, e um hash da sessão. Permitir o e- mail mais uma vez precisa de uma nota, que o livro de registos impõe (400 com campo "comentário"; até as tabelas de histórico existem uma mudança é recusada com 503 HISTÓRIA UNAVAILÁVEL. Cada A mudança também deixa uma linha na aba História do próprio líder. O livro é declarado aqui com sua própria sonda de esquema, como o EmailService faz.
· EmailService
Um administrador de org pode ver e alterar toda a lista de opt-out
Configurações -> E-mail -> Opt Fora agora tem sua API em /api/email/opt-outs, atrás GESTÃO EMAIL OPT OUTS (god bypass): um resumo com os últimos 30 dias, a lista filtrado por estado, razão e endereço, um endereço com seu histórico completo e em todos os outros lugares que aparece na organização, a atividade org-wide, um CSV exportação, e alterações e notas feitas através do livro de registos opt-out. Cada mudança é registrado contra o membro, o cliente endereço o proxy passado, e um Haxixe da sua sessão. Os IDs são enviados como strings e vezes como ISO-8601, como o app web espera. Até que as tabelas de histórico existam a lista, resumo, endereço e exportação ainda trabalho da lista de não- e- mail sozinho, e uma mudança responde 503 com HISTÓRICO INVÁVEL em vez de ser metade feito. A sonda de esquema agora constrói sua consulta sobre o banco de dados primário. Estava a ser dado o único bean JdbcTemplate neste serviço, o MySQL do servidor de correio, então ele nunca poderia ver as tabelas opt-out e a mudança de cada membro teria foi recusado.
· kamo-internal
Configurações -> E-mail -> Opt Fora, a lista de não-e-mail da organização
Todos os que pediram para não serem enviados por e-mail, num só lugar. Um mastro diz quantos estão fora de todos e-mail e por que (não-assinado, rebotado, marcado como spam, pediu-nos para parar), quantos pararam apenas alguns tipos ou pausas, e como a lista se moveu ao longo de trinta dias. A lista é pesquisável e filtrável; um endereço abre ao lado com: o que eles recebem uma linha para todo o e-mail, uma por tipo de e-mail, e uma pausa, salvo como um Rascunho. Deixar o correio chegar a alguém novamente precisa de uma nota dizendo quem pediu e quando, porque essa nota é o registro de seu consentimento. conhecido como líder, contato, envios de campanha, aplicação de emprego, alertas de emprego e IA assistente opt-out que compartilham o endereço história cada mudança como uma linha do tempo: o que se moveu (antes/depois), quem o fez e através de quê, da nota, e do pedido de que veio (endereço da rede, cadeia de encaminhamento, navegador, idioma) Além de uma alimentação de atividade org-wide, adicionando um endereço à mão, e uma exportação CSV. Fechado por GESTÃO EMAIL OPT OUTS (criança de GESTÃO EMAIL SETTINGS), espelhada em RoleRightType.ts e direitosHierarchy.ts; a aba, o item de menu e a placa de configuração só aparecem com ela.
· kamo-internal
Quadrado, botões chanfrados e um polegar de 2px em cada barra de rolagem
Os quatro botões da barra (suma para começar, um passo para trás, um passo para a frente, um salto para o fim) são agora 20px quadrados com cantos duros, e o polegar mantém apenas um raio de 2px. Ambos carregam um bisel de um pixel - luz ao longo da parte superior e esquerda, escuro ao longo a parte inferior e direita - em branco translúcido e preto, para que o mesmo bisel senta na página, uma marca, a paleta escura do terminal. A fração 'rounding' única da pele torna-se dois raios de pixel, polegarRadius e botãoRadius, porque "um par de pixels" é um absoluto. A chave quadrada é geometria em vez de pele: mantém-se numa barra curta (10x10 numa tira de 72px) e na pele arcade, cujo olhar é de outra forma inalterado.
· EmailService
Cada verificação de supressão e rejeição passa pelo registro de opt-out
SupressãoService agora pede EmailOptOutLedger, então uma verificação vê a lista de não- e- mail, pausas e tópicos iguais, e um salto cai na mesma história que um cancelamento. Chamadores nomear o tipo de correio que eles estão prestes a enviar: campanhas (materializar, restaurar, o portão tardio) perguntar sobre MARKETING CAMPAIGNS, partilhas de artigos sobre ARTICLES. Saltos carregam a resposta do servidor e a campanha na linha da história. OptOutSchemaProbe diz ao livro de registos se o KamoInitializerService criou os dois novos tabelas ainda; até que tenha, o envio honra a lista sozinho em vez de falhar em uma tabela faltando.
· kamo-shared-library
Um livro de contabilidade opt-out, tópicos, pausas e um histórico de cada mudança
A lista não-e-mail poderia ser escrita, mas não lida, alterada ou explicada. Isto acrescenta o único lugar de onde é lido e escrito, para cada serviço: email optout topics um endereço que parou um tipo de e- mail, ou parou tudo email optout events insert-only history: who (recipiente, membro, sistema), de onde (IP do cliente, toda a cadeia X-Forwarded-For, agente do usuário, idioma, host, referenciador, hash de sessão), porquê (razão, fonte, nota, feedback), através do que (campanha, chumbo), e do estado antes e depois email suppressions mantém seu significado, então cada remetente que já honra ainda faz. EmailOptOutLedger responde "pode isto ser enviado" de todos os três e escreve uma linha de histórico por parte do estado uma mudança realmente se moveu. Um membro que permite o correio novamente deve dizer porquê; que nota é o registro de consentimento. Até que as novas tabelas existam, o livro de registos volta para a lista sozinho e recusa alterações que não pode gravar, em vez de falhar envios. Classe simples, não um @Service: cada serviço verifica com.kamo, e um sem o e-mail repositórios não iriam começar a construí-lo. Cada serviço declara com @Bean. Também MANAGEM EMAIL OPT OUTS (320), o direito de org para Configurações -> E-mail -> Opt Out, filho de GESTÃO DE EMISSÕES.
· kamo-internal
Hosts de e-mail de saída, enviar janelas, aquecimento por host e a caixa de saída encenada
- Configurações → Plataforma → Configuração ganha uma guia E-Mail Hosts Outbound, atrás da plataforma MANAGEM OUTBOUND EMAIL HOSTS: os hosts compartilhados com cada organização e os mantidos para a organização da plataforma, com todas as configurações de conexão, disponibilidade, verificações de conexão, O teste envia e o aquecimento de cada hospedeiro. - Configurações → Email → Bulk Email Sender é reconstruído em GET bulk-provider/overview: a rotação de os hosts próprios da organização e a plataforma (switchable per organization), um round-robin view, o remetente, um editor de janelas de envio (dias da semana, vários intervalos de tempo, intervalos noturnos, seus próprios zona de tempo ou da organização), e um relatório de aquecimento em linguagem simples por anfitrião. O aquecimento pode já não está desligado. - /marketing/email/outbox lista todas as mensagens de correio electrónico — compostas apenas quando uma máquina o pode receber — e cancela e-mails únicos, uma seleção, ou tudo o resto, com desfazer. O espaço de trabalho, pacing banner e o editor de campanha link para ele e ler a nova capacidade por host. - Editor de host compartilhado com pré-voo ao vivo (endereços resolvidos, duplicado e endereço privado recusas), os hosts de saída e clientes da API da caixa de saída, e o status do destinatário CANCELled.
· EmailService
Vários hospedeiros de saída por org, enviados round-robin, cada um aquecido por conta própria, dentro de uma janela de envio
O correio de campanha de uma organização agora sai através de qualquer número de hosts de saída, uma mensagem em um tempo em rotação, em vez de um provedor de massa. - Hosts: uma organização própria (outboundHosts em seu blob provedor de massa) e da plataforma (plataformaOutboundHosts na blob da organização da plataforma), PARTICIPADO com cada organização ou PLATFORM ONly. Cada configuração SMTP é explícita: segurança, mecanismo SASL, verificação TLS e protocolos, nome HELO, remetente de envelopes, prazos, limites horários/diários, DSN, 8BITMIME, SOCKS. HostSessionFactory constrói a sessão a partir deles; EmailSmtpService.sendVia envia através dele. - O mesmo servidor nunca é adicionado duas vezes (mesmo nome ou qualquer endereço compartilhado, qualquer que seja a porta ou login), e o host de uma organização deve ser um servidor público: endereços são recusados em salvar e novamente antes de cada conexão. - O aquecimento é por anfitrião e está sempre ligado. WarmupService funciona em um WarmupHandle; um host de plataforma tem um aquecimento partilhado por todas as organizações que o utilizam. Novas corridas começam no início do dia local. - WarmupLançador é o único remetente: round-robin através de hosts de cada organização, pulando um host à espera da sua ranhura, na sua tampa, travada, no seu próprio limite ou no seu encosto, após não ter ligar. Uma conexão, TLS ou falha de login não conta mais uma tentativa contra o destinatário. - Enviar janela por organização (dias, um ou mais intervalos, zona própria ou org's). AquecimentoPacer espalha a tampa de cada dia apenas pela janela aberta. - Caixa de saída encenada: /api/email/campaigns/outbox lista destinatários em fila e cancela ou restaura-los. Um destinatário cancelado é SUPRESSED com uma nota (sem status DDL) e lê de volta como CANCELADO. - Pontos finais: **************************** máquinas de plataforma em ********** por trás dos hosts. A máquina única escreve Responde 410. - OutboundHostBackfill sementes o relé k3m1 como um hospedeiro PLATFORM ONLY e migra bolhas de um host. Sem mudanças de esquema.
· KlusterServices
Postfix-bulk aceita qualquer remetente do EmailService [skip ci]
O relé agora é um host de saída de plataforma que o correio de campanha de cada organização pode ir através, como o que quer que seja daquela organização envia como. Só o remetente nulo ainda é recusado, com um 4xx. A acessibilidade é inalterada: mynetworks e a Política de Rede limitam-na a Cápsulas de serviço de email. Aplicado diretamente (kubectl aplicar -f *******************
· kamo-shared-library
GESTÃO OUTBOUND EMAIL HOSTS, os hosts de e-mail de saída do console de plataforma
Uma plataforma direita para o correio de campanha de e-mail de saída sai: os hosts compartilhados com cada organização e os mantidos para a organização da plataforma, suas credenciais, disponibilidade e aquecimento. Forçado pela plataforma do EmailServiceOutboundHostsController através PlataformaRightsResolver. Aparecido, então nenhum direito existente é renumerado.
· kamo-internal
Apagar, filtrar e desligar as linhas NoReply Outbound
A página de auditoria ganha uma coluna de subsistema e filtro, seleção da caixa de seleção com "selecionar todos" e "selecionar todos os correspondentes", e apagar para uma linha, as linhas selecionadas, tudo que corresponda aos filtros, ou tudo, cada atrás de uma confirmação de que nomes da tabela as linhas são removidas. "Gravação e retenção" liga ou desliga a gravação de cada subsistema e define quanto tempo as fileiras são mantidas. A requisição cada delete torna-se, e como o modelo de seleção da grade é Ler, viver em... com os seus próprios testes.
· EmailService
O registro NoReply pode ser filtrado por subsistema, podado e dito o que gravar
Cada linha agora nomeia o subsistema que o enviou e, para um envio de modelo, a chave do modelo. EmailTemplateService e o remetente de campanha abrem um NoReplyOutboundSource escopo em torno de seu SMTP enviar; qualquer outra coisa é - Não, não. NoReplySubsystem mapeia as chaves canônicas do modelo subsistemas, e um teste falha se um modelo canônico não mapea para nenhum. Exclui ir para a própria tabela através NoReplyOutboundLedger: uma linha, até 1000 linhas selecionadas, cada linha correspondente aos filtros da lista, ou todo o livro (TRUNCATE), que tem de ser solicitado com confirmaçãoAll. O volume apaga em pedaços de 500. NoReplyOutboundSettings armazena um interruptor de gravação por subsistema e o retenção (30 dias por padrão, 0 mantém linhas até apagadas), em cache para 15 segundos por cápsula. NoReplyOutboundRetentionSweep purga de hora em hora em uma pod. Todos os novos objetivos são apenas para Deus, como a lista.
· InitializerService
O índice único (campanha, endereço) para um ambiente fresco
EmailService costumava criar **************** em cada startup; DDL neste cluster pertence aqui. Idempotente, autocompromisso (YugabyteDB constrói índices on-line), e duplicados são contados e registrados, nunca excluído - uma linha contatada é o registro permanente de uma campanha Endereço. O EmailService agora só verifica o índice com este nome.
· kamo-internal
O editor de campanha escreve edge to edge, mesclando tokens na sua própria coluna
O sujeito senta-se sob o título da campanha e o público ao lado do chip de status, de modo que a composição passo é o corpo de e- mail sozinho, preenchendo o meio da página, com os tokens de mesclagem em uma coluna em A direita. Nada salva por conta própria, então a página agora marca edita o servidor não viu e pergunta antes de sair iria descartá-los; TemplateInlineEditor relata o próprio corpo do membro edita separadamente da normalização do tempo de carga de Quill para que a marca não seja levantada apenas abrindo uma campanha.

Seu universo está esperando.
Comece gratuitamente em minutos.Adicione produtos sempre que estiver pronto — sem migração, sem novos logins.
Gratuito para sempre — não é necessário cartão de crédito