O que conta como anexo
Uma mensagem é uma árvore de partes, e só algumas delas são arquivos. A regra aqui é deliberadamente generosa, porque a alternativa — confiar que o remetente vai rotular tudo corretamente — perde anexos em silêncio que um cliente de e-mail teria mostrado:
- Qualquer coisa marcada como tal
- Uma parte cujo
Content-Dispositiondizattachment. O caso comum, e o único em que todo cliente de e-mail concorda. - Qualquer coisa com um nome de arquivo
- Uma parte com um
filename, seja qual for sua outra rotulagem. Remetentes rotulam errado o tempo todo, e um arquivo com nome é um arquivo. - Partes nomeadas que não são texto
- Uma parte com um
namecujo tipo não étext/…. É isso que pega o logotipo em uma assinatura HTML — então uma mensagem pode chegar com anexos que você não esperava e que o remetente nunca pensou como anexos.
Por isso, a contagem que você vê costuma ser maior do que a que o remetente tinha em mente. Vinte é o máximo que uma mensagem mantém; uma mensagem com mais partes com nome de arquivo do que isso mantém as primeiras vinte e descarta o resto — vale saber disso antes de construir algo em cima.
Um nome de arquivo vindo da rede nunca é usado como caminho. O arquivo é gravado sob um nome gerado, e o nome original é carregado ao lado dele como dado — assim, um remetente não pode escolher onde seu arquivo vai parar só por batizá-lo com uma barra no nome.
O limite de tamanho, e onde ele realmente pesa
O número publicado é 5 MB, e vale ser exato sobre o que ele mede: a mensagem codificada inteira. Não o anexo, nem a soma dos anexos — tudo o que o servidor remetente entrega, depois que a codificação MIME já deixou tudo maior.
O base64 — o jeito que um binário atravessa um protocolo feito para texto — transforma cada três bytes em quatro. Some as quebras de linha que ele exige e um arquivo chega cerca de um terço maior do que era no disco, um pouco mais depois de contar essas quebras. Fazendo as contas de trás para frente a partir de 5 MB, isso coloca o limite real em um arquivo de aproximadamente 3,5 MB — e ainda menor para uma mensagem com assinatura e uma parte em HTML.
- O que é medido
- Cabeçalhos, a parte em texto, a parte em HTML e todos os anexos, tudo já codificado.
- Anexos por mensagem
- Vinte. Na prática, o limite de tamanho chega primeiro.
- Partes em texto
- Mantidas até 2 MiB cada, depois de decodificadas. Um corpo maior do que isso é armazenado truncado — o que nenhum e-mail comum chega perto de atingir, embora um relatório gerado automaticamente possa.
O que acontece quando um arquivo é grande demais
É recusado na porta, durante a conversa SMTP, antes de qualquer coisa ser armazenada. Um servidor remetente que anuncia o tamanho de antemão é barrado na hora, e a troca termina mais ou menos assim:
>>> MAIL FROM:<news@example.com> SIZE=7602176
<<< 552 5.3.4 Message size exceeds fixed limitIsso importa mais do que parece. Um serviço que aceitasse a mensagem e a descartasse depois deixaria o remetente achando que ela foi entregue, e você esperando por algo que nunca ia aparecer. Uma recusa no momento do SMTP é uma falha real relatada a uma pessoa real: o remetente recebe um bounce com o motivo escrito nele.
Um remetente que não anuncia o tamanho de antemão recebe a mesma resposta no fim da mensagem, depois que o servidor de e-mail conta os bytes por conta própria. De um jeito ou de outro, nada chega à caixa de entrada e nada chega truncado.
Como baixar um anexo da caixa de entrada
No navegador, é onde você esperaria. Abra a mensagem e os anexos aparecem listados abaixo dela, cada um com o nome que o remetente deu e o tamanho que de fato chegou.
- Abra a mensagem. A lista se atualiza sozinha, então um arquivo que chega enquanto você está olhando a caixa de entrada aparece sem precisar recarregar.
- Leia o nome e o tamanho antes de clicar. Os dois são fatos sobre o que chegou, e são a última coisa que você vê antes de o arquivo estar na sua máquina.
- Clique nele. O arquivo é baixado. Ele nunca abre no navegador, seja lá o que diga ser — a próxima seção explica por que isso é um recurso, não uma falha.
Imagens remotas no corpo da mensagem ficam bloqueadas até você liberá-las, e isso é diferente de um anexo: uma imagem bloqueada é buscada no próprio servidor do remetente no momento em que você permite, enquanto um anexo veio junto com a mensagem e não é buscado de ninguém.
Como baixar anexos pela API
Ler uma mensagem retorna seus anexos como uma lista, e cada um já chega com a URL pronta:
"attachments": [
{
"id": "01JR8W2K4QATT1",
"filename": "invoice.pdf",
"mime": "application/pdf",
"size": 184320,
"url": "/api/v1/attachment/01JR8W2K4QATT1?mailbox=k7fq2m%40grabmail.io"
}
]Essa URL é um GET simples com a caixa de entrada como parâmetro de consulta, e nos domínios públicos ela não precisa de mais nada — sem chave, sem sessão, sem conta:
curl -OJ "https://grabmail.io/api/v1/attachment/01JR8W2K4QATT1?mailbox=k7fq2m%40grabmail.io"-OJ diz ao curl para salvar o arquivo com o nome que o servidor envia, em vez do id. O endpoint responde uma de três coisas: o arquivo, um 404 se não existir esse anexo naquela caixa de entrada ou se ele já tiver expirado, ou um 429 se você estiver pedindo mais de uma vez por segundo.
O id de um anexo pertence à sua caixa de entrada, então um id de um endereço dá 404 em outro. Não existe endpoint que liste anexos sozinhos — eles chegam junto com a mensagem e são lidos a partir dela. A referência da API tem o formato completo de uma resposta de mensagem.
Por que todo anexo é baixado como binário
Seja lá o que o remetente disse que o arquivo era, ele volta como application/octet-stream e é baixado em vez de aberto. Isso não é descuido com os tipos de conteúdo — é a única resposta segura quando o arquivo veio de um desconhecido.
- O tipo informado pelo remetente nunca é repetido de volta
- Quem rotula o próprio arquivo como
text/htmle consegue fazer com que ele seja renderizado na nossa origem está rodando a página dele como se fôssemos nós, dentro da sua sessão, com tudo o que isso permite alcançar. Por isso o rótulo é descartado, e quem chama decide o que o arquivo é a partir dos metadados ao lado dele. - Sempre um download, nunca uma visualização
Content-Disposition: attachmentem toda resposta, então nada é renderizado no lugar, não importa como esteja rotulado.- Sem inferência de tipo, e nada pode rodar
X-Content-Type-Options: nosniffimpede que o navegador tente adivinhar um tipo por conta própria, e umaContent-Security-Policydedefault-src 'none'; sandboxsignifica que, mesmo que algo chegasse a renderizar, não conseguiria carregar nem rodar nada.- O nome do arquivo não pode virar um cabeçalho
- O nome é codificado em vez de ser colado direto na resposta, então um arquivo com uma quebra de linha no nome não consegue inserir um cabeçalho por conta própria.
O arquivo em si permanece intocado — byte a byte o que o remetente enviou. É a moldura em volta dele que é propositalmente sem graça. Ele também fica armazenado fora da raiz web, então adivinhar um caminho não é uma forma de entrar: a caixa de entrada precisa ser resolvida e autorizada antes de o arquivo ser lido.
Por que nada aqui faz varredura no arquivo
Não há antivírus, não há detonação em sandbox e não há checagem de reputação. Isso é um limite declarado, não um descuido, e muda o que você pode fazer com segurança com o que chega:
- Qualquer um pode enviar para um endereço público. Não precisam te conhecer — precisam conhecer o endereço, e os curtos são adivinhados. Um arquivo em uma caixa de entrada pública tem autor desconhecido por padrão.
- Executáveis e scripts são exatamente tão perigosos aqui quanto em qualquer lugar. Nada é filtrado por extensão, e nada olha dentro de um arquivo compactado para ver o que tem lá.
- Documentos que conseguem executar coisas são o caso mais comum. Arquivos de escritório com macro habilitada e PDFs com ações embutidas são como a maior parte disso realmente acontece — não executáveis óbvios.
- O nome não diz nada. Um arquivo chamado
invoice.pdfé o que seus bytes disserem que é, e a extensão foi escolhida por quem o enviou.
Os anexos somem quando a mensagem some
Um anexo não tem vida própria. Ele pertence à sua mensagem, e some quando a mensagem some:
- Depois de 5 dias
- Excluído junto com a mensagem, lida ou não, num relógio que começou a contar quando ela chegou. Não há arquivo morto nem exportação.
- Quando você apaga a mensagem
- Imediatamente, e a URL passa a responder
404. É a mesma chamada, quer você apague pela caixa de entrada ou pela API. - Não há como voltar atrás
- Sem desfazer exclusão, sem prazo de tolerância e sem caixa de suporte para pedir. Qualquer coisa que você vai querer amanhã precisa ser baixada hoje.
Quando e-mail não é a ferramenta certa
Parte do que as pessoas tentam fazer com anexos aqui não é um limite para contornar — é a ferramenta errada para o trabalho:
- Um arquivo acima do limite. Nada o aumenta. Envie um link em vez disso.
- Algo que você vai precisar mês que vem. 5 dias é um limite rígido aplicado por um job, não uma configuração. Baixe agora, ou use uma caixa de entrada de verdade.
- Qualquer coisa que você não gostaria que um estranho lesse. Em um domínio público, o endereço é a única fechadura da porta, e é uma fechadura curta.
Um domínio próprio muda o terceiro item dessa lista, mas não os dois primeiros: o limite e a retenção continuam exatamente os mesmos, mas o endereço fica em um nome que não aparece em lugar nenhum deste site, então ninguém envia arquivos para ele por adivinhação. Um único registro MX resolve isso:
Registro MX para o seu domínio10 smtp.grabmail.io
O passo a passo completo está aqui — o registro, o que publicá-lo prova, e os limites honestos de uma caixa de entrada sem senha.
Perguntas
Qual é o tamanho máximo de um anexo?
5 MB para a mensagem codificada inteira, que é o número que o servidor de e-mail realmente aplica. Como o base64 aumenta um binário em cerca de um terço, isso dá um arquivo de aproximadamente 3,5 MB — menos ainda quando a mensagem tem corpo de texto e assinatura.
Quais tipos de arquivo posso receber?
Todos eles. Nada é filtrado ou recusado por tipo, extensão ou conteúdo, e nada é descompactado para olhar o que tem dentro. A única coisa que faz uma mensagem ser recusada é o tamanho.
Vocês fazem varredura de vírus nos anexos?
Não. Não há antivírus nem varredura de nenhum tipo. O arquivo que você baixa é byte a byte o que o remetente enviou, e decidir se abre ou não é responsabilidade sua.
Por que todo anexo é baixado como application/octet-stream?
Porque repetir de volta o tipo de conteúdo informado por um desconhecido é exatamente como um arquivo vira uma página rodando na nossa origem, dentro da sua sessão. O tipo real está nos metadados da mensagem, ao lado do arquivo; o download em si é propositalmente anônimo e nunca renderiza no navegador.
Quantos anexos uma mensagem pode conter?
Vinte. Uma mensagem com mais partes do que isso mantém as vinte primeiras. Na prática, o limite de tamanho chega bem antes do limite de quantidade.
Dá para baixar um anexo pela API?
Sim. Todo anexo em uma resposta de mensagem traz uma URL pronta, e buscá-la é um GET simples com a caixa de entrada como parâmetro. Nenhuma chave é necessária nos domínios públicos.
Por quanto tempo os anexos ficam disponíveis?
O mesmo tempo que a mensagem: 5 dias a partir da chegada, e depois é excluído junto com ela. Apagar a mensagem você mesmo remove o arquivo na hora.
Meu anexo nunca chegou — por quê?
Ou a mensagem passava de 5 MB e foi recusada na porta — nesse caso o remetente recebeu um bounce explicando o motivo — ou a parte não tinha nome de arquivo nem disposição de anexo e foi lida como parte do corpo. O guia sobre e-mails que não chegam cobre todo o resto.
Dá para enviar um arquivo a partir de um endereço descartável?
Não. Este serviço só recebe e não tem nenhum endpoint de envio, o que é justamente o que impede uma caixa de entrada sem autenticação de virar um jeito conveniente de empurrar arquivos para estranhos.

