百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

用SendGrid和Redis队列用Python调度国际空间站的电子邮件

gudong366 2025-07-13 06:53 10 浏览

有一些很酷的API,比如打开通知我们可以编程地访问国际空间站的位置,以确定它何时经过特定的位置,而使用Twilio SendGrid,我们可以在发生这种情况时发送电子邮件通知。

让我们介绍一下如何在Python中使用排定电子邮件的Redis队列 .

先决条件和依赖性

在继续前进之前,请确保有以下内容:

  • Python 3安装在你的机器上
  • 免费的SendGrid帐户
  • 测试此项目的电子邮件地址

这是你可以遵循的指南如果您要使用Python进行更多的Web开发,并且不熟悉诸如虚拟环境之类的东西,则需要设置您的开发环境。

在编写代码之前,您需要安装一些依赖项:

  • 这个SendGrid Python librarY用于发送电子邮件
  • RQ调度器-构建在另一个工具之上的轻量级、优雅的解决方案,该工具具有较低的进入门槛,称为Redis队列。
  • 请求-用于发出HTTP请求

请确保创建并激活虚拟环境,然后使用以下命令安装这些环境:

pip install sendgrid rq-scheduler==0.11.0 requests==2.26.0

RQ和RedisPython模块将作为依赖关系安装RQScheduler。为了让RQ工作,您还需要安装Redis在你的机器上。可以使用以下命令执行以下操作:wget :

wget https://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6
make

使用命令在默认端口上的单独终端窗口中运行Redissrc/redis-server从安装它的目录。

进入国际空间站的位置

让我们首先编写代码,为给定的坐标集调用OpenNotificationAPI,并打印下一次ISS将沿着该纬度和经度飞行的时间。

创建一个名为iss.py(“国际空间站”模块)在您希望使用代码的目录中,并添加以下功能:

from datetime import datetime
import pytz

import requests

ISS_URL = 'http://api.open-notify.org/iss-pass.json'


def get_next_pass(lat, lon):
    location = { 'lat': lat, 'lon': lon }
    response = requests.get(ISS_URL, params=location).json()

    if 'response' in response:
        next_pass = response['response'][0]['risetime']
        next_pass_datetime = datetime.fromtimestamp(next_pass, tz=pytz.utc)
        print('Next pass for {}, {} is: {}'
              .format(lat, lon, next_pass_datetime))
        return next_pass_datetime
    else:
        print('No ISS flyby can be determined for {}, {}'.format(lat, lon))

这个get_next_pass函数在此代码中将向具有给定纬度和经度的OpenNotificationAPI发出请求,检查是否有有效的响应,然后将从API收到的时间戳转换为PythondateTime对象,并打印下一个ISS将在空中飞行的相应时间。

要测试这段代码,请打开Pythonshell并运行以下两行。在这个例子中,我们将使用旧金山的Twilio总部作为我们的测试位置(纬度:37.788052,经度:-122.391472):

from iss import get_next_pass
get_next_pass(37.788052, -122.391472)

你应该看到这样的东西:Next pass for 37.788052, -122.391472 is: 2021-12-09 23:58:11+00:00有一个合适的时间戳。

现在我们可以继续编写代码发送电子邮件了。

注册sendGrid并创建一个API密钥

创建SendGrid帐户,您可以为本教程选择免费层。一旦你有了账户,你就需要创建API密钥从这张截图中可以看到。您可以将它命名为您想要的任何名称,但是一旦创建了它,请确保在继续之前保存它!

保存此API键的一个好方法是将其设置为可以从Python代码中访问的环境变量,以避免在代码中直接编写它。设置SENDGRID_API_KEY环境变量是SendGrid帐户中的API密钥。不过,在其他地方做笔记也没什么坏处,因为你不能再看一遍了。这是一个如果需要帮助设置环境变量,请提供有用的教程。。稍后我们将使用这个API密钥。

用Python发送电子邮件

现在您有了SendGrid帐户和API密钥,您可以更新iss.py若要包含发送电子邮件的代码:

from datetime import datetime
import os
import pytz

import requests
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail


ISS_URL = 'http://api.open-notify.org/iss-pass.json'


def send_email(from_email, to_email, body):
    message = Mail(
        from_email=from_email,
        to_emails=to_email,
        subject='International Space Station passing by!',
        html_content=body)

    sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
    response = sg.send(message)
    print(response.status_code, response.body, response.headers)


def get_next_pass(lat, lon):
    location = { 'lat': lat, 'lon': lon }
    response = requests.get(ISS_URL, params=location).json()

    if 'response' in response:
        next_pass = response['response'][0]['risetime']
        next_pass_datetime = datetime.fromtimestamp(next_pass, tz=pytz.utc)
        print('Next pass for {}, {} is: {}'
              .format(lat, lon, next_pass_datetime))
        return next_pass_datetime
    else:
        print('No ISS flyby can be determined for {}, {}'.format(lat, lon))

请记住,在尝试运行此代码之前,要确保设置了SendGridAPI密钥环境变量。

请注意,在生产应用程序中,建议验证 发送者身份 通过完成 域认证 ...发件人身份代表您的“从”电子邮件地址-您的收件人视为您的电子邮件发件人的地址。有关此问题的一步一步的教程,请查看: 如何为Twilio SendGrid设置域认证 .

如果要测试此代码,请打开Pythonshell并运行以下代码,替换to_email与您自己的电子邮件地址的争论:

from iss import send_email
send_email('from_email@example.com', 'your_email@example.com', 'Look up!')

您应该收到一封电子邮件,告诉您在运行此代码后要查找。

用RQ调度器调度任务

现在我们有了一个为我们提供日期时间的函数,还有一个发送电子邮件的函数,我们可以使用RQScheduler。创建另一个名为schedule_notification.py,并向其添加以下代码:

from datetime import datetime

from redis import Redis
from rq_scheduler import Scheduler

import iss

scheduler = Scheduler(connection=Redis()) # Get a scheduler for the "default" queue

# Change these latitude and longitude values for any location you want.
next_pass = iss.get_next_pass(37.788052, -122.391472)

if next_pass:
    scheduler.enqueue_at(next_pass, iss.send_email,
                         'from_email@example.com', 'your_email@example.com',
                         'Look up! The ISS is flying above you!')

这只是一个快速的脚本,调用您编写的其他功能,一个是了解国际空间站何时经过您的位置下,另一个将向您发送电子邮件。在本例中,我使用了旧金山Twilio办公室的坐标,但您可以将纬度和经度更改为您所在的任何位置。

在能够运行此代码之前,必须确保在其他终端窗口或后台进程中运行Redis服务器、RQ工作者和RQ Scheduler进程。您应该已经通过使用命令运行Redis服务器了。src/redis-server从安装Redis的目录。再打开两个终端窗口,在这两个窗口中导航到代码所在的目录,并激活该项目的虚拟环境。在一个窗口中运行命令rqworker在另一个命令中运行命令rqscheduler .

这样做之后,您应该准备好运行代码来调度通知:

python schedule_notification.py

现在你要做的就是等..。

穿越时间

这很好,但是如果您不想等着看您的代码是否工作,这是可以理解的。如果你想即时满足,我们可以使用时间旅行的方法。在基于unix的系统上,可以使用日期命令。

如果空间站预定在2019年12月5日4:02飞过,那么你可以在linux上运行。date -s "12/05/2019 03:02:00"。在OSX上你会运行date 1205160219(您甚至可以使用-u参数如果要使用UTC时区,该时区对应于Python代码正在打印的日期时间)。如果所有这些都失败了,也有GUI选项来改变您的计算机在大多数操作系统上的时间。

在OSX上,您可以通过在系统首选项中打开“日期和时间”来设置(并重置)此选项。

如果您希望在ISS每次经过时而不是仅收到一次通知,则可以在每条消息之后安排另一次通知,方法是修改send_emailiss.py并添加适当的导入语句:

from redis import Redis
from rq_scheduler import Scheduler

scheduler = Scheduler(connection=Redis()) # Get a scheduler for the "default" queue


def send_email(from_email, to_email, body):
    message = Mail(
        from_email=from_email,
        to_emails=to_email,
        subject='International Space Station passing by!',
        html_content=body)

    sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
    response = sg.send(message)
    print(response.status_code, response.body, response.headers)
    scheduler.enqueue_at(next_pass, iss.send_email,
                         'from_email@example.com', 'your_email@example.com',
                         'Look up! The ISS is flying above you!')

无限与超越

现在您可以在国际空间站经过时接收电子邮件,您可以使用RQ Scheduler来满足所有Python调度需求。可能性是无限的。

原文
Https://www.twilio.com/blog/scheduling-international-space-station-emails-in-python-with-sendgrid-and-redis-queue

相关推荐

U盘文件被删怎么简单恢复(u盘里的文件被误删了怎么找回)

现在这个社会不是靠关系靠路子,主要还是靠实力。刘强在机关工作,人长得帅气,工作能力又强。唯独一样不好,脾气太大,动不动就发火,因为小事常和同事发生口角。一次他火大的差点把办公桌给掀翻了,领导见他野蛮的...

不小心删除了一些文件?9 个最佳免费硬盘恢复软件

恢复您曾经无意或意外删除的所有文件和数据。您是否曾经错误地删除了一个对您的工作至关重要并导致您丢失所有进度的文件?我们为您提供了一些最好的免费硬盘恢复软件,以帮助您恢复意外删除的文件,以解决您的文件删...

Studio 中文版:数据救援神器,误删 / 分区损坏 / RAID 恢复一键找回

Studio中文版:数据救援神器,误删/分区损坏/RAID恢复一键找回当文件意外删除、分区损坏,或RAID阵列崩溃时,一款可靠的数据恢复工具往往能挽回关键损失。R-Studio中文版...

你值得拥有的11款Linux数据恢复工具

如果你使用的是Linux操作系统,那么你一定想知道一旦硬盘崩溃的话又该如何保存和恢复数据。其实,现在有很多Linux数据恢复工具可以让我们摆脱数据安全的困扰。小编已经为各位准备好了一些最好的Linux...

误删文件内容怎么恢复(误删文件内容怎么恢复回来)

  在日常使用电脑的过程中,误删文件的情况时有发生。无论是由于操作失误还是病毒攻击,误删文件都会给我们带来不小的困扰。幸运的是,随着技术的发展,误删文件恢复已不再是难题。本文将介绍几款国内外知名的误删...

u盘如何恢复删除的文件?推荐5款u盘数据恢复软件!

在日常生活与工作中,U盘作为便捷的数据存储载体,频繁用于传输和保存各类重要文件。然而,误删文件的情况却时有发生,无论是珍贵的照片、重要的工作文档,还是精心制作的视频,一旦删除,都可能带来不小的麻烦。...

怎么恢复删除的数据?5种有效的数据恢复方法汇总!

在数字化办公与生活的时代,电脑里的每一份数据都承载着重要信息。然而,一个误操作就可能导致数据被删除,无论是尚未保存的重要文档,还是珍藏多年的照片,都可能瞬间“消失”。但其实,数据删除并不意味着永久丢...

u盘删除文件怎么找回?5个数据恢复工具汇总,助你巧妙恢复数据!

在日常使用U盘的过程中,误删文件的情况时有发生,重要的工作文档、珍贵的照片视频一旦消失,难免让人焦急万分。别担心,只要选对数据恢复工具,被删除的数据仍有找回的可能。下面就为你汇总5款实用的数据...

Linux下恢复误删文件:思路+实践(linux删除如何恢复)

周五篮球群里有人问误删文件了怎么恢复,得知是ext4文件系统之后我推荐了ext4magic这个工具,然后又有人提到了xfs的话怎么办,正好前几天看到DaveChinner在邮件列表里提到了这个问题,...

苹果放大招!不用虚拟机了,Mac直接跑Linux容器,开发者效率翻倍

苹果这次真给开发者送福利了!今天凌晨(6月10日),苹果在官宣的Containerization框架直接炸了技术圈——Mac现在能原生运行Linux容器镜像了!这可不是虚拟机那种“套娃”方案,而是基...

7 款老牌经典软件,值得收藏(经典老歌软件)

Calibrehttps://calibre-ebook.com/Calibre是一个电脑电子书管理软件。肯定有人说了,电子书还要管理?那当然了。它的功能更强大的让你想象不到,首先它可以导入PDF,...

神仙级的免费开源电子书阅读器,还支持听书功能

神仙级的免费开源电子书阅读器,还支持听书功能,极空间部署『KoodoReader』哈喽小伙伴们好,我是Stark-C~前段时间不是给大家分享的电子书管理工具『TaleBook』嘛~,然后就有粉丝私信...

如何在Ubuntu系统中重置root密码(ubuntu忘记密码重置root密码命令)

很多人有个问题,就是喜欢把密码设置得很长很复杂,结果谁也没防住,却成功防住了自己ヽ(.ˇдˇ;)ノ对于现代人,特别是年轻人,都有过忘记密码的经历吧。在这篇文章中,我们来了解如何在Ubuntu1...

5款功能强大的PDF阅读器,让PDF阅读更轻松

分享5款功能强大的PDF阅读器,拥有丰富的PDF阅读工具,支持PDF文档划线、笔记、标记等操作,让PDF阅读更轻松!1.嗨动PDF编辑器一款实用的PDF处理软件,不仅可以阅读PDF文档,还能直接编辑、...

上班摸鱼利器! 免费好用的电子书阅读器,NAS轻松部署Koodo Reader

哈喽,大家好我是生活爱好者。笔者也是一名小说爱好者,平时用手机用某信读书,会员也开了,在家看体验也不错,但是上班的时候,在工作快速完成之后,想摸个鱼用手机就不太方便啦,作为爱折腾的人,必须要工作认真,...