python - 如何在 smtp 消息正文中添加功能并每 12 小时发送一次?
问题描述
我正在尝试创建一个脚本来检查 YouTube 视频是否仍然在线,并且每 12 小时向我发送一封包含状态的电子邮件。
我想出了 3 段代码,但现在我很难正确“混合”它们。因此,我将尝试解释我面临的问题:
这是代码的第一部分,它做得很好(感谢@KetZoomer帮助我):
import requests
def out_of_air():
videos = {"id1": None, "id2": None, "id3": None, "id4": None}
for i in videos:
id_of_video = i
your_api_key = 'myapi'
url = 'https://www.googleapis.com/youtube/v3/videos?id={}&key={}&part=status'.format(id_of_video, your_api_key)
url_get = requests.get(url)
pprint(url_get.json())
videos[i] = url_get.json()
for video in videos:
if videos[video]["pageInfo"]["resultsPerPage"] == 0:
print(f"https://www.youtube.com/watch?v={video} is offline")
else:
print(f"https://www.youtube.com/watch?v={video} is online")
然后我希望将print
部分嵌入到电子邮件中,所以我尝试了这个,希望我在屏幕上看到的内容最终出现在电子邮件中:
import smtplib
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
smtp.login('MYADDRESS', 'PASSWORD')
subject = 'Online or not'
body = out_of_air()
msg = f'Subject: {subject}\n\n{body}'
smtp.sendmail('MYADDRESS', 'OTHERADDRESS', msg)
当我想要打印结果时,我收到了电子邮件,但正文显示为“无”。
除此之外,我无法将电子邮件代码放在另一个函数中以运行以下代码:
import schedule
import time
schedule.every(12).hours.do(send_email)
while 1:
schedule.run_pending()
time.sleep(1)
解决方案
您需要从 from 中返回out_of_air()
要放入电子邮件正文的值。这应该使用缓冲区来完成,因为您正在print
循环中。
from io import StringIO
import requests
def out_of_air():
videos = {"id1": None, "id2": None, "id3": None, "id4": None}
buf = StringIO()
for i in videos:
id_of_video = i
your_api_key = 'myapi'
url = 'https://www.googleapis.com/youtube/v3/videos?id={}&key={}&part=status'.format(id_of_video, your_api_key)
url_get = requests.get(url)
pprint(url_get.json())
videos[i] = url_get.json()
for video in videos:
if videos[video]["pageInfo"]["resultsPerPage"] == 0:
buf.write(f"https://www.youtube.com/watch?v={video} is offline\n")
else:
buf.write(f"https://www.youtube.com/watch?v={video} is online\n")
buf.seek(0)
return buf.read()
推荐阅读
- html - 使第二行文本在第一行文本下对齐
- django - Django - 我正在尝试将用户对象添加到 ManyToManyField,但它不断添加所有用户对象
- amazon-web-services - Kinesis 视频流 - 多个生产者
- swift - Swift - AES base64 + md5 解密
- codenameone - 如何将多个容器绑定在一起?
- javascript - 如何克隆网页及其 css 元素和脚本?
- node.js - 如何通过不同的api使用socket io连接服务器和客户端?
- javascript - Discord.js Avatar 命令无法提及用户
- apache-spark - 使用聚合函数时出现火花数据框错误
- javascript - 如何使用 Python 从 javascript 网页中抓取 HTML