Python email lib - ¿Cómo eliminar el archivo adjunto del mensaje existente?
Pregunta
Tengo un correo electrónico que estoy leyendo con la biblioteca de correo electrónico de Python y necesito modificar los archivos adjuntos. La clase de mensaje de correo electrónico tiene el " adjuntar " método, pero no tiene nada como '' separar ''. ¿Cómo puedo eliminar un archivo adjunto de un mensaje multiparte? Si es posible, quiero hacer esto sin volver a crear el mensaje desde cero.
Esencialmente quiero:
- Cargue el correo electrónico
- Eliminar los archivos adjuntos mime
- Añadir un nuevo archivo adjunto
Solución
set_payload ()
puede ayudar.
set_payload (carga útil [, juego de caracteres])
Establezca la carga útil del objeto de mensaje completo en carga útil. Es responsabilidad del cliente asegurarse de que los invariantes de la carga útil.
Un ejemplo interactivo rápido:
>>> from email import mime,message
>>> m1 = message.Message()
>>> t1=email.MIMEText.MIMEText('t1\r\n')
>>> print t1.as_string()
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
t1
>>> m1.attach(t1)
>>> m1.is_multipart()
True
>>> m1.get_payload()
[<email.mime.text.MIMEText instance at 0x00F585A8>]
>>> t2=email.MIMEText.MIMEText('t2\r\n')
>>> m1.set_payload([t2])
>>> print m1.get_payload()[0].as_string()
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
t2
>>>
Otros consejos
Bueno, desde mi experiencia, en el contexto en el que está trabajando, todo es un objeto Message
. El mensaje, sus partes, archivos adjuntos, todo. Entonces, para lograr lo que quieres hacer, necesitas
- analiza el mensaje usando la Parser API (esto te dará el raíz
Message
object) - Recorre la estructura, determinando lo que necesitas y lo que no (usando un método de una instancia de Mensaje, - .walk ()), - recuerda, que todo es un
Mensaje
. - Adjunte todo lo que necesite adjuntar a las partes que ha extraído y estará listo para comenzar.
Para reiterar, lo que está trabajando es, esencialmente, un árbol, donde los objetos Message
con .is_multipart () == True son nodos y objetos Message
. is_multipart () == Falso son nodos finales (su carga útil es una cadena, no un grupo de objetos Message
).
La forma en que lo descubrí es:
- Establezca la carga útil en una lista vacía con set_payload
- Cree la carga útil y adjúntela al mensaje.