Средство извлечения заголовков электронной почты Python

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

from email.parser import BytesHeaderParser
from glob import glob
import csv

fields = ['Date', 'From', 'To', 'Subject']

out = csv.writer(open('output.csv', 'w'))
out.writerow(["File name"]+fields)

parser = BytesHeaderParser()

for name in glob('*.msg'):
with open(name, 'rb') as fd:
msg = parser.parse(fd)
out.writerow([name]+[msg[f] for f in fields])

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

Возможно ли это также сделать код в powershell.

Спасибо.


person Will    schedule 02.12.2018    source источник
comment
Возможный дубликат Использование Python для выполнения команда для каждого файла в папке   -  person M--    schedule 03.12.2018


Ответы (1)


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

это должно быть просто:

from email.parser import HeaderParser
from glob import glob
import csv

fields = ['Date', 'From', 'To', 'Subject']

out = csv.writer(open('output.csv', 'w'))
out.writerow(["File name"]+fields)

parser = HeaderParser()

for name in glob('*.msg'):
  with open(name) as fd:
    msg = parser.parse(fd)
  out.writerow([name]+[msg[f] for f in fields])
person Sam Mason    schedule 02.12.2018
comment
дает мне это? Трассировка (последний последний вызов): файл new.py, строка 12, в ‹module› [msg[f] for f in fields]) TypeError: аргумент writelines() должен быть последовательностью строк - person Will; 02.12.2018
comment
предположительно, некоторые из этих полей заголовка не существуют. может быть, использовать формат файла, который упрощает обработку? CSV был бы идеальным для этого! - person Sam Mason; 02.12.2018
comment
Извини, чувак, я новичок в этом, что ты имеешь в виду? - person Will; 02.12.2018
comment
так ты говоришь писать в CSV? - person Will; 02.12.2018
comment
@Будет обновляться для записи в файл csv… Я бы посоветовал прочитать несколько руководств по Python/программированию, чтобы начать - person Sam Mason; 02.12.2018
comment
Поэтому я добавил скрипт и 3 файла .msg в папку и запустил скрипт из папки. Я получаю сообщение об ошибке. Я отредактировал скрипт, чтобы искать только аспект From:. return codecs.charmap_decode(input,self.errors,decoding_table)[0] UnicodeDecodeError: кодек 'charmap' не может декодировать байт 0x8f в позиции 2129: сопоставление символов с ‹undefined› - person Will; 03.12.2018
comment
вы можете посмотреть, как открыть файл в двоичном режиме и использовать BytesHeaderParser. кодировку символов может быть трудно правильно подобрать, и она зависит от некоторых особенностей системы. возможно, стоит прочитать несколько руководств по этому поводу, также Python сильно изменил поведение между версиями 2 и 3, поэтому вам нужно убедиться, что вы читаете правильный. Python 3 намного лучше, если у вас есть выбор! - person Sam Mason; 03.12.2018
comment
я добавил кодировщик, поскольку чтение в Интернете может решить проблему с open(name, encoding='utf8') as fd: но ошибка, похоже, связана с msg = parser.parse(fd) при отслеживании его обратно - person Will; 03.12.2018
comment
в зависимости от того, откуда они пришли, может быть лучше просто обрабатывать электронную почту как байты (т.е. open(name, 'rb')), а затем использовать парсер электронной почты, который делает правильные вещи. то есть кодируется как =?UTF-8?B?4oCm?= в строке темы, которая отличается от кодировки базового файла. что вы хотите, зависит от того, что вы сделаете с ним позже - person Sam Mason; 03.12.2018
comment
Итак, я обновляю код (см. Обновление). Теперь я не получаю никаких ошибок, но ничего не попадает в файл? можно ли как-нибудь посмотреть, читаются ли файлы? - person Will; 03.12.2018
comment
попробуйте поискать в Google отладку Python. проще всего добавить несколько операторов print, в противном случае ищите интерактивный отладчик. переполнение стека действительно не лучший вариант для такого рода расширенных дискуссий, это действительно касается четко определенных вопросов и ответов… - person Sam Mason; 04.12.2018