使用 Python 检查电子邮件

Posted

技术标签:

【中文标题】使用 Python 检查电子邮件【英文标题】:Checking email with Python 【发布时间】:2010-11-16 13:41:36 【问题描述】:

我有兴趣在收到来自特定的电子邮件时触发特定操作 带有特定主题的地址。为了能够做到这一点,我需要实施 监控我的邮箱,检查每封收到的邮件(特别是,我使用 gmail)。 最简单的方法是什么?

【问题讨论】:

【参考方案1】:

Gmail 提供通过 POP 连接的功能,您可以在 gmail 设置面板中启用该功能。 Python 可以很容易地通过 POP 建立连接:

import poplib
from email import parser

pop_conn = poplib.POP3_SSL('pop.gmail.com')
pop_conn.user('username')
pop_conn.pass_('password')
#Get messages from server:
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message intom an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
for message in messages:
    print message['subject']
pop_conn.quit()

您只需将此脚本作为 cron 作业运行。不确定您在哪个平台上,所以 YMMV 是如何完成的。

【讨论】:

非常感谢!!!它工作得很好。我现在唯一的问题是我只需要检索新消息。当然,可以检索所有消息,然后将旧列表与新列表进行比较。但是我想知道是否有更好的方法可以做到这一点,是否有内置方法。 在 POP 模式下,gmail 只会让您检索一次邮件。后续连接不会向您显示该消息。除非发生以下两件事之一:您是否打开了“最近模式”?请参阅此处:mail.google.com/support/bin/answer.py?answer=47948 了解如何禁用它。或者,如果 gmail 实际上每次都给你相同的电子邮件,那可能是因为你的 pop 连接上没有调用 quit() 方法。在调用退出之前是否有一个异常被引发但未被捕获?然后gmail会给你同样的邮件。 要让这段代码在 Python3 中工作,添加“import email”并更改这两行:messages = [b"\n".join(mssg[1]) for mssg in messages] ;; messages = [email.message_from_bytes(mssg) for mssg in messages] 这不起作用,我得到了:error_proto: b'-ERR [AUTH] Web login required: https://support.google.com/mail/answer/78754' @tumbleweed 你应该会收到一封来自谷歌的电子邮件,链接你到:myaccount.google.com/lesssecureapps。必须启用此功能才能正常工作。【参考方案2】:

Gmail 为新电子邮件提供了一个原子feed。您应该能够通过使用 py cURL(或其他一些网络库)进行身份验证并拉下提要来监控这一点。为每封新邮件发出 GET 请求应将其标记为已读,这样您就不必跟踪您已阅读的电子邮件。

【讨论】:

知道如何发送正确的信息以进行授权吗? @PascalvKooten 迟到的答案,但格式为 https://:@mail.google.com/mail/feed/atom/ 如果启用了双因素身份验证,您应该创建应用专用密码:support.google.com/accounts/answer/185833?hl=nl @Whitebird 听起来仍然值得研究。我想我对此的兴趣是异步的;既然我有了答案,我仍然可能会弄乱它^_^谢谢!【参考方案3】:

虽然不是特定于 Python 的,但我一直很喜欢 procmail 任何可以安装它的地方...!

只需将| pathtoyourscript 用作您选择的条件的一些操作行(竖线AKA 管道后跟您要在这些情况下执行的脚本),您的邮件就会在您选择的条件下通过管道传输到您选择的脚本,让它为所欲为 - 很难想到更通用的方法来“在收到满足您特定条件的邮件时触发您选择的操作!当然有多少没有限制您可以检查的条件,单个条件可以触发多少条操作线(只需将您想要的所有操作线括在 大括号中)等等。

【讨论】:

Procmail 确实不能解决触发动作的问题(除非有问题的动作是发送消息)。 @J.彼得森,你在开玩笑吧?! | pathtoyourscript 并且您可以启动您选择的脚本并在满足您最喜欢的条件时将您的邮件发送给它,并且脚本可以做任何它想做的事情——这怎么不是“触发动作”?!【参考方案4】:

人们似乎对 Lamson 很感兴趣:

https://github.com/zedshaw/lamson

这是一个完全用 Python 编写的 SMTP 服务器。我相信你可以利用它来做你需要的一切——只需将 gmail 邮件转发到那个 SMTP 服务器,然后做你想做的事。

但是,我认为执行上面的 ATOM 提要建议可能是最简单的。

编辑:Lamson 已被遗弃

【讨论】:

salmon 是一个叉子,试图达到 python 3 - 它是最近被触及的 - github.com/moggers87/salmon【参考方案5】:

当我想做同样的事情时,我找到了pretty good snippet(并且示例使用了 gmail)。另请查看google search results。

【讨论】:

来自 web.archive.org 的相同链接:Quick and dirty email server checker, python【参考方案6】:

我最近使用 procmail 和 python 解决了这个问题

阅读 procmail 的文档。您可以告诉它在特殊的 procmail 配置文件中将所有传入的电子邮件发送到这样的 python 脚本

:0:
| ./scripts/ppm_processor.py

Python 有一个可用的“email”包,它可以做任何你可能想用电子邮件做的事情。阅读以下内容....

from email.generator import Generator
from email import Message
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.mime.multipart import MIMEMultipart

【讨论】:

【参考方案7】:

https://developers.google.com/gmail/gmail_inbox_feed 说你必须有一个公司的 Gmail。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于使用 Python 检查电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

检查某些条件后使用python发送电子邮件[重复]

在使用 Python smtplib 时检查电子邮件日志

如何在 Python 中检查电子邮件是不是存在?

python 检查您的域的电子邮件地址是Gmail还是Google Apps

检查电子邮件是不是存在,仅对gmail帐户有效,其他无效

使用 python 转发 html 电子邮件