如何为Python应用程序设置电子邮件和消息通知
#编程 #教程 #python #notifications

概括

因此,您已经准备了一个不错的Python应用程序,该应用程序现在正在运行(或几乎存在),但是您仍然需要手动检查结果,或者看到它实际上正在顺利运行...因此,如果您'重新离开,突然有什么停止工作的工作?它将继续被打破,直到您决定检查并修复它,但这不是很实际。

实现某种通知系统会好得多,因此发生某些事情时会被警报。这可能是不好的事情,例如您的应用程序无法正确处理意外错误,或者像某些重型程序完成跑步的好处,并准备好您的结果。

在这里,我们将介绍一种简单的方法,使用Python,Gmail和Telegram实现相当可靠的通知系统。
您可能想问“为什么要两个频道?”。好吧,通知系统可能会失败,并且由于缺乏通知不是会注意到的,因此可能会完全忽略它,然后您可能会错过重要的通知。那将是一个很大的失败。

避免这种情况,重要的是要有一些冗余。当然,两个通知系统也可能会失败,但是同时这样做的可能性较小,因此,如果我们并行实施了多个系统,我们会感觉到我们的通知更加安全。如果您的应用对您至关重要,那么也可以并行添加更多渠道,但是在这里我们将自己限制为两个。

另外,如果在给定的场合我们只通过一个渠道收到通知,我们知道我们需要检查另一个频道,因为它可能会被打破。

注意:在这篇文章中,我将只共享代码片段,但我会忽略非常重要的功能,这些功能对于理解关键概念并不重要,并且在第一次阅读时也可以妨碍它(例如,类和功能定义,文件路径分辨率,错误处理,日志记录,测试等)。无论如何,您应该尝试以对您的应用程序有意义的方式实现这些代码片段以及所有其他成分。

通过Gmail发送电子邮件通知

要使用Gmail发送通知,我们自然需要一个Google帐户。
我认为最好的方法是创建一个新帐户来发送这些电子邮件,以避免使用个人的Google帐户,以防安全漏洞,并且有人可以访问我们将创建的密码应用程序。

仅出于这些目的而创建一个新帐户意味着,即使有人可以访问密码应用程序,也没有太大的伤害,或者根本没有。

因此,让我们创建一个新的Google帐户,并将其称为notifier.bot@gmail.com(此确切地址可能是在获取的,但实际帐户名称并不重要,您可以使用您喜欢的任何名称创建它)。

仔细阅读所有步骤后,我们需要首先启用2 step verification,因为这是Google能够创建密码应用程序之前的先决条件。
只需浏览步骤,使用为2步验证提供的一种方法。

一旦设置了,我们现在就可以create a App Password
这些步骤非常简单,只需单击几下,我们获得了一个新的应用程序密码(我们称其为<app-password>),我们可以使用它来使用它来验证我们的帐户,而不是我们的常规passowrd。
显而易见的好处是,我们可以在应用程序中使用此应用程序密码,而我们不需要包含我们的实际帐户密码,因此,如果错误地被过滤并且有人获得访问权限,我们可以简单地撤销它,我们永远不会丢失帐户的控制。

现在我们有了一个通知器Google帐户,我们为其创建了一个密码应用程序,创建和发送电子邮件的代码非常简单:

import json
import os
import smtplib
from email.message import EmailMessage

from dotenv import load_dotenv
_ = load_dotenv()

# Read email address and app password from environment variables.
gmail_account = os.environ.get("GMAIL_ACCOUNT")
gmail_password = os.environ.get("GMAIL_PASSWORD")

# Create message.
message = EmailMessage()
message["To"] = "danielcaballero88@gmail.com"
message["From"] = "danielcaballero88@gmail.com"
message["Subject"] = subject
message.set_content(content)

# Send email.
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
    smtp.login(gmail_account, gmail_password)
    smtp.send_message(message)

请注意,秘密(Gmail帐户和密码)是从以前从.env文件加载的环境变量中读取的。出于安全原因,将这些秘密拒之门外是非常重要的。
如果您不熟悉此,official documentation of the koude3 package非常容易遵循。

使用电报的消息通知

要通过电报发送通知,我们将创建一个新的电报机器人,将其添加到我们想要接收通知的电报聊天中,并实现代码以将通知消息发送到该频道。

最好的方法是跟随official tutorial for creating and setting up a bot
尽管如此,在这里我将摘要我遵循的步骤。

创建电报机器人

只需在Telegram消息传递应用中查找@BotFather,并要求通过发送/newbot
来创建一个新的机器人 给它消息。
它会提示bot名称,我们可以给出类似NotifierBot的东西,但是这很可能会被采用,所以
使用唯一的(并且一定要使用骆驼,只是为了一致性,)。
然后,机器人父亲将为机器人提供一个令牌(让我们称其为<token>),这是要保密的,
现在就保存。

现在您可以寻找机器人并开始与它进行交互,但是由于没有任何实施,它将是
就像在墙上说话(在搜索栏中查找@NotifierBot或您在使用@标志之前使用的任何名称,您应该在那里看到它)。
但是,我们可以做的是获取此聊天的聊天ID,或者如果我们已经有一个专门用于通知的聊天,或者我们可以为其创建新聊天,无论您选择什么,您,这不会影响下一步。

但是,我们确实需要获得聊天ID,因为我们希望机器人将消息发送到该特定聊天,因此我们需要
访问以下URL:

https://api.telegram.org/<token>/getUpdates

只需用实际的机器人令牌替换<token>并在浏览器中访问。
您将在浏览器窗口和其中的某个地方显示JSON响应:

...
"my_chat_member":{"chat":{"id":<chat_id>,"
...

其中<chat_id>是正数或负数。

复制该号码并也保存。

实施通知

现在,使用tokenchat_id,我们可以构建呼叫来发送我们想要的消息,并使用
sendMessage电报API的方法:

import requests
from dotenv import load_dotenv
_ = load_dotenv()

# Read token and chat_id from environment variables.
telegram_token = os.environ.get("TELEGRAM_TOKEN")
telegram_chat_id = os.environ.get("TELEGRAM_CHAT_ID")

headers = {
    "Content-Type": "application/json",
    "Proxy-Authorization": "Basic base64",
}
data_dict = {
    "chat_id": telegram_chat_id,
    "text": <message>,  # Replace <message> with the intended message.
    "parse_mode": "HTML",
    "disable_notification": True,
}
data = json.dumps(data_dict)
url = f"https://api.telegram.org/bot{telegram_token}/sendMessage"

response = requests.post(
    url, data=data, headers=headers, verify=False, timeout=10
)

再次注意到,我们正在阅读以前从.env文件加载的环境变量的秘密。

结论

在这里,我展示了我们如何使用Gmail和Telegram设置通知,当我们需要立即通知或在发生某些事物(好或坏)发生时,这对于许多实际应用非常有用。

也解释了所有内容,并提供了每种情况的官方文档的链接。

您应该能够将这些代码片段调整到您的用例中,也可以随时提出问题,我会尽力回答它们。