Python email lib - Как удалить вложение из существующего сообщения? - PullRequest
4 голосов
/ 26 октября 2009

У меня есть электронное письмо, которое я читаю с почтовой библиотекой Python, для которого мне нужно изменить вложения. Класс сообщения электронной почты имеет метод attach, но не имеет ничего общего с detach. Как я могу удалить вложение из составного сообщения? Если возможно, я хочу сделать это без воссоздания сообщения с нуля.

По сути, я хочу:

  1. Загрузить письмо
  2. Удалить MIME вложения
  3. Добавить новое вложение

Ответы [ 3 ]

3 голосов
/ 26 октября 2009

Я понял, как это сделать:

  1. Установить полезную нагрузку в пустой список с помощью set_payload
  2. Создайте полезную нагрузку и прикрепите к сообщению.
3 голосов
/ 26 октября 2009

Ну, по моему опыту, в контексте, в котором вы работаете, все является Message объектом. Сообщение, его части, вложения, все. Итак, чтобы выполнить то, что вы хотите сделать, вам нужно

  1. синтаксический анализ сообщения с использованием API Parser (при этом вы получите корневой объект Message)
  2. Обходите структуру, определяя, что вам нужно, а что нет (используя метод экземпляра Message, - .walk ()), - помните, что все это Message.
  3. Прикрепите все, что вам нужно, к деталям, которые вы извлекли, и все готово.

Повторюсь, что вы работаете с деревом, по сути, с деревом, в котором Message объекты с .is_multipart () == True являются узлами, а Message объекты с .is_multipart () == False являются конечными узлами (их полезная нагрузка - строка, а не набор Message объектов).

2 голосов
/ 26 октября 2009

set_payload() может помочь.

set_payload(payload[, charset])

Установить полезную нагрузку всего объекта сообщения на полезную нагрузку. Клиент несет ответственность за обеспечение инвариантов полезной нагрузки.

Быстрый интерактивный пример:

>>> 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

>>> 
...