# Anexos

> Anexe arquivos aos e-mails da API como conteúdo em base64 ou a partir de uma URL, incorpore imagens inline com Content-ID e respeite os tipos de arquivo permitidos e os limites de tamanho.

Esta página mostra como anexar arquivos aos e-mails que você envia com `POST /emails`, como conteúdo codificado em base64 ou deixando o Emailit baixá-los de uma URL. Ela também trata de imagens inline, tipos de arquivo permitidos e limites de tamanho.

## Campos do anexo

Passe um array `attachments`. Cada item é um objeto com estes campos:

- `filename` (string, obrigatório): Nome do arquivo mostrado ao destinatário. Deve terminar com uma [extensão permitida](#allowed-file-types).
- `content` (string): O arquivo codificado em base64. Use `content` ou `url`, não os dois.
- `url` (string): Uma URL `http://` ou `https://` de onde o Emailit baixa o arquivo. Use `content` ou `url`, não os dois.
- `content_type` (string): O tipo MIME, como `application/pdf`. Obrigatório com `content`. Com `url`, o padrão é o `Content-Type` que o servidor retorna.
- `content_id` (string): Um Content-ID. Defini-lo torna o anexo inline, para que o seu HTML possa exibi-lo com `cid:`.
- `encoding` (string): Como `content` está codificado. Deixe como `base64`, a menos que você tenha um motivo para mudar.

## Anexar um arquivo em base64

Leia o arquivo, codifique-o em base64 e envie-o com o tipo MIME dele.

**cURL**

```bash
curl https://api.emailit.com/v2/emails \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"from\": \"Acme Billing <billing@acme.com>\",
    \"to\": \"ada@example.com\",
    \"subject\": \"Invoice INV-1042\",
    \"text\": \"Your invoice is attached.\",
    \"attachments\": [{
      \"filename\": \"INV-1042.pdf\",
      \"content\": \"$(base64 < INV-1042.pdf | tr -d '\n')\",
      \"content_type\": \"application/pdf\"
    }]
  }"
```

**Node.js**

```javascript
import { readFile } from 'node:fs/promises';
import { Emailit } from '@emailit/node';

const emailit = new Emailit(process.env.EMAILIT_API_KEY);
const pdf = await readFile('INV-1042.pdf');

await emailit.emails.send({
  from: 'Acme Billing <billing@acme.com>',
  to: 'ada@example.com',
  subject: 'Invoice INV-1042',
  text: 'Your invoice is attached.',
  attachments: [
    {
      filename: 'INV-1042.pdf',
      content: pdf.toString('base64'),
      content_type: 'application/pdf',
    },
  ],
});
```

**Python**

```python
import base64
import os
from emailit import EmailitClient

client = EmailitClient(os.environ["EMAILIT_API_KEY"])

with open("INV-1042.pdf", "rb") as f:
    pdf = base64.b64encode(f.read()).decode("ascii")

client.emails.send({
    "from": "Acme Billing <billing@acme.com>",
    "to": "ada@example.com",
    "subject": "Invoice INV-1042",
    "text": "Your invoice is attached.",
    "attachments": [{
        "filename": "INV-1042.pdf",
        "content": pdf,
        "content_type": "application/pdf",
    }],
})
```

**PHP**

```php
$emailit = Emailit::client(getenv('EMAILIT_API_KEY'));

$emailit->emails()->send([
    'from' => 'Acme Billing <billing@acme.com>',
    'to' => 'ada@example.com',
    'subject' => 'Invoice INV-1042',
    'text' => 'Your invoice is attached.',
    'attachments' => [[
        'filename' => 'INV-1042.pdf',
        'content' => base64_encode(file_get_contents('INV-1042.pdf')),
        'content_type' => 'application/pdf',
    ]],
]);
```

## Anexar um arquivo a partir de uma URL

Em vez de codificar o arquivo você mesmo, informe uma `url` ao Emailit. O Emailit baixa o arquivo enquanto monta a mensagem, então a requisição demora o mesmo tempo que o download.

```json
{
  "from": "Acme Billing <billing@acme.com>",
  "to": "ada@example.com",
  "subject": "Invoice INV-1042",
  "text": "Your invoice is attached.",
  "attachments": [
    {
      "filename": "INV-1042.pdf",
      "url": "https://files.acme.com/invoices/INV-1042.pdf"
    }
  ]
}
```

A URL precisa atender a estas regras, senão a requisição falha com `422` e `Attachment error`:

- Ela usa `http` ou `https` e aponta para um host público. Endereços privados e internos são recusados.
- Ela retorna o arquivo diretamente, com um status `2xx`. Redirecionamentos não são seguidos.
- O download termina em até 30 segundos.
- O arquivo não tem mais de 25 MB, conforme informado pelo cabeçalho `Content-Length` dele.

O Emailit monta uma cópia separada da mensagem para cada destinatário e baixa os anexos por URL para cada cópia. Garanta que URLs assinadas ou com validade continuem válidas durante toda a requisição e que o servidor dos arquivos aguente um download por destinatário.

## Incorporar imagens inline

Para exibir uma imagem dentro do corpo HTML em vez de como um anexo separado, dê a ela um `content_id` e faça referência a esse ID com `cid:` em uma tag `img`.

```json
{
  "from": "Acme <hello@acme.com>",
  "to": "ada@example.com",
  "subject": "Your weekly report",
  "html": "<p><img src=\"cid:chart-week-40\" alt=\"Weekly signups\" width=\"600\"></p>",
  "attachments": [
    {
      "filename": "chart.png",
      "content": "iVBORw0KGgoAAAANSUhEUgAA...",
      "content_type": "image/png",
      "content_id": "chart-week-40"
    }
  ]
}
```

O `content_id` do anexo e o valor depois de `cid:` devem ser exatamente iguais. Imagens inline deixam a mensagem maior para cada destinatário, então, para logotipos e outras imagens compartilhadas, uma URL de imagem hospedada no HTML costuma ser a melhor escolha.

## Limites de tamanho

| Limite | Valor |
| --- | --- |
| Mensagem inteira, depois da codificação | 40 MB. Mensagens maiores falham com `413 Message too large`. |
| Um anexo baixado de `url` | 25 MB |
| Timeout de download para `url` | 30 segundos |
| Corpo JSON da requisição | 50 MB |

A codificação base64 deixa os arquivos cerca de um terço maiores, e o limite de 40 MB vale para a mensagem codificada. Na prática, mantenha o tamanho somado dos seus arquivos abaixo de uns 29 MB. Para qualquer coisa maior, envie o arquivo para o seu próprio armazenamento e mande um link.

## Tipos de arquivo permitidos

`filename` deve terminar com uma destas extensões. Qualquer outra extensão, ou um nome sem extensão, falha na validação com `400`.

| Categoria | Extensões |
| --- | --- |
| Texto | `.txt`, `.csv`, `.log`, `.css`, `.ics`, `.xml` |
| Imagens | `.jpg`, `.jpe`, `.jpeg`, `.gif`, `.png`, `.bmp`, `.psd`, `.tif`, `.tiff`, `.svg`, `.indd`, `.ai`, `.eps` |
| Documentos | `.doc`, `.docx`, `.rtf`, `.odt`, `.ott`, `.pdf`, `.pub`, `.pages`, `.mobi`, `.epub` |
| Áudio | `.mp3`, `.m4a`, `.m4v`, `.wma`, `.ogg`, `.flac`, `.wav`, `.aif`, `.aifc`, `.aiff` |
| Vídeo | `.mp4`, `.mov`, `.avi`, `.mkv`, `.mpeg`, `.mpg`, `.wmv` |
| Planilhas | `.xls`, `.xlsx`, `.ods`, `.numbers` |
| Apresentações | `.odp`, `.ppt`, `.pptx`, `.pps`, `.key` |
| Arquivos compactados e contatos | `.zip`, `.vcf` |
| E-mail | `.eml` |
| Assinaturas e criptografia | `.p7c`, `.p7m`, `.p7s`, `.pgp`, `.asc`, `.sig` |

Arquivos executáveis e scripts não estão na lista e não podem ser anexados.

## Ler os anexos de um e-mail enviado

[Listar anexos](/pt/docs/api-reference/emails/attachments/) (`GET /emails/{id}/attachments`) retorna cada anexo com `filename`, `content_type`, `size`, `content_id`, `content_disposition` (`attachment` ou `inline`) e o `content` em base64. É preciso uma chave **Full Access**. Os anexos são excluídos junto com o conteúdo da mensagem quando termina o seu período de [retenção de dados](/pt/docs/data-retention/).

## Solução de problemas

| Erro | O que verificar |
| --- | --- |
| `Attachment at index 0 missing content_type (required when using 'content')` | Adicione `content_type` a todos os anexos em base64. |
| `Attachment 'report.exe' has unsupported file type '.exe'` | Use uma extensão permitida ou coloque o arquivo em um `.zip`. |
| `Attachment at index 0 cannot have both 'content' and 'url'` | Envie só um dos dois. |
| `Attachment error` com `Failed to fetch attachment` | A URL retornou um status de erro, redirecionou, deu timeout ou não é pública. Abra-a a partir de um servidor fora da sua rede para verificar. |
| `Attachment error` com `Attachment too large (max 25MB)` | Hospede o arquivo e envie um link no lugar dele. |
| `413 Message too large` | Reduza o tamanho total dos anexos. |

## Veja também

- [Enviar um e-mail](/pt/docs/email-api/send-email/)
- [Enviar um e-mail](/pt/docs/api-reference/emails/send/) na referência da API
- [Retenção de dados](/pt/docs/data-retention/)

---
Fonte: https://emailit.com/pt/docs/email-api/attachments/
