【问题标题】:Using IMAPClient how do you view the Senders address?使用 IMAPClient 如何查看发件人地址?
【发布时间】:2012-10-24 02:59:01
【问题描述】:

使用IMAPClient如何查看邮件正文和发件人电子邮件地址?

server = IMAPClient(imap_server, use_uid=True, ssl=ssl)
server.login(imap_user, imap_password)

print 'login successful'

select_info = server.select_folder('INBOX')
print '%d messages in INBOX' % select_info['EXISTS']

messages = server.search(['NOT DELETED'])
print "%d messages that aren't deleted" % len(messages)

print
print "Messages:"
response = server.fetch(messages, ['FLAGS', 'RFC822.SIZE'])
for msgid, data in response.iteritems():
    print '   ID %d: %d bytes, flags=%s' % (msgid,
                                            data['RFC822.SIZE'],
                                            data['FLAGS'])

【问题讨论】:

    标签: python imaplib imapclient


    【解决方案1】:

    IMAPClient 是一个相当低级的库,所以你仍然必须了解 IMAP 协议。

    您可以尝试使用更高级的 IMAP 库:imap_tools

    • 解析的电子邮件属性
    • 用于搜索电子邮件的查询生成器
    • 处理文件夹中的电子邮件(复制、删除、标记、移动、查看)
    • 使用邮箱文件夹(列表、设置、获取、创建、存在、重命名、删除、状态)
    • 无依赖关系

    【讨论】:

      【解决方案2】:

      虽然IMAPClient 比使用imaplib 容易得多,但了解IMAP protocol 仍然很有用

      (注意,我选择了一个任意的单个电子邮件 ID 来使用)

      您可以通过以下方式获取 FROM:

      server.fetch([456], ['BODY[HEADER.FIELDS (FROM)]'])
      # {456: {'BODY[HEADER.FIELDS (FROM)]': 'From: Facebook <register+mr4k25sa@facebookmail.com>\r\n\r\n', 'SEQ': 456}}
      

      和身体通过:

      server.fetch([456], ['BODY[TEXT]'])
      # {456: {'BODY[TEXT]': "Hey Jon,\r\n\r\nYou recently entered a new contact email [snip]", 'SEQ': 456}}
      

      但是,通常更容易做的是:

      import email
      m = server.fetch([456], ['RFC822'])
      msg = email.message_from_string(m[456]['RFC822'])
      print msg['from']
      # Facebook <register+mr4k25sa@facebookmail.com>
      from email.utils import parseaddr
      print parseaddr(msg['from'])
      # ('Facebook', 'register+mr4k25sa@facebookmail.com')
      print msg.get_payload()
      # content of email...
      

      请注意负载包含附件或多部分的位置...

      【讨论】:

      • 谢谢你。我如何将它绑定到 for 循环中以在我的代码中使用?我尝试了几件事,它返回了{}
      • @David server.fetch 返回一个包含 msg_id->您要求的内容的字典...所以给定 msgs = server.fetch(...)', you can do for msg_id,msgs.iteritems() 中的内容`
      【解决方案3】:

      消息正文是这样找到的(我将使用循环来打印每个未删除的消息正文):

        for i in server[0].split():
            body = server.fetch(i,"BODY[TEXT]")
            print(body)
      

      这应该是为消息体做的...

      【讨论】:

      • 我收到了这个错误。 for i in server[0].split():TypeError: 'IMAPClient' object does not support indexing
      • 对不起,我这样做是远离我编写的代码。试试 response[0].split() 吗?
      猜你喜欢
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 2012-06-28
      • 2013-06-19
      • 2015-07-22
      • 2011-08-31
      相关资源
      最近更新 更多