Relay API Design: Construa uma base de entrega de e-mail com Cloudflare Workers

Esta página é uma tradução automática do original em japonês. Ler o original em japonês

1. Por que você não usou o provedor de e-mail externo API

Ao criar um aplicativo que envia notas por e-mail, a primeira coisa que vem à mente é enviar API de um grande provedor de e-mail. No entanto, para desenvolvedores individuais, o obstáculo da revisão Google OAuth foi extremamente alto.

Google OAuth Aplicativos que não passaram na revisão receberão uma tela de aviso dizendo "Este aplicativo não foi verificado por Google". Este aviso é fatal para o aplicativo de memorando. Os usuários enviam seus pensamentos e informações pessoais como um memorando. Se a primeira experiência diz "não verificado", quem confiaria neste aplicativo?

Google OAuth O processo de inscrição para a revisão é um caminho difícil para desenvolvedores individuais. Preparação de políticas de privacidade, explicação da legitimidade do escopo, avaliação de segurança - independentemente de ser uma equipe de uma grande empresa, o custo para pagar por uma única função de entrega de e-mail é muito grande para um aplicativo desenvolvido sozinho.

O que era necessário era uma solução que pudesse enviar e-mails sem prejudicar a confiança do usuário sem a complexidade da revisão OAuth. A resposta é o meu próprio Relay API.

2. Cloudflare Trabalhadores + Resend API Arquitetura

A arquitetura do Relay API é simples e robusta. Receba uma solicitação do aplicativo iOS e retransmita-a para o serviço de envio de e-mail - ela foi projetada especificamente para isso.

Aplicativo iOS → Relay API (Trabalhadores Cloudflare) → Resend API → Entrega por e-mail

Cloudflare Workers é uma plataforma sem servidor que executa código TypeScript em locais de ponta em todo o mundo. De acordo com a descrição do Cloudflare, não há início frio que ocorra em uma máquina virtual sem servidor porque ele executa código em um ambiente de execução leve chamado isolado.

Resend API é um serviço moderno de envio de e-mail. É fácil configurar SPF/DKIM/DMARC e pode ser facilmente chamado a partir do TypeScript.

Quanto aos custos, o plano gratuito de Cloudflare Workers permite até 100000 requisições a cada 1 dia. O de Resend permite até 100 mensagens a cada 1 dia e 3,000 por mês, segundo as páginas de preços de cada empresa em 10 de 2026. Essa estrutura permite começar pequeno e adotar planos pagos conforme o volume de envios cresce.

3 Verificação de endereço de e-mail (método de código de dígitos 6)

Relay API envia notas apenas para endereços de e-mail verificados. Esta é a camada mais básica de defesa para evitar abusos.

Antes de começar a enviar notas, você precisa de um fluxo para verificar o endereço de e-mail do destino.

  • Usuários inserem seu endereço de e-mail no aplicativo
  • Relay API envia um código de verificação 6 dígitos para esse endereço
  • Digite o código de dígitos 6 recebido pelo usuário no aplicativo
  • Verificação concluída. Depois disso, você poderá enviar notas para esse endereço de e-mail

Este mecanismo impede o envio não autorizado de notas para endereços de e-mail de outras pessoas. O código de verificação será enviado para a caixa de entrada desse endereço, portanto, se você não puder ver a caixa de entrada, não poderá verificar o endereço como o destino.

A verificação é apenas uma vez por endereço de e-mail. Assim que a verificação for concluída, você poderá continuar enviando notas sem inserir o código.

4. Implementação de limites de taxa de várias camadas

Para evitar o abuso do envio de e-mails API, implementamos limites de taxa em várias camadas.

const RATE_LIMITS = {
  devicePerMinute: 30,
  devicePerDay: 200,
  ipPerHour: 120,
  globalPerDay: 300,
};
Nível do Dispositivo
Restrição por dispositivo
Evite a transmissão excessiva de dispositivos 1. Defina o limite superior de 30 casos por 1 minuto e 200 casos por 1 por dia. É um limite que não pode ser atingido pelo uso normal de memorandos, mas interromperá a transmissão em massa por automação.
Nível IP
Limite de unidade de endereço IP
Restringe solicitações em massa da mesma rede. 1 120 por hora. Proteja a infraestrutura de ataques usando vários dispositivos.
Global
Restrições globais
Proteção de toda a infraestrutura. O limite superior global de 300 por 1 por dia é definido como a última parada (o número de cada limite superior é do momento do projeto e está sujeito a alterações).
2026-09 Pós-escrito
O limite superior atual
O limite superior para cada terminal e o limite superior do total de 1 dias foram removidos em 2026 6. O limite de transmissão atual é o limite superior por 1 hora por endereço IP.

O contador é armazenado em Cloudflare KV e redefinido para cada janela de tempo. Ao passar pela transmissão normal, ele suprime o acesso em massa não autorizado.

5. Igualdade de poder: projetado para não enviar o mesmo memorando duas vezes

A comunicação em rede é incerta. A comunicação pode ser interrompida entre o momento em que você pressiona o botão enviar e a resposta é retornada. O aplicativo determina que é um tempo limite e tenta reenviá-lo, mas, na verdade, a primeira solicitação foi entregue ao servidor - um cenário comum.

Para esta cena, vamos nos preparar com idempotência.

  • Atribua um UUID exclusivo (ID de mensagem) a cada memorando
  • Relay API passa o ID da mensagem como a Chave de Idempotência da solicitação para o serviço de envio de e-mail (Resend)
  • Resend lembra a mesma chave para 24 horas, e se a mesma solicitação de conteúdo vier novamente, ela retornará a mesma resposta de antes sem enviar um e-mail
  • O aplicativo retornará uma resposta bem-sucedida (a 2th é a mesma resposta que o 1)

Com este design, mesmo que a rede esteja instável e ocorra uma nova tentativa, o mesmo memorando não será enviado sobreposto durante as horas 24 (o período em que o Resend se lembra da chave). É dentro deste período que a duplicação pode ser interrompida porque é impossível distinguir o reenvio depois disso.

6 Vantagens da computação de ponta

A maior razão para adotar o Cloudflare Workers como plataforma de entrega de e-mail é a vantagem inerente da computação de ponta.

Latência
locais de borda ao redor do mundo = baixa latência
Cloudflare é baseado em mais de 300 cidades ao redor do mundo. Como a solicitação é processada em uma base próxima ao usuário, a distância de comunicação é menor do que ir e voltar para o servidor distante 1 (o tempo de resposta será alterado, incluindo o processamento do serviço de envio de e-mail).
Arreinda a frio
Não há partida a frio do tipo de máquina virtual
Em casos sem servidor em execução em máquinas virtuais e contêineres, a primeira solicitação depois de não ter sido usada por um tempo é aguardar a inicialização (início frio). Cloudflare explica que essa espera não ocorre porque os trabalhadores Cloudflare se movem isolados.
Operações
Dimensionamento automático sem gerenciamento de infraestrutura
Gerenciamento de servidor, planejamento de capacidade, configurações de dimensionamento - tudo isso é desnecessário. Se a solicitação aumentar, ela será dimensionada automaticamente e nenhum custo será incorrido quando estiver ociosa.

Para o aplicativo de memo, essa combinação foi uma escolha fácil de usar. O processamento começa em uma base próxima ao usuário, não há necessidade de gerenciar o servidor e, se for pequeno, o custo pode ser reduzido. É por isso que eu fiz o Relay API em computação de ponta.

Por favor, tente o "SimpleMemo" construído sobre esta base técnica.

Baixar com App Store

Referências