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
BytesGenerator
que 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étodowrite
que 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,From
seguido 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 éTrue
para a políticacompat32
eFalse
para todas as outras). mangle_from_ deve ser usado quando as mensagens são armazenadas no formato mbox do Unix (consultemailbox
e WHY THE CONTENT-LENGTH FORMAT IS BAD).Se maxheaderlen não for
None
, redobra quaisquer linhas de cabeçalho maiores que maxheaderlen ou, se for0
, não redobra nenhum cabeçalho. Se manheaderlen forNone
(o padrão), redobra os cabeçalhos e outras linhas de mensagem de acordo com as configurações da policy.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 objetoMessage
ouEmailMessage
passado paraflatten
para controlar a geração de mensagens. Consulteemail.policy
para 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
BytesGenerator
foi criada.Se a opção
policy
cte_type
for8bit
(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_type
for7bit
, 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
BytesGenerator
com exatamente as mesmas configurações de opção e fp como o novo outfp.
- write(s)¶
Codifica s usando o codec
ASCII
e o tratador de errossurrogateescape
e 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
.
Como strings não podem representar dados binários, a classe Generator
deve converter quaisquer dados binários em qualquer mensagem que ela nivele para um formato compatível com ASCII, convertendo-os para um Content-Transfer_Encoding compatível com ASCII. Usando a terminologia dos RFCs de e-mail, você pode pensar nisso como Generator
serializando para um fluxo de E/S que não é “limpo em 8 bits”. Em outras palavras, a maioria das aplicações usará BytesGenerator
, e não Generator
.
- class email.generator.Generator(outfp, mangle_from_=None, maxheaderlen=None, *, policy=None)¶
Retorna um objeto
Generator
que 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étodowrite
que 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,From
seguido 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 éTrue
para a políticacompat32
eFalse
para todas as outras). mangle_from_ deve ser usado quando as mensagens são armazenadas no formato mbox do Unix (consultemailbox
e WHY THE CONTENT-LENGTH FORMAT IS BAD).Se maxheaderlen não for
None
, redobra quaisquer linhas de cabeçalho maiores que maxheaderlen ou, se for0
, não redobra nenhum cabeçalho. Se manheaderlen forNone
(o padrão), redobra os cabeçalhos e outras linhas de mensagem de acordo com as configurações da policy.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 objetoMessage
ouEmailMessage
passado paraflatten
para controlar a geração de mensagens. Consulteemail.policy
para 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
Generator
foi criada.Se a opção
policy
cte_type
for8bit
, 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
8bit
e 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]”
Os opcionais _mangle_from_ e maxheaderlen são como os da classe base
Generator
.
Notas de rodapé