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.
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:
- A aplicação escolheu o arquivo correto? Confirme a origem e a regra de negócio que selecionou o arquivo.
- O arquivo foi gerado? Registre o resultado da geração e guarde a cópia de teste, se isso for apropriado no ambiente.
- A mensagem foi montada? Verifique se a aplicação incluiu a parte esperada e os metadados do arquivo.
- O envio foi submetido? Anote a resposta obtida na interface usada pelo produto.
- A caixa de teste recebeu a mensagem? Confirme a chegada fora dos registros da aplicação.
- 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:
- Confirme o arquivo de origem. Verifique se o cenário acionou a regra de negócio correta e selecionou o arquivo previsto.
- Confira a geração. Compare nome, tipo e conteúdo do arquivo produzido com o critério anotado antes do teste.
- Inspecione a mensagem original. Procure a parte do anexo e confira sua estrutura, o tipo de mídia, o nome e a codificação.
- 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.
- 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.
- 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.