2016-12-06 8 views
0

Я попытался адаптировать этот скрипт, который нашел, выполнив поиск в Google. Работал отлично с предыдущими сообщениями электронной почты, которые я получал, поскольку он непосредственно извлекал поле «От», и я не получил ошибку.Пытается извлечь поле заголовка «Reply-To» в Python, не получив адрес электронной почты

Вот что мой код выглядит следующим образом:

#!/usr/bin/python 

import imaplib 
import sys 
import email 
import re 

#FOLDER=sys.argv[1] 
FOLDER='folder' 
LOGIN='[email protected]' 
PASSWORD='password' 
IMAP_HOST = 'imap.gmail.com' # Change this according to your provider 

email_list = [] 
email_unique = [] 

mail = imaplib.IMAP4_SSL(IMAP_HOST) 
mail.login(LOGIN, PASSWORD) 
mail.select(FOLDER) 

result, data = mail.search(None, 'ALL') 
ids = data[0] 
id_list = ids.split() 
for i in id_list: 
    typ, data = mail.fetch(i,'(RFC822)') 
    for response_part in data: 
     if isinstance(response_part, tuple): 
      msg = email.message_from_string(response_part[1]) 
      sender = msg['reply-to'].split()[0] 
      address = re.sub(r'[<>]','',sender) 
# Ignore any occurences of own email address and add to list 
    if not re.search(r'' + re.escape(LOGIN),address) and not address in email_list: 
     email_list.append(address) 
     print address 
+0

У электронной почты может не быть ответа на вопрос. Это нормально. – furas

+0

все письмо имеет ответ на. На самом деле, он не извлекает адрес электронной почты, это единственная проблема здесь: – Vanity

+0

, если вы уверены, что у вас есть письмо с ответом, а затем используйте 'print()', чтобы узнать, что у вас есть в 'msg' и в' msg [' answer-to '] 'и в' msg [' reply-to ']. split() ' – furas

ответ

0

Вместо возни с струнной расщеплению и нарезкой, правильный подход заключается в использовании parseaddr из пакета email.utils в стандартной библиотеке. Он правильно обрабатывает различные форматы юридических адресов в заголовках электронной почты.

Некоторые примеры:

>>> from email.utils import parseaddr 
>>> parseaddr("[email protected]") 
('', '[email protected]') 
>>> parseaddr("<[email protected]>") 
('', '[email protected]') 
>>> parseaddr("Sally <[email protected]>") 
('Sally', '[email protected]') 
>>> parseaddr("Sally Smith <[email protected]>") 
('Sally Smith', '[email protected]') 
>>> 

Кроме того, вы не должны предполагать, что письма имеют для ответа заголовок. Многие этого не делают.