【问题标题】:Reading and parsing email from Gmail using C#, C++ or Python使用 C#、C++ 或 Python 从 Gmail 读取和解析电子邮件
【发布时间】:2011-02-17 01:39:45
【问题描述】:

我必须做一个 Windows 应用程序,不时访问 Gmail 帐户并检查是否有新电子邮件。如果有,它必须阅读电子邮件正文和主题(简单的文本电子邮件,没有图像或附件)。

请不要使用付费库,如果使用任何其他库,请提供下载路径。

我只需要电子邮件正文和主题。因此,如果可以解析来自 Gmail 的冗长而复杂的邮件,并且只包含两个字符串包含主题和正文,那将是完美的。

最后,我只需要获取自上次执行以来到达的新消息。因此,可以将已读消息标记为“已读”,并且只考虑新消息(标记为“新”)。

代码可以用 Python 或 C++ 编写,但我更喜欢用 C#。

相关问题:

【问题讨论】:

    标签: c# python email gmail


    【解决方案1】:

    使用众多C# IMAP libraries之一。

    【讨论】:

    • 是的,gmail 支持 IMAP,但是你需要打开 IIRC。采取任何其他方法是没有意义的。 +1
    • 正如我所说,我想使用一个免费的库。所以如果你能推荐一个。并且,如果可能,请使用该库发送一个简单的示例代码。不要忘记将来自 Gmail 的长而复杂的消息转换为两个简单的字符串。谢谢...
    【解决方案2】:

    这会打印未查看消息的主题和正文,并将这些消息标记为已查看。

    import imaplib
    import email
    
    def extract_body(payload):
        if isinstance(payload,str):
            return payload
        else:
            return '\n'.join([extract_body(part.get_payload()) for part in payload])
    
    conn = imaplib.IMAP4_SSL("imap.gmail.com", 993)
    conn.login("user", "password")
    conn.select()
    typ, data = conn.search(None, 'UNSEEN')
    try:
        for num in data[0].split():
            typ, msg_data = conn.fetch(num, '(RFC822)')
            for response_part in msg_data:
                if isinstance(response_part, tuple):
                    msg = email.message_from_string(response_part[1])
                    subject=msg['subject']                   
                    print(subject)
                    payload=msg.get_payload()
                    body=extract_body(payload)
                    print(body)
            typ, response = conn.store(num, '+FLAGS', r'(\Seen)')
    finally:
        try:
            conn.close()
        except:
            pass
        conn.logout()
    

    上面的大部分代码来自Doug Hellmann's tutorial on imaplib

    【讨论】:

    • 确实有效。我能够获得看不见的消息的主题,然后将其标记为已见。但是 get_payload() 函数不能正常工作。我无法获取消息正文。我收到的消息不是正文,而是:[, ]
    • @jpnavarini:我添加了处理多部分消息的代码。这能解决问题吗?
    • 我希望这对我有用!不适用于我的旧 Mac。除了用户名和密码,您还需要更改其他内容吗?
    • @Dylan:这对我也不起作用。 imaplib.IMAP4_SSL("imap.gmail.com", 993) 正在超时。不知道修复是什么......
    • @unutbu Aaaand,现在我的工作正常。我在终端输入了这个telnet imap.gmail.com 993。它说Connection closed by foreign host,但它至少允许我连接到端口993。 :) 干杯
    【解决方案3】:

    请注意,Gmail-IMAP 和 IMAPA 之间存在一些差异。例如,由于 Gmail 将文件夹视为标签,因此如果邮件被其他文件夹标记,则如下代码不会删除邮件:

    imap_instance.uid('store', uid, '+FLAGS', '\\Deleted')
    imap_instance.expunge()
    

    【讨论】:

      【解决方案4】:

      我知道这是一篇旧帖子,但我想将以下链接添加到开源 ImapX 2 库讨论中:https://imapx.codeplex.com/ 开发人员似乎正在使项目保持最新状态。所有参与的人都做得很好

      【讨论】:

        【解决方案5】:

        Google 已开放其 Gmail API 以访问您的 gmail 帐户。您可以在此链接中查看包含基本功能的快速入门示例:

        https://developers.google.com/gmail/api/quickstart/python

        【讨论】:

          【解决方案6】:
          from imap_tools import MailBox, Q
          # This prints the subject and body of unseen messages, and marks those messages as seen.
          with MailBox('imap.mail.com').login('test@mail.com', 'password') as mailbox:
              # *mark_seen param = True by default
              print([(m.subject, m.html or m.text) for m in mailbox.fetch(Q(seen=False), mark_seen=True)])
          

          imap_tools

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-07
            • 2011-10-26
            • 2019-09-02
            • 2019-09-20
            • 1970-01-01
            • 2013-09-22
            • 1970-01-01
            • 2011-09-26
            相关资源
            最近更新 更多