simplemail - Attribute Email unbekannt...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ts352k17
User
Beiträge: 2
Registriert: Freitag 20. Juli 2018, 13:32

Hallo Leute,

ich versuche gerade eine automatisch generierte E-Mail beim erstellen von JPG-Daten zu versenden. Dazu benutze ich das Modul "simplemail".
Leider erhalte ich folgende Fehlermeldung, mit der ich nichts anfangen kann:

Code: Alles auswählen

Traceback (most recent call last):
  File "MyWatch.py", line 8, in <module>
    myemail = simplemail.Email(
AttributeError: 'module' object has no attribute 'Email'
der Code selbst sie wie folgt aus:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import pyinotify
import time
import simplemail

myemail = simplemail.Email(
    smtp_server = "smtp.gmail.com", 
    smtp_user = "ts***@gmail.com", 
    smtp_password = "***"
    )

wm = pyinotify.WatchManager()  # Watch Manager
mask = pyinotify.IN_CREATE  # watched events

def PrepareMail(myattach):
    myemail.from_address = "ts***@gmail.com"
    myemail.from_caption = "From Caption?!"
    # Empfaenger
    myemail.recipients.add("ts***@gmail.com", "Thomas S.")
    # Betreff
    myemail.subject = "Motiontracking - ALERT - ",  time.strftime("%d,%m,%y %H:%M:%S")
    # Nachricht
    myemail.message = \
        "Das ist eine automatische E-Mail von Raspberry Pi 3 B\n" + \
        "\n" + \
        "Ein Ereignis der Webcam wurde ausgelöst.\n" + \
        "Das entsprechende Bild ist im Anhang beigefügt.\n" + \
        "\n" + \
        "\n" + \
        "\n" + \
        "" 
    # Anhaenge
    myemail.attachments.add_filename(myattach)
    
class EventHandler(pyinotify.ProcessEvent):
    def process_IN_CREATE(self, event):
        print ("Creating:", event.pathname)
        if os.path.splitext(event.pathname)[1] == '.jpg':
            print("JPG gefunden")
            PrepareMail(event.pathname)
            if myemail.send():
                print ("E-Mail wurde gesendet")
            else:
                print ("E-Mail konnte nicht gesendet werden")

handler = EventHandler()
notifier = pyinotify.Notifier(wm, handler)
wdd = wm.add_watch('/home/thomas', mask, rec=True)

notifier.loop()
Recherchen bei Google und Co. brachten mich als Anfänger leider auch nicht sonderbar weiter... Das Modul - also den Hinweis habe ich hier aus dem Forum und das Modul selbst hier gedownloaded: https://pypi.org/project/python-simplemail
Auf was deutet diese Fehlermeldung hin???
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ts352k17: Das deutet darauf hin das Du irgendwo eine `simplemail.py` herum liegen hast die kein `Email` definiert. Gib gleich nach dem ``import`` mal das Modul aus (``print simplemail``) und schau Dir den Pfad an und dann was das ist was da zu finden ist.

`myemail` sollte an sich schon mal nicht auf Modulebene global existieren weil globale Variablen Programme unübersichtlich und fehleranfällig machen. Insbesondere funktioniert das so aber auch nicht, weil die einmal erstellte E-Mail bei jedem Aufruf von `PrepareMail()` erweitert wird. Man muss da für jede Mail ein neues Objekt erstellen.

Bezüglich der Namensschreibweise solltest Du mal einen Blick in den Style Guide for Python Code werfen.

Die Klammern gehören bei den ``print``-Anweisungen da nicht hin. Insbesondere beim ersten ``print`` in `process_IN_CREATE()` wird das auch in der Ausgabe auffallen, die nicht das sein dürfte was an der Stelle wohl gewollt war. Also entweder weg mit den Klammern, oder oben ein ``from __future__ import print_function`` einfügen, damit ``print`` tatsächlich eine Funktion ist. Dann gehört zwischen ``print`` und der öffnenden Klammer kein Leerzeichen.

Dieses komische `My`/`my` vor den Namen bringt übrigens keinerlei Informationsgewinn. Das `myattach` ein Dateiname ist, ist auch nur sehr schwer am Namen zu erraten. Auf der anderen Seite gibt es Kommentare die sehr offensichtliches aussagen. Kommentare sollten nicht beschreiben *was* gemacht wird, denn da steht da ja bereits im Code, sondern *warum* der Code das macht was er macht. Sofern das nicht offensichtlich ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ts352k17
User
Beiträge: 2
Registriert: Freitag 20. Juli 2018, 13:32

Hallo __blackjack__,

vielen Dank nicht nur für den simplen Lösungsvorschlag, sondern auch für den "Rundumblick" über den Code. Ich werde deine Vorschläge, speziell was den Code-Style betrifft beherzigen.

Dein Lösungsvorschlag brachte mich zu einigen Dateien (__init__.pyc und handlers.pyc), welche ( - die *.py - Pendants) allerdings keine Felder "EMail" zumindest für mich sichtbar definieren.

Von daher - und aus Mangel an Erfahrungen in Python - werde ich mich nach einer anderen Lösung umschauen. Dennoch vielen Dank für deine Denkanstöße!

MfG Thomas
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich würde sagen Du hast das falsche `simplemail` installiert. Nicht das was Du im ersten Beitrag verlinkt hast, sondern das hier: https://pypi.org/project/simplemail/
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten