2016-08-03 90 views
1

我有一段代码可以从我的收件箱(gmail)的邮件中获取电子邮件。获取邮件工作正确的,当我打印email_from,但我想这样做的分割数据的姓名和电子邮件等,但后来码打印第一循环步骤之后坏了,我得到了一些错误操作:'str'对象没有属性'message_from_bytes'

Traceback (most recent call last): 
    File "C:\Users\loc\Desktop\extract_gmail.py", line 24, in <module> 
    email_message_raw = email.message_from_bytes(data[0][1]) 
AttributeError: 'str' object has no attribute 'message_from_bytes' 

你能不能给我有些建议如何解决这个问题?

代码:

import imaplib 
import email 
from email.header import Header, decode_header, make_header 

# Connection settings 
HOST = 'imap.gmail.com' 
USERNAME = '***' 
PASSWORD = '***' 

m = imaplib.IMAP4_SSL(HOST, 993) 
m.login(USERNAME, PASSWORD) 
m.select('INBOX') 

result, data = m.uid('search', None, "ALL") 
if result == 'OK': 
    for num in data[0].split()[:5]: 
     result, data = m.uid('fetch', num, '(RFC822)') 
     if result == 'OK': 
      # Get raw message 
      email_message_raw = email.message_from_bytes(data[0][1]) 

      # Decode headers 
      email_from = str(make_header(decode_header(email_message_raw['From']))) 

      # Print each name and email 
      name, email = email_from.split('<') 
      email.replace(">", "") 
      print(name + "|" + email) 

      # When i swap to just print email_from then works 
      # print(email_from) 



# Close server connection 
m.close() 
m.logout() 

回答

3

在你的代码取代了电子邮件变量..

尝试......

import imaplib 
import email 
from email.header import Header, decode_header, make_header 

# Connection settings 
HOST = 'imap.gmail.com' 
USERNAME = '***' 
PASSWORD = '***' 

m = imaplib.IMAP4_SSL(HOST, 993) 
m.login(USERNAME, PASSWORD) 
m.select('INBOX') 

result, data = m.uid('search', None, "ALL") 
if result == 'OK': 
    for num in data[0].split()[:5]: 
     result, data = m.uid('fetch', num, '(RFC822)') 
     if result == 'OK': 
      # Get raw message 
      email_message_raw = email.message_from_bytes(data[0][1]) 

      # Decode headers 
      email_from = str(make_header(decode_header(email_message_raw['From']))) 

      # Print each name and email 
      name, email_addr = email_from.split('<') 
      email_addr.replace(">", "") 
      print(name + "|" + email_addr) 

      # When i swap to just print email_from then works 
      # print(email_from) 



# Close server connection 
m.close() 
m.logout() 
+1

你有权利。我更换了电子邮件 - 我讨厌这个小错误:)感谢您的帮助。 – Thaian

0

我有同样的错误[高兴地解决] ,我的错误在于shebang。这应该指向python3。

#! /usr/bin/env python3 
相关问题