通过树莓派通知电子邮件状态

在本教程中,我们将设置一个使用 Sense Hat 的树莓派电子邮件通知程序,并将使用 LED 矩阵显示有关您电子邮件状态的可视通知。

如果您打算在家中使用 Sense HAT,则此电子邮件通知程序是一个出色的项目,可与 Sense HAT 气象站教程一起使用。

该项目将利用 IMAP 客户端与您的电子邮件服务器建立远程连接,请确保您使用的电子邮件提供商完全支持 IMAP ,否则本教程将无法正常工作。

我们将编写脚本来纯粹使用 Python 处理几乎所有内容,并且如果您将来决定增加项目的功能,那么该脚本将使该项目具有广泛的用途。这也是在构建既酷又有趣的东西的同时学习更多 Python 的好方法。

设备清单

您可以在下面找到该项目所需的所有设备。

推荐的

  • 树莓派

  • Micro SD 卡

  • Sense HAT

  • 以太网连接或 * WiFi 加密狗 (Pi 3 内置了 WiFi)

可选的

  • 树莓派外壳

Sense HAT 入门

在开始本教程之前,请确保已将 Sense HAT 正确放置在树莓派的 GPIO 引脚上。安装非常简单,正确安装后不需要任何额外的摆弄。

1 在开始之前,我们需要更新树莓派,以便它运行最新的软件。可以通过运行以下命令来完成此更新。本教程利用 Raspbian ,因此,如果您尚未安装 Raspbian ,那么 Raspbian 安装指南非常方便。

sudo apt-get update
sudo apt-get upgrade

2 既然树莓派是最新的,我们需要继续安装 Sense Hat 软件。该软件包包含我们需要与之交互的所有库。

sudo apt-get installSense-hat
sudo reboot

3 现在,我们已经安装了软件,我们现在需要编写一个快速脚本来确保 Sense HAT 正常运行。要创建文件并打开文件编辑器,请输入以下命令。

sudo vim 〜/sensehat_test.py

4 现在,将以下几行输入文件编辑器。我们还将简要解释代码的每一行。

从 sense _hat导入 SenseHat 

这行非常重要,因为它从”sense_hat” 库中导入了 SenseHat 模块。它使我们能够通过 Python 与 Sense Hat 进行交互,否则本来就很难。

感= SenseHat()

现在,此行创建了指向 SenseHat 库的链接并对其进行了初始化,因此我们可以开始在程序中使用它。

sense.show_message("Hello World")

此行是为了证明一切都已正确启动。它只是向 Sense Hat 发送一条消息,该消息将显示在 RGB 灯上。

输入完以上几行后,只需输入_Ctrl + X_然后_Y_然后_Enter_保存文件。

5 现在,我们需要通过输入以下命令来测试程序。

sudo python 〜/sensehat_test.py

如果一切正常,则”Hello Word” 字样应在 Sense HAT 的 LED 矩阵上滚动。如果没有,请检查命令行中是否有错误,如果没有,请检查 GPIO 引脚连接。

如果发现它仍然无法正常工作,请尝试运行以下命令来重新启动 Pi 。

sudo reboot

设置树莓派电子邮件通知程序

对于我们的 python 脚本,我们将使用 imapclient python 包来处理与邮件服务器的所有连接,但是首先,我们必须删除默认版本的 PIP 。

1 Raspbian 操作系统随附的 PIP 版本似乎在安装_imapclient_时遇到问题,因此我们将首先删除它并通过运行以下命令来安装新版本。

sudo apt-get remove python -pip
sudo wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo apt-get install python-pip

2 现在,我们可以成功安装_imapclient_软件包,并在终端中运行以下两个命令。

sudo apt-get install build-essential libssl-dev libffi-dev python-dev
sudo 点安装 imapclient 3 由于我们在本教程中使用了一些图像,因此我们将首先创建一个包含所有内容的目录。此设置将使它变得更加整洁和易于处理,然后将所有内容转储到主目录中。

我们创建目录并使用以下命令输入目录。

sudo mkdir 〜/emailnotifier
cd〜/emailnotifier

4 现在,我们下载并提取将在本教程中使用的图像。我们将使用这些图像来显示您的电子邮件的视觉通知。您可以根据需要编辑这些图像,请注意每个图像必须为 8 ×8 像素,因为每个像素代表 8 ×8 LED 矩阵上的 LED 。

运行以下命令以下载图像并将其提取到我们的 emailnotifier 目录中。

curl -L https://files.pimylifeup.com/sensehatemailnotifier/email_images.tar.gz | sudo 焦油 xvz 

5 最后,我们可以运行以下命令来编写脚本本身,创建并开始编辑文件。

sudo vim emailnotifier .py

电子邮件通知程序脚本说明

6 接下来,我们将解释脚本的每个部分及其功能。如果您只想买完成品,请再向下滚动一点。

#!/usr/bin/python
从 sense _hat导入 SenseHat 
从 imapclient 导入 IMAPClient 
导入时间
导入系统

首先,我们需要导入所有计划在脚本中使用的库。在我们的情况下,我们将使用以下库。

sense \ _hat 库
此导入是我们用来与 Sense Hat 本身进行交互的库,如果没有此库,我们将无法读取任何传感器数据或与 LED 矩阵进行交互。

imapclient 库
此导入是我们用来与 Webmail 服务器进行交互的库,并且提供了通过 IMAP 协议连接到 Web 服务的功能。

时间图书馆
此导入使我们可以执行各种不同的时间操作,但是对于我们的简单脚本,我们将仅使用其睡眠功能。此功能使我们可以将当前线程挂起一小段时间。

sys 库
该库使我们可以访问由解释器本身管理的一些变量和函数。就我们的脚本而言,如果需要,我们将使用它来终止脚本。

HOSTNAME ='imap.gmail.com'
USERNAME ='用户名'
密码='密码'
MAILBOX ='收件箱'
NEWMAIL_OFFSET = 0
MAIL_CHECK_FREQ = 20

在这里,我们定义了计划在 python 脚本中使用的变量。这些对于整个程序的工作方式至关重要,有助于轻松调整脚本。

确保更改每个设置以匹配您的相关用户和电子邮件服务。

HOSTNAME –该变量会将地址存储到我们将要连接到的 IMAP 服务器,如果您使用的是 GMAIL ,那么如果您使用的是 Outlook (Hotmail),则 imap.google.com 应该可以正常工作使用”imap-mail.outlook.com”。

如果不确定服务是否提供要连接的 IMAP 协议,请尝试使用 Google 搜索服务提供商和 IMAP 。

USERNAME –将其设置为您打算使用的电子邮件提供商的电子邮件 / 用户名,例如,如果我使用的是 Gmail ,我将使用 example @gmail.com 之类的电子邮件作为用户名。

PASSWORD –将其设置为您为 USERNAME 变量指定的用户的密码。

MAILBOX –这是您要检查新电子邮件的邮箱。如果您要检查特定的文件夹而不是整个收件箱,则此设置很有用。如果您不想扫描特定的文件夹,请将此设置保留为” 收件箱”。

NEWMAIL \ _OFFSET –这可能是要记住的更重要的参数之一,因为它是您将要进行最大调整的值,如果您像我一样并且从来没有一个空的收件箱,那么更改此值将有所帮助。基本上,您将此变量设置为希望脚本将其视为空的电子邮件数量。

例如,如果您有 200 封未读电子邮件,但只希望将之后的电子邮件视为新电子邮件,则将值设置为 200 。

MAIL \ _CHECK \ _FREQ –将此设置为您要检查新电子邮件的频率,此值以秒为单位。 20 的值可能不是最好的值,因为它不是很频繁,但是可以确保大多数新电子邮件都可以被快速接收。

感= SenseHat()
sense.load_image("hello.png")

这里的第一行创建到 SenseHat 库的链接并初始化自身,以便我们可以开始对其进行调用。第二个调用 SenseHat 库,以加载名为”Hello.png” 的图像,并将其显示在 8 ×8 LED 矩阵中。

尝试:
      服务器= IMAPClient(主机名,use_uid = True,ssl = True)
      server.login(用户名,密码)
除了:
      连接=假
      sense.load_image("error.png")
其他:
      已连接=真
      sense.load_image("done.png")
      select_info = server.select_folder(邮件箱)此代码块可完成多项任务,但是最重要的部分是代码的"try:"部分,因为这部分是开始与电子邮件服务器的连接的部分。

这将使用我们的电子邮件服务器的主机名创建一个新的 IMAPClient 对象,我们将使用唯一 ID 强制实施还是使用 SSL 强制连接。

之后,我们使用您提供的用户名和密码建立到服务器的登录连接。由于此语句包含在 try 语句中,如果连接失败,我们将在”except:” 子句中进行处理。

在此子句中,我们将_connected_变量设置为_False_并加载到错误图像中。否则,如果没有错误,我们将_connected_变量设置为_True_并将完成的图像加载到 LED 矩阵中。然后,我们还获得_imapclient_来选择我们指定的 MAILBOX 文件夹。

尝试:
      连接时:
            folder_status = server.folder_status(MAILBOX,'UNSEEN')
            newmails = int(folder_status ['UNSEEN'])
            如果新邮件> NEWMAIL_OFFSET:
                  新邮件-= NEWMAIL_OFFSET
                  sense.show_message(str(newmails))
                  如果新邮件== 1:
                        sense.load_image("mail.png")
                  elif newmails> 1和 newmails <15:
                        sense.load_image("mailFew.png")
                  elif newmails> 14:
                        sense.load_image("mailLot.png")
            其他:
                  sense.load_image("nomail.png")
            time.sleep(MAIL_CHECK_FREQ)
除了 KeyboardInterrupt :
      通过
sense.clear()

我们的下一个也是最后一个代码块,在 try ,while 循环内运行。如果曾经按下_Ctrl + C_,则 try 语句可以处理 while 循环的中断。设计 while 循环是为了使我们可以继续运行我们的邮件检查。但是,只有在建立与邮件服务器的成功连接后,它才会运行。

然后,我们进行呼叫以检查邮箱的状态,这将向我们返回该特定邮箱的未读 / 未读电子邮件数量。

接下来,我们检查以确保新电子邮件的数量大于偏移量。我们可以将新邮件更改为仅等于偏移量后的新邮件数量。

完成此操作后,我们现在将调用 Sense Hat 库,以在树莓派 Sense HAT 的 LED 矩阵上显示新电子邮件的数量。

接下来,我们检查是否只有一封新电子邮件 (如果是),我们在邮箱的右上角显示一个带有绿色框的邮箱。如果一封邮件多于一封,但少于十四封,我们将在左上角显示一个带有橙色框的电子邮件。如果电子邮件多于 15 个,我们会在电子邮件的右上角显示带有红色框的电子邮件。

最后,对于那组”if” 语句,我们有一个”else” 语句,这可以处理没有新电子邮件的情况。

之后,让脚本进入休眠状态,直到在变量 MAIL _CHECK_FREQ 中定义的秒数为止。

最后,我们有一个例外,它处理 KeyboardInterrupts,以便我们清晰地退出 while 循环并运行最后的代码,这是对 sense.clear() 的调用,以清除 LED 矩阵。

完成的脚本

现在,您应该对代码的运行方式有所了解,如果要查看脚本的最终版本,则可以在下面找到它。

#!/usr/bin/python
从 sense _hat导入 SenseHat 
从 imapclient 导入 IMAPClient 
导入时间
导入系统

HOSTNAME ='imap.gmail.com'
USERNAME ='用户名'
密码='密码'
MAILBOX ='收件箱'
NEWMAIL_OFFSET = 0
MAIL_CHECK_FREQ = 20

感= SenseHat()
sense.load_image("hello.png")

尝试:
      服务器= IMAPClient(主机名,use_uid = True,ssl = True)
      server.login(用户名,密码)
除了:
      连接=假
      sense.load_image("error.png")
其他:
      已连接=真
      sense.load_image("done.png")
      select_info = server.select_folder(邮件箱)

尝试:
      连接时:
            folder_status = server.folder_status(MAILBOX,'UNSEEN')
            newmails = int(folder_status ['UNSEEN'])
            如果新邮件> NEWMAIL_OFFSET:
                  新邮件-= NEWMAIL_OFFSET
                  sense.show_message(str(newmails))
                  如果新邮件== 1:
                        sense.load_image("mail.png")
                  elif newmails> 1和 newmails <15:
                        sense.load_image("mailFew.png")
                  elif newmails> 14:
                        sense.load_image("mailLot.png")
            其他:
                  sense.load_image("nomail.png")
            time.sleep(MAIL_CHECK_FREQ)
除了 KeyboardInterrupt :
      通过
sense.clear()7 现在,我们已将所有代码写入文件中,现在可以通过按_Ctrl + X_然后按_Y_再按_Enter_保存并退出它。

8 编写完脚本后,我们现在可以运行它了。我们只需在终端中输入以下命令即可完成此操作,现在就不必担心它会控制终端了。我们将编写另一个脚本来处理将电子邮件通知程序作为服务运行。

sudo python emailnotifier.py

9 您应该立即开始查看树莓派的 Sense 帽子 LED 矩阵上显示的图像,该图像正在加载时应显示三个不同的彩色盒子。一旦成功开始阅读您的电子邮件,它将显示当前未阅读的电子邮件数量 (在阈值数量之后),然后显示可视指示器。

可视指示器应让您了解有多少未读电子邮件,而无需阅读滚动显示的文本。如果有一个绿色框,则只有一封未读电子邮件,一个黄色框表示有多个未读电子邮件,但少于十四封电子邮件。最后,一个红色框表示有超过十四封未读的电子邮件。

默认情况下,除非您更改了默认的”MAIL_CHECK_FREQ” 值,否则此脚本应连续循环并每 20 秒更新一次。

如果在原始的三个块之后没有显示任何内容并且脚本终止,则表明该脚本未能成功建立与您的电子邮件服务器的连接 ,请仔细检查您为” 主机名”,” 用户名” 和” 密码” 设置的值。

如果您正在为邮件服务进行两因素身份验证,则可能需要为该特定服务生成应用程序密码。

10 现在,您应该拥有一个使用 Sense HAT 的功能齐全的树莓派电子邮件通知程序。但是,如果您打算每天使用此功能,则不必一直都在运行 emailnotifier.py python 脚本。

为了改善这一点,我们将编写一个 bash 脚本,以便我们可以将新的 python 脚本用作服务,这将使我们能够轻松地与脚本交互。这将使我们能够启动,停止,重新启动和检查脚本的状态。它还将使我们能够在启动时自动启动脚本。

改进您的电子邮件通知程序–启动时启动脚本

1 为确保一切正常,我们需要安装其他软件包。这个软件包叫做_dos2unix_,它将把 DOS 风格的行尾转换成对 Unix 更友好的东西。

要获取正确的软件包,请在终端中输入以下行。

sudo apt-get install dos2unix

2 我们需要接下来将 Python 脚本设置为服务,以便它可以在启动时启动。为此,我们需要编写一个简短的脚本,以后可以停止,启动,重新启动并使其在启动时自动运行。

输入以下命令以开始编写脚本。

sudovim/etc/init.d/emailnotifier

现在,在此文件中输入以下代码。如果您对电子邮件通知程序脚本的位置进行了任何更改,请确保在以下代码中对此进行更新。

#!/bin/bash
###开始初始化信息
#提供:emailnotifier
#必选-开始:
#必需-停止:
#默认开始:2 3 4 5
#默认停止:0 1 6
#简短描述:启动/停止 emailnotifier 
#说明:启动/停止 emailnotifier 
###结束初始化信息

DIR =/home/pi
DAEMON = $ DIR/emailnotifier/emailnotifier.py
DAEMON_NAME =电子邮件通知程序

DAEMON_USER =根

PIDFILE =/var/run/$ DAEMON_NAME.pid

。/lib/lsb/init-functions

do_start(){
    log_daemon_msg"正在启动系统$ DAEMON_NAME守护程序"
    start-stop-daemon --start --background --pidfile $ PIDFILE --make-pidfile --user $ DAEMON_USER --chuid $ DAEMON_USER --startas $ DAEMON
    log_end_msg $?
}
do_stop(){
    log_daemon_msg"正在停止系统$ DAEMON_NAME守护程序"
    start-stop-daemon --stop --pidfile $ PIDFILE --retry 10
    log_end_msg $?
}

案例"$ 1"在
    开始|停止)
        do _ $ {1}
        ;;

    重新启动|重新加载|强制重新加载)
        do_stop
        do_start
        ;;

    状态)
        status_of_proc"$ DAEMON_NAME""$ DAEMON"&&退出 0  ||退出$?
        ;;
    *)

        echo "用法:/etc/init.d/$DAEMON_NAME {开始|停止|重新启动|状态}"
        1号出口
        ;;
埃萨克
出口 0 

3 将所有代码复制到文件后,现在可以按 Ctrl + X_,然后按_Y_,最后按 Enter 键,以保存并退出。4 现在完成了,我们还需要做其他一些事情。首先,对刚刚保存的文件运行_dos2unix_程序。该程序将确保行尾正确无误,并有助于防止将来出现任何麻烦。只需运行以下命令即可完成此步骤。
sudo dos2unix /etc/init.d/emailnotifier

5 接下来,我们需要确保 Python 脚本的权限正确,否则 init .d bash 脚本将失败。要确保它具有正确的权限,请输入以下行。

sudo chmod 755 /home/pi/emailnotifier/emailnotifier.py

6 我们还需要编辑电子邮件通知程序 bash 脚本的权限,以使其能够正确执行。我们可以通过输入以下命令来做到这一点。

sudo chmod + x /etc/init.d/emailnotifier

7 最后,在 bash 脚本和 rc .d 文件夹之间创建符号链接。您只需在终端输入以下行即可完成此操作。

sudo update-rc.d emailnotifier默认值

8 这应该是现在正确设置的所有内容。现在您应该能够与新的 bash 文件进行交互,就像在树莓派上进行任何其他服务一样。要对其进行测试,只需运行以下命令来启动电子邮件通知程序。

sudo service emailnotifier 启动

9 电子邮件通知程序现在应该在启动时自动启动。您还可以通过在终端中输入相关命令来启动,停止和重新加载服务。

以下是可用来与 emailnotifier 服务进行交互的命令列表。

以下命令将启动跟踪您的 emailnotifier.py 文件的服务。

sudo service emailnotifier 启动

_stop_命令停止 emailnotifier 服务,并终止正在运行我们的 emailnotifier.py 的进程。

sudo service emailnotifier 停止

重新加载将通过终止进程并重新启动它来 reload emailnotifier 服务。

sudo service emailnotifier 重新加载

您可以使用的最后一个命令检索 emailnotifier 服务的_status_和我们的 emailnotifier.py 脚本。

sudo service emailnotifier 状态

希望到现在为止,您应该已经启动并运行树莓派电子邮件通知程序,而没有任何问题。如果您遇到任何问题,请提供反馈或与本教程相关的任何其他信息,然后在下面发表评论。

分享到