用SendGrid和Redis队列用Python调度国际空间站的电子邮件
mhr18 2025-05-27 15:58 12 浏览 0 评论
有一些很酷的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_email在iss.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
相关推荐
- 一文读懂Prometheus架构监控(prometheus监控哪些指标)
-
介绍Prometheus是一个系统监控和警报工具包。它是用Go编写的,由Soundcloud构建,并于2016年作为继Kubernetes之后的第二个托管项目加入云原生计算基金会(C...
- Spring Boot 3.x 新特性详解:从基础到高级实战
-
1.SpringBoot3.x简介与核心特性1.1SpringBoot3.x新特性概览SpringBoot3.x是建立在SpringFramework6.0基础上的重大版...
- 「技术分享」猪八戒基于Quartz分布式调度平台实践
-
点击原文:【技术分享】猪八戒基于Quartz分布式调度平台实践点击关注“八戒技术团队”,阅读更多技术干货1.背景介绍1.1业务场景调度任务是我们日常开发中非常经典的一个场景,我们时常会需要用到一些不...
- 14. 常用框架与工具(使用的框架)
-
本章深入解析Go生态中的核心开发框架与工具链,结合性能调优与工程化实践,提供高效开发方案。14.1Web框架(Gin,Echo)14.1.1Gin高性能实践//中间件链优化router:=...
- SpringBoot整合MyBatis-Plus:从入门到精通
-
一、MyBatis-Plus基础介绍1.1MyBatis-Plus核心概念MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提...
- Seata源码—5.全局事务的创建与返回处理
-
大纲1.Seata开启分布式事务的流程总结2.Seata生成全局事务ID的雪花算法源码3.生成xid以及对全局事务会话进行持久化的源码4.全局事务会话数据持久化的实现源码5.SeataServer创...
- Java开发200+个学习知识路线-史上最全(框架篇)
-
1.Spring框架深入SpringIOC容器:BeanFactory与ApplicationContextBean生命周期:实例化、属性填充、初始化、销毁依赖注入方式:构造器注入、Setter注...
- OpenResty 入门指南:从基础到动态路由实战
-
一、引言1.1OpenResty简介OpenResty是一款基于Nginx的高性能Web平台,通过集成Lua脚本和丰富的模块,将Nginx从静态反向代理转变为可动态编程的应用平台...
- 你还在为 Spring Boot3 分布式锁实现发愁?一文教你轻松搞定!
-
作为互联网大厂后端开发人员,在项目开发过程中,你有没有遇到过这样的问题:多个服务实例同时访问共享资源,导致数据不一致、业务逻辑混乱?没错,这就是分布式环境下常见的并发问题,而分布式锁就是解决这类问题的...
- 近2万字详解JAVA NIO2文件操作,过瘾
-
原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。从classpath中读取过文件的人,都知道需要写一些读取流的方法,很是繁琐。最近使用IDEA在打出.这个符号的时候,一行代...
- 学习MVC之租房网站(十二)-缓存和静态页面
-
在上一篇<学习MVC之租房网站(十一)-定时任务和云存储>学习了Quartz的使用、发邮件,并将通过UEditor上传的图片保存到云存储。在项目的最后,再学习优化网站性能的一些技术:缓存和...
- Linux系统下运行c++程序(linux怎么运行c++文件)
-
引言为什么要在Linux下写程序?需要更多关于Linux下c++开发的资料请后台私信【架构】获取分享资料包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdf...
- 2022正确的java学习顺序(文末送java福利)
-
对于刚学习java的人来说,可能最大的问题是不知道学习方向,每天学了什么第二天就忘了,而课堂的讲解也是很片面的。今天我结合我的学习路线为大家讲解下最基础的学习路线,真心希望能帮到迷茫的小伙伴。(有很多...
- 一个 3 年 Java 程序员 5 家大厂的面试总结(已拿Offer)
-
前言15年毕业到现在也近三年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中...最终有幸去了网易。但是要...
- 多商户商城系统开发全流程解析(多商户商城源码免费下载)
-
在数字化商业浪潮中,多商户商城系统成为众多企业拓展电商业务的关键选择。这类系统允许众多商家在同一平台销售商品,不仅丰富了商品种类,还为消费者带来更多样的购物体验。不过,开发一个多商户商城系统是个复杂的...
你 发表评论:
欢迎- 一周热门
-
-
Redis客户端 Jedis 与 Lettuce
-
高并发架构系列:Redis并发竞争key的解决方案详解
-
redis如何防止并发(redis如何防止高并发)
-
开源推荐:如何实现的一个高性能 Redis 服务器
-
redis安装与调优部署文档(WinServer)
-
Redis 入门 - 安装最全讲解(Windows、Linux、Docker)
-
一文带你了解 Redis 的发布与订阅的底层原理
-
Redis如何应对并发访问(redis控制并发量)
-
oracle数据库查询Sql语句是否使用索引及常见的索引失效的情况
-
Java SE Development Kit 8u441下载地址【windows版本】
-
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)