首页 > 解决方案 > 如何在 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)

标签: pythonpython-3.x

解决方案


您需要从 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()

推荐阅读