Zeitproblem nach Import

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
oiskipoiski
User
Beiträge: 5
Registriert: Dienstag 25. Mai 2021, 07:58

Hallo,
ich habe diese Mailfunktion:

Code: Alles auswählen

#!/usr/bin/env python3


import datetime
import smtplib, sys, time
from email.mime.text import MIMEText
from email.header import Header
now = datetime.datetime.now()
zeit = now.strftime('%d.%m.%Y, %H:%M:%S')
frm = "ich@gmail.com"
to = "ich@gmail.com"
smtpHost = "smtp.gmail.com"
smtpPort = 465
smtpUser = "ich@gmail.com"
smtpPassword = "SuperGeheimesPasswort"
subj = "Falsche Karte an Tür"
text = "Es wurde ein falscher Code an der Tür verwendet. "
msg = f"{text} {zeit} Uhr."
mime = MIMEText(msg, "plain", "utf-8")
mime["from"] = frm
mime["to"] = to
mime["Subject"] = Header(subj, "utf-8")

def mailversand():
    try:
        with smtplib.SMTP_SSL(smtpHost, smtpPort) as smtp:
            smtp.login(smtpUser, smtpPassword)
            smtp.sendmail(frm, to, mime.as_string())
    except smtplib.SMTPServerDisconnected:
        print("Server hat Verbindung abgebrochen")
    else:
        print("Mail verschickt")

__name__=="__main__"
ich importiere die Funktion in einem anderen Script. Als Beispiel habe ich dieses hier:

Code: Alles auswählen

#!/usr/bin/env python3

from mailtome import mailversand
from time import sleep

mailversand()
sleep(120)
mailversand()

Mein Problem ist das beide Mails die gleiche Zeit im Text stehen haben, nämlich die, als mailversand importiert wurde.

Wie bekomme ich die tatsächliche Zeit für die jeweilige Mail?
Benutzeravatar
Dennis89
User
Beiträge: 1124
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

in dem du die Zeit nicht auf Modulebene definierst, sondern in der Funktion die aufgerufen wird.
Beispiel:

Code: Alles auswählen

from datetime import datetime

def show_time():
    now = datetime.now().strftime('%d.%m.%Y, %H:%M:%S')
    print(now)

Code: Alles auswählen

from time_test import show_time
from time import sleep

def main():
    show_time()
    sleep(2)
    show_time()
    
    
if __name__ == '__main__':
    main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@oiskipoiski,

Diese Zeile

Code: Alles auswählen

zeit = now.strftime('%d.%m.%Y, %H:%M:%S')
wird genau einmal ausgeführt, nämlich wenn die Funktion 'mailversand' importiert wird.

Daher solltest du die Zeit vor jedem Aufruf der Funktion 'mailversand' holen und dann an die Funktion übergeben, oder alternativ kann das auch in der Funktion passieren.
Für mehr Flexibilität würde ich alle Daten, die die Email braucht, an die Funktion übergeben.

Die Zeile:

Code: Alles auswählen

__name__=="__main__"
macht keinen Sinn.

Zum Beispiel: (hab's nicht getestet)

Code: Alles auswählen

#!/usr/bin/env python3
from mailtome import mailversand
from time import sleep


def main():
    frm = "ich@gmail.com"
    to = "ich@gmail.com"
    subj = "Falsche Karte an Tür"
    text = "Es wurde ein falscher Code an der Tür verwendet. "

    mailversand(frm, to, subj, text)
    sleep(120)
    mailversand(frm, to, subj, text)


if __name__ == "__main__":
    main()
und

Code: Alles auswählen

#!/usr/bin/env python3
import datetime
import smtplib, sys, time
from email.mime.text import MIMEText
from email.header import Header


def mailversand(frm, to, subj, text):
    now = datetime.datetime.now()
    current_time = now.strftime("%d.%m.%Y, %H:%M:%S")
    smtpHost = "smtp.gmail.com"
    smtpPort = 465
    smtpUser = "ich@gmail.com"
    smtpPassword = "SuperGeheimesPasswort"
    msg = f"{text} {current_time} Uhr."
    mime = MIMEText(msg, "plain", "utf-8")
    mime["from"] = frm
    mime["to"] = to
    mime["Subject"] = Header(subj, "utf-8")

    try:
        with smtplib.SMTP_SSL(smtpHost, smtpPort) as smtp:
            smtp.login(smtpUser, smtpPassword)
            smtp.sendmail(frm, to, mime.as_string())
    except smtplib.SMTPServerDisconnected:
        print("Server hat Verbindung abgebrochen")
    else:
        print("Mail verschickt")
oiskipoiski
User
Beiträge: 5
Registriert: Dienstag 25. Mai 2021, 07:58

@Dennis89 @rogerb

Danke euch beiden für die schnelle Antwort.
Dennis für die Erklärung, das Beispiel war super, ich denke ich habs verstanden.
Rogerb, aus deinem letzten Codebeispiel habe ich mir mein neues Mailscript zusammengebastelt. Funktioniert einwandfrei.

Das ging ja schnell. Problem gelöst!
Antworten