email.generator: Geração de documentos MIME¶
Código-fonte: Lib/email/generator.py
Uma das tarefas mais comuns é gerar a versão plana (serializada) da mensagem de e-mail representada por uma estrutura de objeto de mensagem. Você precisará fazer isso se quiser enviar sua mensagem via smtplib.SMTP.sendmail() ou exibir a mensagem no console. A tarefa das classes geradoras é pegar uma estrutura de objeto de mensagem e produzir uma representação serializada.
Assim como no módulo email.parser, você não está limitado à funcionalidade do gerador integrado; você mesmo pode criar um do zero. No entanto, o gerador integrado sabe como gerar a maioria dos e-mails em conformidade com os padrões, deve lidar perfeitamente com mensagens de e-mail MIME e não MIME e foi projetado para que as operações de análise e geração orientadas a bytes sejam inversas, presumindo que a mesma policy não transformadora seja usada para ambas. Ou seja, analisar o fluxo de bytes serializado por meio da classe BytesParser e, em seguida, regenerar o fluxo de bytes serializado usando BytesGenerator deve produzir uma saída idêntica à entrada [1]. (Por outro lado, usar o gerador em um EmailMessage construído pelo programa pode resultar em alterações no objeto EmailMessage à medida que os padrões são preenchidos.)
A classe Generator pode ser usada para simplificar uma mensagem em uma representação serializada de texto (em oposição a binária), mas como o Unicode não pode representar dados binários diretamente, a mensagem é necessariamente transformada em algo que contém apenas caracteres ASCII, usando as técnicas de codificação de transferência de conteúdo RFC de e-mail padrão para codificar mensagens de e-mail para transporte em canais que não são “limpos de 8 bits”.
Para acomodar o processamento reproduzível de mensagens assinadas por SMIME, Generator desabilita a dobragem de cabeçalho para partes de mensagens do tipo multipart/signed e todas as subpartes.
- class email.generator.BytesGenerator(outfp, mangle_from_=None, maxheaderlen=None, *, policy=None)¶
Retorna um objeto
BytesGeneratorque gravará qualquer mensagem fornecida ao métodoflatten(), ou qualquer texto codificado surrogateescape fornecido ao métodowrite(), no objeto arquivo ou similar outfp. outfp deve oferecer suporte a um métodowriteque aceite dados binários.Se o mangle_from_ opcional for
True, coloca um caractere>na frente de qualquer linha no corpo que comece com a string exata"From ", ou seja,Fromseguido por um espaço no início de uma linha. mangle_from_ assume por padrão o valor da configuraçãomangle_from_da policy (que éTruepara a políticacompat32eFalsepara todas as outras). mangle_from_ deve ser usado quando as mensagens são armazenadas no formato mbox do Unix (consultemailboxe WHY THE CONTENT-LENGTH FORMAT IS BAD).If maxheaderlen is not
None, refold any header lines that are longer than maxheaderlen, or if0, do not rewrap any headers. If maxheaderlen isNone(the default), wrap headers and other message lines according to the policy settings.Se policy for especificado, usa essa política para controlar a geração de mensagens. Se policy for
None(o padrão), usa a política associada ao objetoMessageouEmailMessagepassado paraflattenpara controlar a geração de mensagens. Consulteemail.policypara obter detalhes sobre o que policy controla.Adicionado na versão 3.2.
Alterado na versão 3.3: Adicionada o argumento nomeado policy.
Alterado na versão 3.6: O comportamento padrão dos parâmetros mangle_from_ e maxheaderlen é seguir a política.
- flatten(msg, unixfrom=False, linesep=None)¶
Exibe a representação textual da estrutura do objeto de mensagem com raiz em msg no arquivo de saída especificado quando a instância
BytesGeneratorfoi criada.Se a opção
policycte_typefor8bit(o padrão), copia todos os cabeçalhos da mensagem original analisada que não tenham sido modificados para a saída, com todos os bytes com o bit mais alto definido reproduzidos como no original, e preserva a Content-Transfer-Encoding não ASCII de quaisquer partes do corpo que os contenham. Secte_typefor7bit, converte os bytes com o bit mais alto definido, conforme necessário, usando uma Content-Transfer-Encoding compatível com ASCII. Ou seja, transforma partes com Content-Transfer-Encoding não ASCII (Content-Transfer-Encoding: 8bit) em um Content-Transfer-Encoding compatível com ASCII e codifica bytes não ASCII inválidos para RFC em cabeçalhos usando o conjunto de caracteres MIMEunknown-8bit, tornando-os compatíveis com RFC.Se unixfrom for
True, exibe o delimitador de cabeçalho de envelope usado pelo formato de caixa de correio Unix (consultemailbox) antes do primeiro dos cabeçalhos RFC 5322 do objeto de mensagem raiz. Se o objeto raiz não tiver cabeçalho de envelope, crie um padrão. O padrão éFalse. Observe que, para subpartes, nenhum cabeçalho de envelope é exibido.Se linesep não for
None, usa-o como caractere separador entre todas as linhas da mensagem simplificada. Se linesep forNone(o padrão), usa o valor especificado na policy.
- clone(fp)¶
Retorna um clone independente desta instância
BytesGeneratorcom exatamente as mesmas configurações de opção e fp como o novo outfp.
- write(s)¶
Codifica s usando o codec
ASCIIe o tratador de errossurrogateescapee passa-o para o método write do outfp passado ao construtorBytesGenerator.
Para facilitar, EmailMessage fornece os métodos as_bytes() e bytes(aMessage) (também conhecidos como __bytes__()), que simplificam a geração de uma representação binária serializada de um objeto de mensagem. Para mais detalhes, consulte email.message.
Because strings cannot represent binary data, the Generator class must
convert any binary data in any message it flattens to an ASCII compatible
format, by converting them to an ASCII compatible
Content-Transfer-Encoding. Using the terminology of the email
RFCs, you can think of this as Generator serializing to an I/O stream
that is not “8 bit clean”. In other words, most applications will want
to be using BytesGenerator, and not Generator.
- class email.generator.Generator(outfp, mangle_from_=None, maxheaderlen=None, *, policy=None)¶
Retorna um objeto
Generatorque gravará qualquer mensagem fornecida ao métodoflatten(), ou qualquer texto fornecido ao métodowrite(), no objeto arquivo ou similar outfp. outfp deve oferecer suporte a um métodowriteque aceite dados string.Se o mangle_from_ opcional for
True, coloca um caractere>na frente de qualquer linha no corpo que comece com a string exata"From ", ou seja,Fromseguido por um espaço no início de uma linha. mangle_from_ assume por padrão o valor da configuraçãomangle_from_da policy (que éTruepara a políticacompat32eFalsepara todas as outras). mangle_from_ deve ser usado quando as mensagens são armazenadas no formato mbox do Unix (consultemailboxe WHY THE CONTENT-LENGTH FORMAT IS BAD).If maxheaderlen is not
None, refold any header lines that are longer than maxheaderlen, or if0, do not rewrap any headers. If maxheaderlen isNone(the default), wrap headers and other message lines according to the policy settings.Se policy for especificado, usa essa política para controlar a geração de mensagens. Se policy for
None(o padrão), usa a política associada ao objetoMessageouEmailMessagepassado paraflattenpara controlar a geração de mensagens. Consulteemail.policypara obter detalhes sobre o que policy controla.Alterado na versão 3.3: Adicionada o argumento nomeado policy.
Alterado na versão 3.6: O comportamento padrão dos parâmetros mangle_from_ e maxheaderlen é seguir a política.
- flatten(msg, unixfrom=False, linesep=None)¶
Exibe a representação textual da estrutura do objeto de mensagem com raiz em msg no arquivo de saída especificado quando a instância
Generatorfoi criada.Se a opção
policycte_typefor8bit, gera a mensagem como se a opção estivesse definida como7bit. (Isso é necessário porque strings não podem representar bytes não ASCII.) Converte quaisquer bytes com o bit mais alto definido, conforme necessário, usando uma Content-Transfer-Encoding compatível com ASCII. Ou seja, transforma partes com Content-Transfer-Encoding não ASCII (Content-Transfer-Encoding: 8bit) em um Content-Transfer-Encoding compatível com ASCII e codifica bytes não ASCII inválidos para RFC em cabeçalhos usando o conjunto de caracteres MIMEunknown-8bit, tornando-os compatíveis com RFC.Se unixfrom for
True, exibe o delimitador de cabeçalho de envelope usado pelo formato de caixa de correio Unix (consultemailbox) antes do primeiro dos cabeçalhos RFC 5322 do objeto de mensagem raiz. Se o objeto raiz não tiver cabeçalho de envelope, crie um padrão. O padrão éFalse. Observe que, para subpartes, nenhum cabeçalho de envelope é exibido.Se linesep não for
None, usa-o como caractere separador entre todas as linhas da mensagem simplificada. Se linesep forNone(o padrão), usa o valor especificado na policy.Alterado na versão 3.2: Adicionado suporte para recodificação de corpos de mensagens
8bite o argumento linesep.
Para facilitar, EmailMessage fornece os métodos as_string() e str(aMessage) (também conhecidos como __str__()), que simplificam a geração de uma representação de string formatada de um objeto de mensagem. Para mais detalhes, consulte email.message.
O módulo email.generator também fornece uma classe derivada, DecodedGenerator, que é como a classe base Generator, exceto que as partes não-text não são serializadas, mas são representadas no fluxo de saída por uma string derivada de um modelo preenchido com informações sobre a parte.
- class email.generator.DecodedGenerator(outfp, mangle_from_=None, maxheaderlen=None, fmt=None, *, policy=None)¶
Age como
Generator, exceto que para qualquer subparte da mensagem passada paraGenerator.flatten(), se a subparte for do tipo principal text, exibe a carga decodificada da subparte e, se o tipo principal não for text, em vez de exibi-la, preenche a string fmt usando informações da parte e exibe a string preenchida resultante.Para preencher fmt, executa
fmt % part_info, ondepart_infoé um dicionário composto pelas seguintes chaves e valores:type– Tipo MIME completo da parte não-textmaintype– Tipo MIME principal da parte não-textsubtype– Tipo sub-MIME da parte não-textfilename– Nome de arquivo da parte não-textdescription– Descrição associada à parte não-textencoding– Codificação de transferência de conteúdo da parte não-text
Se fmt for
None, usa o seguinte fmt padrão:“[Non-text (%(type)s) part of message omitted, filename %(filename)s]”
Optional mangle_from_ and maxheaderlen are as with the
Generatorbase class.
Notas de rodapé