Это не рефакторинг (насколько я вижу, он не требует рефакторинга), но некоторые предложения:
Вы должны использовать пакет электронной почты, а не rfc822. Замените rfc822.Message на email.Message и используйте email.Utils.parseaddr (msg ["From"]), чтобы получить имя и адрес электронной почты, и msg ["Subject"], чтобы получить тему.
Используйте os.path.join для создания пути. Это:
emailpath = str(self._emailpath + self._inboxfolder + "\\" + email + "_" + msg.getheader("Subject") + ".eml")
становится:
emailpath = os.path.join(self._emailpath + self._inboxfolder, email + "_" + msg.getheader("Subject") + ".eml")
(Если self._inboxfolder начинается с косой черты или self._emailpath заканчивается на 1, вы можете заменить первый + на запятую).
Это на самом деле ничего не ранит, но вам, вероятно, не следует использовать «файл» в качестве имени переменной, поскольку он скрывает встроенный тип (шашки, такие как pylint или pychecker, предупредят вас об этом).
Если вы не используете self.popinstance вне этой функции (кажется маловероятным, учитывая, что вы подключаетесь и выходите из функции), то нет смысла делать его атрибутом self. Просто используйте «popinstance».
Использовать xrange вместо range.
Вместо того, чтобы просто импортировать StringIO, сделайте это:
try:
import cStringIO as StringIO
except ImportError:
import StringIO
Если это почтовый ящик POP, к которому могут обращаться несколько клиентов одновременно, вы можете захотеть сделать попытку / исключение вокруг вызова RETR, чтобы продолжить, если вы не можете получить одно сообщение.
Как сказал Джон, используйте "\ n" .join вместо string.join, используйте try / finally, чтобы закрыть файл, только если он открыт, и отдельно передать параметры ведения журнала.
Единственная проблема с рефакторингом, о которой я мог подумать, заключается в том, что вам на самом деле не нужно анализировать все сообщение, поскольку вы просто сбрасываете копию необработанных байтов, а вам нужны только заголовки From и Subject. Вместо этого вы можете использовать popinstance.top (0), чтобы получить заголовки, создать из него сообщение (пустое тело) и использовать его для заголовков. Затем выполните полное RETR, чтобы получить байты. Это стоило бы сделать, только если ваши сообщения были большими (поэтому их анализ занимал много времени). Я определенно измерил бы, прежде чем я сделал эту оптимизацию.
От того, что ваша функция очищает для имен, зависит, насколько хороши вы хотите, чтобы имена были, и насколько вы уверены, что электронная почта и тема делают имя файла уникальным (кажется довольно маловероятным). Вы можете сделать что-то вроде:
emailpath = "".join([c for c in emailpath if c in (string.letters + string.digits + "_ ")])
И в итоге вы получите только буквенно-цифровые символы, знак подчеркивания и пробел, которые кажутся читаемыми. Учитывая, что ваша файловая система (с Windows), вероятно, нечувствительна к регистру, вы также можете использовать строчные буквы (добавьте .lower () в конец) Вы можете использовать emailpath.translate, если хотите что-то более сложное.