---
name: azion-envie-email-transacional-com-resend-e-functions
description: >-
  Construa um endpoint Hono em Azion Functions que chama a API do Resend, armazene a API key como variável de ambiente e faça o deploy com Azion CLI.
---

# Envie email transacional com Resend e Functions

Neste tutorial, você vai construir um endpoint HTTP em Azion Functions que envia um email transacional pelo Resend. Você vai criar o projeto a partir de um template, escrever o handler, armazenar a API key, fazer o deploy do projeto e enviar uma mensagem real.

O projeto finalizado está no [repositório edge-functions-examples](https://github.com/egermano/edge-functions-examples/tree/main/packages/resend).

---

## Pré-requisitos

- Uma conta Azion. Para criar uma, consulte [Como criar uma conta na Azion](/pt-br/documentacao/fundamentos/criar-uma-conta/).
- Uma conta [Resend](https://resend.com/) com uma API key.
- Azion CLI instalada. Para as opções de instalação, consulte [Azion CLI](/pt-br/documentacao/devtools/cli/).
- Node.js versão 18 ou superior.

---

## 1. Crie o projeto a partir do template Hono

Para autorizar a CLI e criar o projeto:

1. **Autentique Azion CLI**

   Execute o comando de login:

   ```bash
   azion login
   ```

   Sem as flags de credencial, a CLI abre um fluxo pelo navegador. Ela armazena as credenciais localmente, e todo comando seguinte é autorizado na sua conta.

2. **Inicialize o projeto**

   Execute o comando de inicialização no diretório que guarda seus projetos:

   ```bash
   azion init
   ```

   O comando abre uma jornada interativa.

3. **Nomeie o projeto**

   Digite um nome, ou pressione `enter` para aceitar a sugestão:

   ```sh
   ? Your application's name:  (black-thor)
   ```

4. **Selecione o preset Hono**

   A CLI lista os presets que ela suporta:

   ```sh
   ? Choose a preset:  [Use arrows to move, type to filter]
     Angular
     Astro
     Docusaurus
     Eleventy
     Emscripten
     Gatsby
     Hexo
   > Hono
     Hugo
     Javascript
     ...
   ```

5. **Selecione o template Hono Boilerplate**

6. **Recuse o servidor local e o deploy**

   A CLI oferece um servidor de desenvolvimento local e um deploy. Responda `N` para os dois, porque o handler ainda não está escrito:

   ```sh
   Do you want to start a local development server? (y/N)
   Do you want to deploy your project? (y/N)
   ```

7. **Instale as dependências do projeto**

   Vá para o diretório do projeto e instale as dependências dele:

   ```bash
   cd <your-project-name>
   npm install
   ```

O diretório do projeto contém o template Hono e as dependências dele.

---

## 2. Escreva o handler que chama a API do Resend

O handler responde a uma requisição `GET` no path raiz, envia a mensagem para a API do Resend e retorna a resposta da API em JSON. O campo `entry` do `azion.config.js` indica o arquivo de entrada do projeto. Abra esse arquivo e substitua o conteúdo dele por:

```typescript
import { Hono } from "hono";

const app = new Hono();

const RESEND_API_KEY = Azion.env.get("RESEND_API_KEY")!;
const EMAIL_TO = "<your-email-address>";

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 = await res.json();

  return c.json(data);
});

export default app;
```

Defina `EMAIL_TO` com o endereço que recebe a mensagem. O campo `html` carrega o corpo da mensagem como uma string HTML, então um template literal substitui os valores que mudam por destinatário.

A última linha exporta a aplicação como um handler ES Modules, o padrão que Azion recomenda em vez do padrão legado Service Worker. Para os dois padrões e a migração entre eles, consulte [Migre padrões de handler em Functions](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/functions-e-runtime/migrar-padroes-de-handler/).

---

## 3. Armazene a API key do Resend como variável de ambiente

O handler lê `RESEND_API_KEY` em tempo de execução, então a chave fica fora dos arquivos do projeto e fora do controle de versão. Para criar a variável na sua conta:

```bash
azion create variables --key "RESEND_API_KEY" --value "[TOKEN VALUE]" --secret true
```

Uma variável cuja chave contém `password`, `pwd`, `secret`, `key`, `hash`, `encrypted`, `passcode`, `auth` ou `token` é enviada como secret por padrão. A flag `--secret true` repete esse padrão aqui. Dê à API key do Resend o menor conjunto de permissões que a chamada de envio exige.

Para substituir o valor depois, execute `azion update variables` e faça um novo deploy do projeto. Uma alteração em uma variável não chega a uma função que já está rodando.

A conta guarda a variável, e o handler a lê pela chave após o deploy.

---

## 4. Faça o deploy do projeto

Para compilar o projeto e publicá-lo:

```bash
azion deploy
```

O deploy envia o código da função, configura a aplicação, define as regras de roteamento e aplica as variáveis de ambiente e os segredos. Ao final, ele retorna um domínio no formato `https://xxxxxxx.map.azionedge.net`. Azion abre o navegador na página do Azion Console que carrega os logs do deploy.

> **Atenção**
>
> O endpoint publicado é público, e toda requisição para ele envia uma mensagem. Antes que o handler receba o destinatário ou o corpo da requisição, valide e sanitize os dois campos, exija autenticação na rota e limite a taxa de requisições dela.

O endpoint responde no domínio retornado alguns minutos após a propagação.

---

## 5. Envie o primeiro email

Para executar o handler, requisite o path raiz do domínio que o deploy retornou:

```bash
curl https://<your-azion-domain>/
```

O corpo da resposta é o JSON que a API do Resend retorna para a requisição. A mensagem chega na caixa de entrada do endereço definido em `EMAIL_TO`, com o assunto `hello world` e o corpo `it works!`.

> **nota**
>
> Se a resposta trouxer um erro do Resend, confirme que `RESEND_API_KEY` existe na sua conta e que o projeto passou por deploy depois da criação da variável. Para uma função que não é executada, que para antes do fim ou que escreve um erro nos logs, consulte [Solução de problemas de execução e logs de funções](/pt-br/documentacao/plataforma/functions/solucao-de-problemas/).

O endpoint agora envia um email transacional em toda requisição para o path raiz dele.

---

## Próximos passos

- [Variáveis de ambiente](/pt-br/documentacao/plataforma/functions/environment-variables.md): Os três campos de uma variável, a interface que lê uma delas e os subcomandos da CLI que as gerenciam.
- [Migre padrões de handler em Functions](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/functions-e-runtime/migrar-padroes-de-handler.md): Os handlers ES Modules e Service Worker, seus parâmetros e como migrar uma função entre eles.
- [Limites de Functions](/pt-br/documentacao/plataforma/functions/limites.md): Os tetos de tempo de CPU, de tempo total e de sub-requisições dentro dos quais uma invocação roda.
- [Boas práticas de Functions](/pt-br/documentacao/plataforma/functions/boas-praticas.md): O que cada parte do handler faz e as decisões de design que mantêm uma invocação dentro dos seus limites.
- [Deploy de aplicação Jamstack com Hono](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/frameworks/hono.md): A jornada completa do azion init para um projeto Hono, incluindo o servidor de desenvolvimento local.
- [API do Resend](https://resend.com/docs): Os campos que o endpoint de emails do Resend aceita e o resto da API dele.
