首页 > 解决方案 > smtplib 不必要地重复发送

问题描述

我正在运行一个脚本,它将获取电子邮件(imaplib)并使用 smtplib 将警报发送回我的个人电子邮件。我在我的树莓派 24/7 上运行它,所以当我不在家时,我想检查程序是否仍然运行良好。

以下是功能:

def get_alert():
    global subject

    user = alert_email
    password = alert_email_password
    mail = imaplib.IMAP4_SSL('imap.gmail.com')
    mail.login(user, password)
    mail.list()
    mail.select('inbox')
    result, data = mail.uid('search', None, 'UNSEEN')
    i = len(data[0].split())

    for x in range(i):
        latest_email_uid = data[0].split()[x]
        result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)')
        raw_email = email_data[0][1]
        raw_email_string = raw_email.decode('utf-8')
        email_message = email.message_from_string(raw_email_string)
        subject = str(email.header.make_header(email.header.decode_header(email_message['Subject'])))
        print(subject)
        return subject

    mail.logout()


def send_alert(subj, msg):

    server = smtplib.SMTP('smtp.gmail.com:587')
    server.ehlo()
    server.starttls()
    server.login(alert_email, alert_email_password)
    message = 'Subject: {}\n\n{}'.format(subj, msg)
    server.sendmail(from_addr=alert_email, to_addrs=personal_email, msg=message)
    server.quit()

这是循环:

while True:

    get_alert()

    if subject == 'check':       # check that program is still running

        send_alert(subj='still running', msg='still running')

    if subject == ...

因此,它会完美地收到“检查”电子邮件,并且只打印一次。然而,每个循环每次运行时都会向我发送“仍在运行”,尽管电子邮件被标记为已读并且没有更多未读电子邮件。如果没有未读邮件,主题不应该是 None 吗?我尝试手动将主题设置为无,并在返回主题后将所有电子邮件标记为已读。不知道发生了什么,如果您能帮助我,我将不胜感激。这让我整天发疯:/

标签: pythonsmtplibimaplib

解决方案


推荐阅读