Как пропустить обработку вложений в письме, которое является вложением другого письма? - PullRequest
3 голосов
/ 26 ноября 2008

с использованием Jython

У меня есть ситуация, когда письма приходят с разными вложениями. Некоторые типы файлов я обрабатываю, другие игнорирую и не записываю в файл. Я попал в довольно неприятную ситуацию, потому что иногда люди отправляют электронное письмо в виде вложения, и это прикрепленное электронное письмо имеет юридические вложения.

Что я хочу сделать, так это пропустить прикрепленное письмо и все вложения.

используя электронную почту Python / Jythons STD, как я могу это сделать?


чтобы было понятнее

Мне нужно разобрать письмо (с именем ROOT email), я хочу получить вложения из этого письма, используя jython. Далее поддерживаются определенные вложения, например .pdf .doc и т. Д. теперь так получилось, что клиенты отправляют электронное письмо (ROOT email) с другим электронным сообщением (CHILD email) в качестве вложения, а в электронном письме CHILD оно имеет вложения .pdf и тому подобное.

Что мне нужно, так это: избавиться от любых электронных писем РЕБЕНКА, прикрепленных к письму ROOT, и вложений электронной почты РЕБЕНКА. Происходит то, что я просматриваю всю электронную почту, и она просто анализирует все вложения, ОБА ВНУТРЕННИЕ вложения и ДЕТСКИЕ вложения, как если бы они были ВНЕШНИМИ вложениями.

Я не могу этого иметь. Меня интересуют только легальные вложения ROOT, т.е. .pdf .doc. xls .rtf .tif .tiff

Это должно сделать сейчас, я должен бежать, чтобы сесть на автобус! спасибо!

Ответы [ 4 ]

1 голос
/ 26 ноября 2008

Проблема с существующими предложениями - метод ходьбы. Это рекурсивно, в глубину, обходит все дерево, включая детей.

Посмотрите на источник метода прогулки и адаптируйте его, чтобы пропустить рекурсивную часть. Беглое чтение предлагает:

if msg.is_multipart():
    for part in msg.get_payload():
          """ Process message, but do not recurse """
          filename = part.get_filename()

При чтении pydocs get_payload должна возвращать список сообщений верхнего уровня без повторения.

0 голосов
/ 26 ноября 2008

Вы пробовали метод get_payload ([i [, decode]])? В отличие от ходьбы, не задокументировано рекурсивное открытие вложений.

0 голосов
/ 26 ноября 2008

Я понимаю, что ваши вопросы означают: «Я должен проверить все вложения электронной почты, но если вложение также является электронным письмом, я хочу его игнорировать». В любом случае этот ответ должен привести вас по правильному пути.

Я думаю, вы хотите mimetypes.guess_type(). Использование этого метода также намного лучше, чем просто проверка по списку мероприятий.

def check(self, msg):
    import mimetypes

    for part in msg.walk():
        if part.get_filename() is not None:
            filenames = [n for n in part.getaltnames() if n]
            for filename in filenames:
                type, enc = mimetypes.guess_type(filename)
                if type.startswith('message'):
                    print "This is an email and I want to ignore it."
                else:
                    print "I want to keep looking at this file."

Обратите внимание, что если это все еще просматривается в прикрепленных письмах, измените его на:

def check(self, msg):
    import mimetypes

    for part in msg.walk():
        filename = part.get_filename()
        if filename is not None:
            type, enc = mimetypes.guess_type(filename)
            if type.startswith('message'):
                print "This is an email and I want to ignore it."
            else:
                part_filenames = [n for n in part.getaltnames() if n]
                for part_filename in part_filenames:
                    print "I want to keep looking at this file."

MIME типы документации

0 голосов
/ 26 ноября 2008

Как насчет примера с именем " Вот пример того, как распаковать сообщение MIME, подобное приведенному выше, в каталог файлов "? Это выглядит близко от того, что вы хотите.

import email
...
msg = email.message_from_file(fp)
...
for part in msg.walk():
    # multipart/* are just containers
    if part.get_content_maintype() == 'multipart':
        continue
    # Applications should really sanitize the given filename so that an
    # email message can't be used to overwrite important files
    filename = part.get_filename()
    if not filename:
        ext = mimetypes.guess_extension(part.get_content_type())
    ...
...