python - 解析发件人、发件人和主题的消息

标签 python email imap

我正在尝试从 IMAP 获取未读邮件。当我尝试解析电子邮件内容时,我得到len(email_message.keys()) == 0。这样我就永远不会得到 FromToSubject

打印的电子邮件 (email.message_from_string(email_str)):

From nobody Fri Sep 14 13:42:50 2012

1 (RFC822 {1015}
Return-Path: <sender@domain.com>
X-Original-To: recepient@domain.com
Delivered-To: recepient@domain.com
Received: from ec2.....amazonaws.com (unknown [IP])
    (Authenticated sender: sender@domain.com)
    by domain.com (Postfix) with ESMTPA id EACD436CF
    for <recepient@domain.com>; Fri, 14 Sep 2012 12:47:54 +0000 (UTC)
DKIM-Signature: ....
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
From: sender@domain.com
To: recepient@domain.com
Subject: welcome

Dear recipient,

Welcome.

Best,
Robot

这是代码:

def fetch_new_emails(host, port, user, password):
  conn = imaplib.IMAP4(host=host, port=port)

  try:
    (retcode, capabilities) = conn.login(user, password)
    conn.select(readonly=1) # Select inbox or default namespace
    (retcode, messages) = conn.search(None, '(UNSEEN)')
    results = []
    if retcode == 'OK':
      for message in messages[0].split(' '):
        (ret, raw_email) = conn.fetch(message, '(RFC822)')
        if ret == 'OK':
          print raw_email[0]
          email_str = string.join(raw_email[0], "\n")
          email_message = email.message_from_string(email_str)
          email_from = email_message['From']
          to = email_message['To']
          subject = email_message['Subject']
          results.append({
            'from': email_from, 
            'to': to,
            'subject': subject})
  except:
    print sys.exc_info()[1]
    sys.exit(1)
  finally:
    conn.close()
  return results

问题:

print email_message['From']
>>None    
print email_message['To']
>>None
print email_message['Subject']
>>None

最佳答案

Frombody... 行之后有一个奇怪的空行。从技术上讲,空行是 header 的末尾,其后的所有内容都是正文,因此消息实际上没有这些 header 。

无论如何,IMAP 消息不应该有 From 行(这是典型的 Berkeley mbox 格式,很少有 IMAP 服务器使用这种格式;即使您的服务器有,其存储实现的这个细节也不应该对 IMAP 客户端可见)。

奇怪的 1 (RFC822 {1015} 行也不属于该行;它看起来模糊地像是 IMAP 协议(protocol)响应的一部分,而不是实际消息的一部分。消息本身以在这种特殊情况下,Return-Path: header 。

IMAP 服务器和/或客户端代码不是生产版本吗?

关于python - 解析发件人、发件人和主题的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12426023/

相关文章:

php - 通过 PHP 通过电子邮件发送动态创建的 PDF

image - 使用ckEditor发送电子邮件,图像问题

python - 电子邮件消息 python 抓取消息的一部分

java - 使用 spring 集成 IMAP 适配器,如何手动获取标记为 "unread"的电子邮件?

Java 邮件到 Exchange 服务器 "no login methods supported"

传递了附加参数的 Python argparse 自定义操作

python - 根据先前的元素解析项目

python - 将小部件的引用传递给函数

javascript - 如何在不使用程序的情况下通过javascript发送电子邮件?

python - 如何使用 python csv writer 写入 azure 输出 blob?