O envio aparece como concluído, mas o arquivo não está no e-mail recebido.

Para testar anexos de e-mail, nós verificamos separadamente o arquivo gerado, a estrutura MIME e o anexo em uma caixa de recebimento controlada. Uma resposta de sucesso da aplicação não prova, sozinha, que o destinatário recebeu e conseguiu abrir o arquivo.

Desenvolvedores: este roteiro ajuda a conferir o conteúdo do arquivo e sua codificação na mensagem enviada pela própria aplicação.
QA: use os passos para reproduzir falhas como anexo ausente, nome incorreto ou conteúdo danificado.
Desenvolvedores independentes: valide o recebimento real sem confundir o registro de envio com a leitura do arquivo.

Defina antes do envio qual resultado precisa ser comprovado

Começamos definindo o que a rodada de teste deve demonstrar. “O e-mail foi enviado” é um critério incompleto: pode se referir à geração da mensagem, à aceitação por uma interface de envio ou à chegada a uma caixa de entrada. Esses eventos não confirmam automaticamente uns aos outros.

Registre qual camada está sob teste:

  • Geração do arquivo: a aplicação produziu o arquivo esperado, com conteúdo legível e dados de teste.
  • Montagem da mensagem: o MIME contém uma parte de anexo compatível com o que a aplicação deveria enviar.
  • Submissão do envio: a aplicação recebeu uma resposta da interface ou do serviço de envio.
  • Recebimento: uma caixa controlada recebeu a mensagem e mostrou o anexo.
  • Leitura e integridade: o arquivo baixado pode ser aberto e corresponde ao arquivo produzido.

O resultado deve apontar a evidência de cada etapa. Um registro no sistema pode demonstrar que a aplicação chamou a rotina de envio. A resposta recebida por essa rotina pode demonstrar que a solicitação foi aceita naquele ponto. Nenhuma dessas evidências, isoladamente, mostra o que apareceu na caixa do destinatário.

Para uma verificação limitada à montagem, inspecione a mensagem original. Para uma aceitação ponta a ponta, inclua uma caixa de recebimento e compare o arquivo recebido com o esperado. Assim, o teste responde a uma pergunta específica em vez de atribuir um resultado amplo a uma evidência estreita.

Primeira etapa: prepare um arquivo de teste sem expor dados

Crie o arquivo para testar o comportamento da aplicação, não a partir de um documento de cliente. Uma fatura fictícia, um relatório sintético ou um arquivo simples com texto identificável costuma ser suficiente para conferir nome, tipo e conteúdo. Não inclua nomes, endereços, identificadores ou valores reais só para deixar o cenário parecido com produção.

Antes de disparar a mensagem, registre o esperado:

  • Nome do arquivo, incluindo extensão.
  • Tipo de conteúdo que a aplicação pretende enviar.
  • Conteúdo ou características que permitam reconhecer o arquivo.
  • Modo de envio previsto: anexo comum ou recurso incorporado ao corpo da mensagem.
  • Identificador da execução de teste e ambiente usado.

O último ponto evita uma fonte comum de confusão: duas execuções podem enviar anexos com nomes iguais, mas conteúdos diferentes. Se o teste salva uma cópia do arquivo produzido, compare essa cópia com a que for baixada da caixa de recebimento. Uma comparação por hash pode ajudar a detectar diferenças nos bytes, desde que o teste compare arquivos equivalentes e não transformações esperadas, como uma conversão feita pela aplicação.

Nem todo item associado a um e-mail é um anexo comum. Uma imagem incorporada no corpo, por exemplo, pode ser representada em uma parte diferente da mensagem. A interface pode exibir esses recursos junto ao texto ou em uma seção de anexos, conforme o cliente e a implementação. O critério deve refletir o modo que o produto realmente suporta, e não presumir uma apresentação idêntica em toda caixa de entrada.

A orientação da OWASP sobre segurança no tratamento de arquivos enviados pode servir de referência para limitar arquivos e dados usados em testes. Ela não define como um anexo de e-mail deve ser estruturado: essa é uma fronteira importante entre segurança de arquivos e formato de mensagem.

Use somente arquivos inofensivos e sem dados pessoais. Um teste de anexo verifica o comportamento do seu produto; não precisa introduzir um arquivo perigoso para demonstrar que existe uma validação.

Segunda etapa: acione o envio e separe as evidências

Dispare o envio a partir do ambiente de desenvolvimento ou de pré-produção do seu próprio produto. Associe a mensagem a um identificador da execução, como um ID de teste, um evento da aplicação ou um registro de tarefa. Não inclua informações sensíveis nesse identificador.

Acompanhe a cadeia sem misturar resultados:

  1. A aplicação escolheu o arquivo correto? Confirme a origem e a regra de negócio que selecionou o arquivo.
  2. O arquivo foi gerado? Registre o resultado da geração e guarde a cópia de teste, se isso for apropriado no ambiente.
  3. A mensagem foi montada? Verifique se a aplicação incluiu a parte esperada e os metadados do arquivo.
  4. O envio foi submetido? Anote a resposta obtida na interface usada pelo produto.
  5. A caixa de teste recebeu a mensagem? Confirme a chegada fora dos registros da aplicação.
  6. O anexo recebido corresponde ao esperado? Abra ou examine o arquivo baixado e compare o conteúdo.

Essa separação ajuda a localizar a falha sem tirar conclusões precipitadas. Se a aplicação selecionou o arquivo errado, inspecionar a caixa não corrige o problema de negócio. Se a mensagem contém o arquivo correto, mas não aparece no destino, a falha está em outra etapa do fluxo. Registre o que foi observado em cada camada, inclusive quando o teste terminar antes do recebimento.

Terceira etapa: confira a mensagem MIME

Uma mensagem com anexo costuma usar uma estrutura MIME de múltiplas partes. O RFC 2046, na seção sobre multipart/mixed, descreve como partes independentes podem ser agrupadas em um corpo multipart. Na prática, inspecione a mensagem original ou a estrutura disponibilizada pelo ambiente de teste; a aparência da interface não substitui essa inspeção quando a falha pode estar na montagem.

Confira os pontos relevantes para o produto:

  • Tipo multipart e limites: confirme que a mensagem está organizada conforme o formato esperado e que as partes são separadas corretamente.
  • Parte do anexo: verifique se existe uma parte correspondente ao arquivo que a aplicação deveria anexar.
  • Tipo de mídia: compare o valor informado com o tipo esperado para aquele arquivo.
  • Nome: confira o nome transmitido na mensagem e o nome apresentado após o recebimento.
  • Codificação de transferência: confirme que a codificação declarada combina com o conteúdo da parte.
  • Conteúdo: compare os bytes decodificados com o arquivo produzido, quando a ferramenta de inspeção permitir.

O RFC 2045 define cinco valores para Content-Transfer-Encoding: 7bit, 8bit, binary, quoted-printable e base64. Não trate a lista como uma recomendação para escolher qualquer valor: o teste deve conferir a codificação que a aplicação realmente usa e se ela corresponde ao conteúdo transmitido. O mesmo RFC explica que a codificação Base64 representa grupos de três bytes de entrada em quatro caracteres de saída, o que ajuda a entender por que a parte codificada pode parecer maior que o arquivo original.

O campo de disposição do conteúdo também merece inspeção. O RFC 2183 descreve o parâmetro filename associado à disposição de conteúdo. Confira esse valor na mensagem e, separadamente, o nome exibido ao baixar o arquivo. Um resultado visual diferente pode apontar para comportamento de apresentação do cliente, não necessariamente para o arquivo gerado.

Já o RFC 2047 trata de palavras codificadas em campos de cabeçalho. Não o use como explicação universal para a codificação de parâmetros de anexo. Ao diagnosticar nomes incomuns, registre o cabeçalho bruto e a apresentação observada; depois, consulte a documentação oficial da biblioteca ou do serviço usado pela aplicação antes de atribuir a causa.

Verificação Evidência esperada O que uma falha pode indicar
Estrutura multipart Partes separadas conforme a mensagem montada Erro de composição ou de serialização
Tipo de mídia Valor compatível com o arquivo esperado Tipo incorreto ou ausência de classificação
Nome do arquivo Nome transmitido e nome recebido registrados Parâmetro ausente, alterado ou interpretado de outro modo
Codificação Codificação declarada consistente com a parte Conteúdo mal codificado ou decodificação incorreta
Conteúdo Arquivo recebido comparável ao arquivo produzido Truncamento, alteração ou seleção de outro arquivo

A tabela é um guia de inspeção, não uma garantia de que todos os clientes apresentem cada campo da mesma maneira. A estrutura no formato original e o resultado na caixa são evidências diferentes.

Quarta etapa: valide o anexo em uma caixa controlada

Use um destino de teste separado de caixas de trabalho ou de clientes. A caixa precisa permitir verificar a chegada e examinar ou baixar o anexo para o caso que está sendo testado. Antes de usar qualquer endereço de recebimento, confirme que o serviço aceita anexos; não presuma esse recurso a partir da capacidade de receber mensagens.

Na caixa controlada, confirme a chegada da mensagem associada à execução e examine estes resultados:

  • O anexo aparece onde o produto espera que ele apareça?
  • O nome e a extensão são os previstos?
  • O arquivo pode ser aberto no formato esperado?
  • O conteúdo corresponde ao arquivo de teste produzido?
  • Se o produto envia mais de uma parte, todas as partes relevantes estão presentes?

Para confirmar que o conteúdo não foi danificado, compare o arquivo recebido com a cópia de referência. Uma comparação direta dos bytes ou de hashes é útil quando se espera que o arquivo permaneça inalterado. Se o produto transforma o arquivo intencionalmente, compare propriedades e conteúdo que devam permanecer estáveis, em vez de exigir igualdade byte a byte.

Não conclua que uma caixa inteira é incompatível com anexos porque uma única mensagem não apareceu. Primeiro separe “mensagem não recebida” de “mensagem recebida sem anexo”. Em seguida, examine a estrutura MIME, o registro da aplicação e o comportamento do destino. Se o serviço de teste não oferece acesso ao anexo, ele não pode servir como evidência de leitura do arquivo; use outro ambiente controlado que permita completar essa verificação.

Nível de teste O que comprova O que não comprova sozinho
Teste automatizado da geração O arquivo esperado foi produzido pela aplicação Que a mensagem foi enviada ou recebida
Inspeção do MIME A mensagem contém uma parte de anexo estruturada Que um destinatário a recebeu e conseguiu abrir
Resposta da interface de envio A solicitação foi aceita naquele ponto do fluxo Que a mensagem chegou à caixa de teste
Recebimento controlado A mensagem chegou ao destino observado Que outros destinos terão o mesmo resultado
Abertura e comparação do arquivo O arquivo recebido pode ser lido e corresponde ao critério definido Que todos os cenários de produção foram cobertos

O melhor desenho não exige que cada execução automatizada dependa de uma caixa externa. Testes de geração e montagem podem rodar com rapidez no fluxo automatizado; o recebimento real entra quando o objetivo de aceitação exige provar a entrega e a leitura. Essa divisão também deixa claro o que cada resultado significa.

A inspeção MIME não substitui o teste de recebimento

Não, a inspeção MIME não basta quando o critério é comprovar que o destinatário recebeu e consegue ler o arquivo. Ela demonstra propriedades da mensagem observada. Não demonstra, por si só, o resultado na caixa de destino.

Nós usamos esta decisão para escolher o nível adequado:

  • Se o objetivo é testar a lógica que gera o arquivo, valide o conteúdo gerado e guarde uma referência. Não declare o envio aprovado com base apenas nesse resultado.
  • Se o objetivo é testar a montagem da mensagem, inspecione a estrutura MIME e confirme a presença da parte, do nome, do tipo e da codificação esperados.
  • Se o objetivo é validar o comportamento ponta a ponta, envie para um destino controlado, confirme a chegada e examine o arquivo recebido.
  • Se o destino não permite ver ou baixar anexos, use-o somente para o que ele comprova e escolha outro ambiente para validar a integridade.
  • Se o produto envia conteúdo incorporado ou formatos especiais, verifique esse fluxo específico; não aplique ao caso um critério pensado para um anexo comum.
  • Se o caso envolve dados reais ou exige acesso contínuo, não use uma caixa temporária como substituta de uma caixa controlada e autorizada para esse tipo de dado.

O resultado mais útil é o que deixa explícito o limite da evidência. “A mensagem foi aceita para envio” e “o arquivo chegou e foi aberto” são declarações diferentes e devem continuar diferentes no relatório de QA.

Falha de recebimento: siga uma sequência de diagnóstico

Investigue nesta ordem e registre a primeira divergência encontrada:

  1. Confirme o arquivo de origem. Verifique se o cenário acionou a regra de negócio correta e selecionou o arquivo previsto.
  2. Confira a geração. Compare nome, tipo e conteúdo do arquivo produzido com o critério anotado antes do teste.
  3. Inspecione a mensagem original. Procure a parte do anexo e confira sua estrutura, o tipo de mídia, o nome e a codificação.
  4. Separe ausência de erro de apresentação. Determine se a mensagem chegou sem a parte ou se o destino a exibe de forma diferente.
  5. Baixe e compare, se houver essa opção. Um arquivo que aparece na mensagem, mas não pode ser aberto, é um problema diferente de um anexo ausente.
  6. Repita após a correção. Use o mesmo arquivo inofensivo e o mesmo critério. Registre o que mudou e se a falha foi reproduzida.

Essa sequência evita tratar um status positivo da aplicação como prova de recebimento. Também ajuda a criar um caso de regressão: guarde o cenário, a estrutura relevante e o resultado esperado, mas evite armazenar dados sensíveis no registro de teste.

Se a falha for que o próprio código de verificação ou a mensagem não chega, primeiro diferencie esse problema do anexo ausente. O guia sobre correções para códigos de e-mail que não chegam trata da chegada da mensagem; ele não substitui a conferência do arquivo depois que a mensagem é recebida.

Registre a conclusão e os limites da validação

Anote ambiente, execução, arquivo de referência, evidência MIME, resultado do envio e resultado observado na caixa. A conclusão deve nomear o estágio alcançado. Por exemplo: “arquivo gerado e parte MIME conferida; recebimento não verificado” é mais preciso que “anexo aprovado” quando o teste não incluiu uma caixa de destino.

Para dados usados nos cenários, vale revisar a política de privacidade e aplicar o mesmo cuidado ao seu ambiente: use dados sintéticos, limite o acesso às mensagens de teste e remova cópias de trabalho quando deixarem de ser necessárias. O arquivo de teste também deve respeitar as regras internas de retenção e acesso do projeto.

Uma aceitação reproduzível registra pelo menos: o arquivo esperado, o modo de envio, o ambiente, a evidência que foi coletada e o limite do resultado. Assim, outra pessoa da equipe consegue repetir a verificação sem inferir detalhes a partir de um log isolado.

Próximo passo: valide o fluxo com um destino controlado

Se o seu objetivo inclui comprovar o recebimento, escolha um destino controlado que permita inspecionar o anexo. Um endereço de teste temporário pode ajudar a separar esses envios da caixa principal, desde que o serviço escolhido informe ou demonstre que aceita anexos e permite examiná-los. Não trate essa capacidade, a leitura do arquivo ou a entrega como garantidas sem conferir o destino em uso.

O FwdBay pode ser considerado como uma opção de endereço de recebimento para separar testes da caixa principal. Antes de usá-lo na etapa de aceitação, confirme na página e no próprio fluxo se é possível receber e acessar o tipo de anexo necessário. Se a página permitir criar uma caixa sem cadastro, isso pode simplificar um teste pontual; ainda assim, a evidência válida é o anexo realmente recebido e verificado. Para dados sensíveis, contas importantes ou mensagens que precisem ser consultadas por longo prazo, prefira um ambiente controlado adequado a essa necessidade.