1. Home
  2. SMTP Locaweb
  3. Como enviar e-mails com anexo pela API do SMTP Locaweb

Como enviar e-mails com anexo pela API do SMTP Locaweb

Informação!

Para enviar anexos pela API do SMTP Locaweb, a mensagem é montada no formato MIME multipart/mixed e enviada dentro do campo body. O header Content-Type da requisição informa esse formato e o separador (boundary) entre as partes.

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)

Exemplo prático de envio com anexo "relatorio.pdf" demonstrando visualmente o corpo e o anexo do e-mail. (Envio.png)

Imagem da estrutura da requisição com anexo, header, 2 partes e fechamento mostrando o uso do boundary separando o corpo do e-mail e o anexo. (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 --.

 

 (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"
}



    		
Importante!

Regras do body:

  • O boundary informado no header deve ser o mesmo usado no body. Cada parte começa com –LW_BOUNDARY_123 e a mensagem termina com –LW_BOUNDARY_123–.
  • As linhas são separadas por \r\n, com uma linha em branco entre os cabeçalhos de cada parte e o conteúdo.
  • O arquivo vai em Base64, quebrado em linhas de 76 caracteres.
  • A parte do anexo leva o Content-Type do arquivo, Content-Transfer-Encoding: base64 e Content-Disposition: attachment; filename=”…”
  • O from deve ser um remetente cadastrado e confirmado no painel do SMTP Locaweb.

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"

 

 

Dica!

Preencha TOKEN, FROM, TO, ASSUNTO, TEXTO e ARQUIVO. O nome do anexo é o próprio nome do arquivo. O retorno esperado é HTTP/1.1 201 Created e um location com o ID da mensagem.

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

 

.pdf 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 

 

 

Conheça!

Para arquivos maiores que os limites da API (acima de 700 KB), use o envio via SMTP (servidor smtplw.com.br, porta 587) ou inclua um link para download no corpo do e-mail.

Este artigo foi útil ?

Artigos relacionados