Mehrere E-Mails mit aktueller Uhrzeit verschicken.

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Gameniti
User
Beiträge: 6
Registriert: Montag 9. Januar 2017, 21:10

Ich habe ein kleines Problem. Vorab: Ich bin komplett neu hier im Forum. Falls ich also diesen Post in den falschen Bereich gepostet hab, sorry :oops: Ich habe nicht wirklich Erfahrung mit Python und das ist mein erstes "große" Projekt. Die meisten Stücke aus dem Code sind deshalb aus dem Internet, meist von Seiten mit genauerer Erklärung was die einzelnen Code Schnippsel tun.
Ich habe einen Raspberry Pi 3 mit Pi Face Digital 2 Modul.

Mein chaotisches Programm:
http://pastebin.com/p8rHGB4R

Habe versucht das Programm ordentlich zu halten, hat aber nicht ganz hingehauen. :lol:

Das Programm soll erstmal nur auf Knopfdruck eine E-Mail an die Empfänger versenden. In der E-Mail soll die aktuelle Uhrzeit, wann die E-Mail abgeschickt wurde, stehen. E-Mail per Knopfdruck zu verschicken funktioniert soweit, das einzige Problem was ich habe ist dass die Uhrzeit und das Datum von dann genommen wird wann ich das Programm gestartet habe.

Beispiel:
Ich starte das Programm um 20:10 Uhr und drücke um 20:20 Uhr auf den Knopf. Dann steht in der E-Mail 20:10 Uhr als Uhrzeit.

Wie könnte ich jetzt sogesagt "dauerhaft" das Datum und die Uhrzeit aktualisieren so dass wenn ich das Programm um 20:10 Uhr starte und erst um 20:20 Uhr auf den Knopf drücke 20:20 Uhr als Uhrzeit in der E-Mail steht?
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gameniti: von oben nach unten. Sternchenimporte sind schlecht, weil man nicht kontrollieren kann, was da importiert wird. Warum importierst Du überhaupt erst alles von time und dann nochmal sleep explizit? subprocess, socket und system werden nicht verwendet. Warum importierst Du sie dann?
Kommentare sollten nicht offensichtliches und nichts falsches Beschreiben. Zeile 44: Funktionen muß man auch aufrufen, nicht nur referenzieren. Die Klammern fehlen und so, wie sie da steht, bewirkt die Zeile nichts. Der Kommentar in Zeile 55 ist offensichtlich falsch. Die Kommentare in Zeile 67, 70 und 73 sind nur offensichtlich. Zeile 58 und anderswo: überall wo Du versuchst mit str etwas in einen String umzuwandeln, handelt es sich bereits um einen String. Diese ganzen Aufrufe sind alles unnötig. Statt Strings zusammenzustückeln, benutzt man auch Stringformatierung:

Code: Alles auswählen

Wert = """{nachricht}

Datum: {jetzt:%d.%m.%Y}
Uhrzeit: {jetzt:%H:%M} Uhr, {jetzt:%S} Sekunden
Zeitzone: {jetzt: %Z}
-----

Automatische Nachricht, bitte nicht antworten{argumente} """.format(
    nachricht=Nachricht,
    datum=datetime.datetime.now(),
    argumente=" ".join(sys.argv[1:]),
)
Zeile 61: eine for-Schleife über den Index einer Liste ist unnötig kompliziert, weil man gleich über die Elemente direkt iterieren kann. Zeile 94: warum benennst Du pifacedigitalio nicht schon beim importieren um, dort würde man so etwas erwarten. Zeile 98: was willst Du damit bezwecken? Zeile 107: while ist keine Funktion, die Klammern gehören weg. Zeile 108: der Wert wird nirgends verwendet. Zeile 117: Du prüfst ja nicht wirklich, ob die Mail versendet wurde, diese Ausgabe und 3s Wartezeit sind ja nur Fassade.

Wenn Du am Anfang des Programms die Zeit einliest, warum erwartest Du, dass der Mailtext, denn Du auch am Anfang generierst auf magische Weise sich nochmal anpaßt?
Gameniti
User
Beiträge: 6
Registriert: Montag 9. Januar 2017, 21:10

@Sirius3: Wie geschrieben habe ich nicht viel Erfahrung mit Python und das ist mein erstes "großes" Projekt. Wie auch geschrieben sind die meisten Stücke vom Code aus dem Internet.
- Sternchenimporte sind schlecht, ok versteh ich jetzt.
- Importe die nicht verwendet werden wurden dann in einer früheren Version des Programmes benutzt und da ich nicht genau weiß welche import was bewirken habe ich einfach alle von denen ich mir nicht sicher war drin gelassen.
- Kommentare die sowas offensichtliches zeigen wie in Zeile 67, 70 und 73 könnte man weglassen, ja.
- "Zeile 44: Funktionen muß man auch aufrufen, nicht nur referenzieren. [...]" Wie oben geschrieben sind Stücke des Codes aus dem Internet. Irgendwo musste man ja anfangen und das war eines der ersten Teile aus dem Programm die ich so stumpf aus dem Internet abgeschrieben habe. Hat funktioniert und tut es immernoch also war mir nicht bewusst dass dieser Teil falsch/unnötig ist.
- Der Kommentar aus Zeile 55 ist mir falsch zuzuschreiben, statt "später" steht im eigentlich Programm und in der E-Mail ausgabe nämlich später. Trotz utf-8 coding
- Bei den Strings hab ich jemand anderen um Hilfe gefragt weil ich schwierigkeiten mit dem Zeilenumbruch hatte. Sehe jetzt aber auch das manche strings überflüssig sind.
- Zeile 61 ist wie Zeile 44 (s.o) und gehörte zum selben Programm
- Zeile 94 hab gelesen dass das funktioniert, habs ausprobiert und hat bei dem Versuch nicht geklappt. Also hab ich es weggelassen und es so wie hier gemacht.
- Zeile 108, der Wert wird nirgends danach verwendet. Aber vorher in Zeile 58. Gehört zu einem Versuch mein eigentliches Problem mit dem Datum und der Uhrzeit zu lösen.
- 116 bis 118 ist nur um irgendeinen 'schönen' Output (außer die LEDs) zu haben.
- "Wenn Du am Anfang des Programms die Zeit einliest, warum erwartest Du, dass der Mailtext, denn Du auch am Anfang generierst auf magische Weise sich nochmal anpaßt?" Ich als Anfänger dachte es funktioniert wie im Python Idle Fenster (oder Kommandozeile wie auch immer man das nennt):
x=3
y=3
x+y = 6
x=4
x+y = 7

Gehört, wenn ich mich richtig erinnere, auch zu einem der Versuche mein eigentliches Problem zu lösen. Auch wenn ich durch deinen Kommentar jetzt weiß was ich verbessern kann und wie ich meinen Code ein bisschen aufräumen kann hab ich leider immernoch keine Idee zu meinem eigentlichen Problem dass sich das Datum und die Uhrzeit nicht "aktualisiert".
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gameniti: Dein Beispiel mit x und y zeigt ja genau, wie es geht und wie nicht.

Code: Alles auswählen

In [1]: x = 4

In [2]: y = 2

In [3]: z = x + y

In [4]: z
Out[4]: 6

In [5]: x = 3

In [6]: z
Out[6]: 6
Gameniti
User
Beiträge: 6
Registriert: Montag 9. Januar 2017, 21:10

@Sirius3: Hatte ich schonmal probiert, hab es gerade nocheinmal getan. Ich weiß nicht ob ich es an der falschen Stelle mache oder ob ich es generell falsch "aktualisiere" aber es klappt nicht.
Hab mit der Schleife ganz unten das hier gemacht:

Code: Alles auswählen

while(True):
	Date
	lt
	Datum
	Uhrzeit
	Zeitzone
	Wert = str(Nachricht) + str("\n") + str("\n") + str(Datum) + str("\n") + str(Uhrzeit) +str("\n") + str(Zeitzone) + str("\n") + str("-----") + str("\n") + str("\n") + str('Automatische Nachricht, bitte nicht antworten')

        if pfd.digital_read(1):
                # E-Mail abschicken

                pfd.digital_write(7, 1) # Lampe anschalten
                pfd.digital_write(0, 1) # Lampe anschalten
                smtpserver.sendmail(Absender, [Empfaenger], msg.as_string())
                print("E-Mail versenden...")
                #smtpserver.quit()
                sleep(3)
                print("E-Mail versendet!\n")
                pfd.digital_write(0, 0) # Lampe ausschalten
                sleep(2)
                pfd.digital_write(7, 0) # Lampe ausschalten
Hab auch noch nichts verbessert sondern nur weiter rumprobiert.
Zuletzt geändert von Anonymous am Donnerstag 12. Januar 2017, 00:17, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Gameniti: Programmieren funktioniert so nicht, durch raten und rumprobieren. Du musst schon die Programmiersprache lernen. Und zwar ganz allgemein und grundlegend. In der Python-Dokumentation gibt es beispielsweise ein Tutorial.
Antworten