Como funciona
A mensagem tem duas partes ou mais:
- Texto do e-mail: o conteúdo que o destinatário lê.
- Anexo: o arquivo convertido em Base64, com nome e tipo.
A API interpreta a estrutura e entrega o e-mail com o arquivo anexado.
Formato da requisição
Endpoint: POST https://api.smtplw.com.br/v1/messages
Headers:
- Content-Type: application/json
- x-auth-token: SEU_TOKEN
Exemplo prático de envio com anexo “relatorio.pdf” demonstrando visualmente o corpo e o anexo do e-mail. (Envio.png)


(Boundary_Requisicao)
O valor de boundary declarado no header marca o início de cada parte do body, e a mensagem termina com o mesmo valor seguido de –.
Modelo do JSON:
{ "subject": "Assunto do e-mail", "from": "remetente@seudominio.com.br", "to": "destinatario@dominio.com.br", "headers": { "Content-Type": "multipart/mixed; boundary=\"LW_BOUNDARY_123\"" }, "body": "--LW_BOUNDARY_123\r\nContent-Type: text/plain; charset=utf-8\r\n\r\nTexto do e-mail aqui.\r\n\r\n--LW_BOUNDARY_123\r\nContent-Type: application/pdf; name=\"arquivo.pdf\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\"arquivo.pdf\"\r\n\r\nBASE64_DO_ARQUIVO\r\n--LW_BOUNDARY_123--\r\n" }Exemplo pronto
O script abaixo lê o arquivo, converte para Base64, identifica o tipo e monta o JSON automaticamente. Ele roda em Linux com curl e python3.
TOKEN="SEU_TOKEN" URL="https://api.smtplw.com.br/v1/messages" FROM="remetente@seudominio.com.br" TO="destinatario@dominio.com.br" ASSUNTO="Relatório do mês" TEXTO="Olá! Segue em anexo o relatório." ARQUIVO="/caminho/do/arquivo/relatorio.pdf" python3 "FROM""TO" "ASSUNTO""TEXTO" "$ARQUIVO" > envio.json <<'PY' import json, sys, base64, os, mimetypes frm, to, assunto, texto, arquivo = sys.argv[1:6] nome = os.path.basename(arquivo) tipo = mimetypes.guess_type(arquivo)[0] or "application/octet-stream" b64 = base64.b64encode(open(arquivo, "rb").read()).decode() linhas = "\r\n".join(b64[i:i+76] for i in range(0, len(b64), 76)) B = "LW_BOUNDARY_123" body = ( f"--{B}\r\nContent-Type: text/plain; charset=utf-8\r\n\r\n{texto}\r\n\r\n" f"--{B}\r\nContent-Type: {tipo}; name=\"{nome}\"\r\n" "Content-Transfer-Encoding: base64\r\n" f"Content-Disposition: attachment; filename=\"{nome}\"\r\n\r\n" f"{linhas}\r\n--{B}--\r\n" ) print(json.dumps({ "subject": assunto, "from": frm, "to": to, "headers": {"Content-Type": f'multipart/mixed; boundary="{B}"'}, "body": body })) PY curl -s -i -X POST "$URL" \ -H "Content-Type: application/json" \ -H "x-auth-token: $TOKEN" \ -d @envio.json | grep -iE "^HTTP|^location"
Vários anexos
Para enviar mais de um arquivo, repita a parte do anexo antes do fechamento LW_BOUNDARY_123–. Estrutura do body com dois anexos:
--LW_BOUNDARY_123 Content-Type: text/plain; charset=utf-8 Texto do e-mail --LW_BOUNDARY_123 Content-Type: application/pdf; name="relatorio.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="relatorio.pdf" (Base64 do PDF) --LW_BOUNDARY_123 Content-Type: image/png; name="grafico.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="grafico.png" (Base64 da imagem) --LW_BOUNDARY_123--No JSON, essas quebras de linha são escritas como \r\n.
Limites e tipos de arquivo
O campo body aceita até 1 MB, já com os anexos em Base64. Como o Base64 aumenta o arquivo em cerca de 33%, cabem por volta de 700 KB de anexos por mensagem.
| Item | Limite
|
|---|---|
| Tamanho do body (texto + anexos em Base64) | 1 MB |
| Destinatários por mensagem | 1.000 |
| Envios por minuto | 1.000 |
| Cabeçalhos por mensagem | 50 |
| Extensão | Content-Type
|
|---|---|
| application/pdf | |
| .png | image/png |
| .jpg | image/jpeg |
| .zip | application/zip |
| .docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document |
| .xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
O script de exemplo identifica o tipo automaticamente.
Consultar o status do envio
O ID da mensagem vem no header location da resposta. Para acompanhar o envio:
curl -s https://api.smtplw.com.br/v1/messages/ID_DA_MENSAGEM -H “x-auth-token: SEU_TOKEN”
| Status | Significado
|
|---|---|
| Enfileirado | A mensagem está na fila para envio |
| Enviado | A mensagem foi enviada |
| Erro | Falha no envio; o detalhe aparece no campo response |