# Como integrar o serviço de email Resend com Functions

import DocButton from '~/components/webkit/DocButton.vue';

Este guia demonstra como integrar o serviço de email Resend com Azion Functions para enviar emails transacionais diretamente do edge. Esta integração fornece entrega de email rápida e confiável com performance otimizada e alcance global.

:::tip
Esta demonstração mostra como aproveitar Functions para operações de email mantendo padrões de segurança e performance no edge.
:::

## Requisitos

Antes de começar, certifique-se de ter:

- Uma [conta na Azion](https://console.azion.com/)
- Uma [conta no Resend](https://resend.com/) com acesso à API
- [Azion CLI](/pt-br/documentacao/produtos/azion-cli/visao-geral/) instalada e configurada
- [Node.js](https://nodejs.org/) versão 18 ou superior

## Código

Esse é um exemplo de como usar o Resend com Azion Functions para enviar emails transacionais. O exemplo completo de código você pode encontrar no [repositório do GitHub](https://github.com/egermano/edge-functions-examples/tree/main/packages/resend).

```typescript
import { Hono } from "hono";
import { fire } from "hono/service-worker";


const app = new Hono();

const RESEND_API_KEY = process.env.RESEND_API_KEY!;
const EMAIL_TO = "your.email@azion.com";

app.get("/", async (c) => {
  const res = await fetch("https://api.resend.com/emails", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${RESEND_API_KEY}`,
    },
    body: JSON.stringify({
      from: "onboarding@resend.dev",
      to: EMAIL_TO,
      subject: "hello world",
      html: "<strong>it works!</strong>",
    }),
  });

  const data: any = await res.json();

  return c.json(data);
});

fire(app);
```

## Deploy na Azion

### Passo 1: Autentique-se na Azion

1. Faça login na sua conta Azion via CLI:

```bash
azion login
```

2. Siga os prompts de autenticação para conectar sua CLI com sua conta Azion.

### Passo 2: Crie secrets para chaves de API

Para segurança, armazene sua chave de API do Resend como um secret:

```bash
azion create secret RESEND_API_KEY
```

Quando solicitado, digite sua chave de API do Resend. Isso garante que seus dados sensíveis sejam criptografados e seguros.

### Passo 3: Faça o deploy da Function

Faça o deploy de sua aplicação de email na edge network da Azion:

```bash
azion deploy
```

O processo de deploy irá:

- Fazer upload do código da sua Function
- Configurar a application
- Configurar as regras de roteamento necessárias
- Configurar variáveis de ambiente e secrets
- Fornecer um domínio único

### Passo 4: Acesse sua aplicação

Após o deploy, você receberá um domínio como `https://xxxxxxx.map.azionedge.net`. Sua aplicação de email estará disponível nesta URL em alguns minutos após a propagação do DNS.

## Entendendo a implementação

### Processo de envio de email

A Function do Resend tipicamente manipula:

1. **Validação de requisição**: Verificação de parâmetros de email e autenticação
2. **Composição de email**: Construção de conteúdo de email com templates
3. **Integração com API**: Comunicação com a API do Resend
4. **Manipulação de resposta**: Processamento de respostas da API e erros
5. **Registro**: Registro de atividades de envio de email

### Principais benefícios

- **Performance**: Processamento de email no edge reduz latência
- **Confiabilidade**: Infraestrutura robusta do Resend garante entrega
- **Escalabilidade**: Escala automaticamente com a demanda
- **Alcance global**: Edge locations oferecem cobertura mundial
- **Eficiência de custo**: Custos otimizados de entrega de email

## Testando sua aplicação de email

### Passo 1: Teste a funcionalidade de envio de email

1. Navegue até sua aplicação implementada
2. Use o formulário de email para enviar emails de teste
3. Verifique se os emails são entregues aos destinatários
4. Verifique formatação e conteúdo do email

### Passo 2: Teste tratamento de erros

1. **Endereços de email inválidos**: Teste com endereços de email malformados
2. **Rate limiting**: Teste com requisições sucessivas rápidas
3. **Falhas de autenticação**: Teste com chaves de API inválidas
4. **Problemas de rede**: Teste tratamento de erros para falhas da API

### Passo 3: Testes de performance

1. **Tempo de resposta**: Meça tempos de resposta de envio de email
2. **Requisições simultâneas**: Teste múltiplos envios de email simultâneos
3. **Taxas de erro**: Monitore taxas de sucesso e falha

## Casos de uso comuns

- **Emails de boas-vindas**: Enviar emails de onboarding para novos usuários
- **Redefinição de senhas**: Lidar com notificações de email de redefinição de senha
- **Confirmações de pedidos**: Enviar emails transacionais para compras
- **Emails de notificação**: Enviar alertas e atualizações aos usuários
- **Formulários de contato**: Lidar com submissões de formulários com notificações por email

## Templates de email e personalização

### Usando templates HTML

Crie templates de email dinâmicos com placeholders:

```html
<!DOCTYPE html>
<html>
<head>
    <title>Bem-vindo ao Nosso Serviço</title>
</head>
<body>
    <h1>Bem-vindo, {{nome}}!</h1>
    <p>Obrigado por se juntar à {{empresa}}. Estamos empolgados em tê-lo conosco.</p>
    <p>Sua conta agora está ativa e pronta para uso.</p>
</body>
</html>
```

### Variáveis de template

Substitua placeholders com conteúdo dinâmico:

```javascript
const emailTemplate = html.replace('{{nome}}', userData.name)
                         .replace('{{empresa}}', 'Sua Empresa');
```

## Solução de problemas

### Problemas comuns e soluções

- **Falhas de entrega de email**: Verifique validade da chave de API e configuração do domínio
- **Rate limiting**: Implemente throttling de requisições adequado
- **Renderização de template**: Verifique sintaxe do template e substituição de variáveis
- **Erros de autenticação**: Certifique-se de que a chave de API esteja configurada corretamente como secret

### Melhores práticas de tratamento de erros

1. **Registro detalhado**: Registre todas as tentativas de envio de email e resultados
2. **Mecanismos de retry**: Implemente lógica de retry para falhas temporárias
3. **Degradação eficiente**: Lide com downtime da API adequadamente
4. **Feedback do usuário**: Forneça mensagens de status claras aos usuários

## Considerações de segurança

### Gerenciamento de chaves de API

- **Use secrets**: Sempre armazene chaves de API como secrets da Azion
- **Rotacione regularmente**: Rotacione periodicamente suas chaves de API
- **Monitore uso**: Rastreie uso de chaves de API e padrões de acesso
- **Limite permissões**: Use chaves de API com permissões mínimas necessárias

### Validação de entrada

- **Validação de email**: Valide endereços de email antes do envio
- **Sanitização de conteúdo**: Limpe e valide conteúdo de email
- **Rate limiting**: Implemente rate limiting para prevenir abuso
- **Autenticação**: Adicione autenticação adequada aos seus endpoints de email

## Recursos avançados

### Envio de email em lote

Implemente funcionalidade de email em lote para campanhas de newsletter e marketing:

```javascript
async function sendBatchEmails(recipients, template) {
    const batchSize = 100;
    for (let i = 0; i < recipients.length; i += batchSize) {
        const batch = recipients.slice(i, i + batchSize);
        await processBatch(batch, template);
    }
}
```

### Rastreamento de email

Adicione capacidades de rastreamento para monitorar engajamento de email:

- **Rastreamento de abertura**: Rastreie quando emails são abertos
- **Rastreamento de cliques**: Monitore cliques em links nos emails
- **Tratamento de bounce**: Lide com emails devolvidos (bounces) adequadamente
- **Gerenciamento de unsubscribe**: Processe solicitações de cancelamento de inscrição (unsubscribe)

## Próximos passos

- Explore técnicas avançadas de criação de templates de email
- Implemente analytics e rastreamento de email
- Adicione agendamento de email e envio atrasado
- Integre com outros produtos Azion como Object Storage
- Monitore performance de entrega de email e otimize adequadamente

---

<DocButton href="https://resend.com/docs" label="Documentação da API Resend" size="medium" />
<DocButton href="/pt-br/documentacao/produtos/build/applications/functions/" label="Saiba mais sobre Functions" size="medium" />