Modul zum Senden von Emails (simplemail.py)

Code-Stücke können hier veröffentlicht werden.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Der Fehler wurde ausgebessert. --> Man kann sich jetzt mit Benutzername und Passwort am SMTP-Server anmelden.

Die Tests werden jetzt nicht mehr automatisch ausgeführt, wenn man das Modul ausführt. Das passiert jetzt nur mehr, wenn man als Parameter "test" übergibt.

Ich plane auch, das Modul in nächster Zeit so zu erweitern, dass man es direkt über die Kommandozeile aufrufen und die Emailadresse, usw. als Parameter übergeben kann.

Ebenfalls ist ein Skript geplant, das Emails, mit einem vorgegebenen Betreff, von einem POP-Server abholt, in einen Ordner speichert und daraufhin ein Programm aufruft, dem der Speicherort der Emails übergeben wird. Eventuell wird es ja auch andersrum. --> Alle Emails abholen und je nach Text im Betreff ein anderes Programm aufrufen. Das werde ich heute oder morgen entscheiden.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

gerold hat geschrieben: Ich plane auch, das Modul in nächster Zeit so zu erweitern, dass man es direkt über die Kommandozeile aufrufen und die Emailadresse, usw. als Parameter übergeben kann.

Ebenfalls ist ein Skript geplant, das Emails, mit einem vorgegebenen Betreff, von einem POP-Server abholt, in einen Ordner speichert und daraufhin ein Programm aufruft, dem der Speicherort der Emails übergeben wird. Eventuell wird es ja auch andersrum. --> Alle Emails abholen und je nach Text im Betreff ein anderes Programm aufrufen.
Hi!

Es sieht derzeit recht schlecht mit meiner Zeit aus. Wird wohl noch ein paar Monate dauern, bis ich dazu komme. :cry:

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi @ all!

* 2005-12-10 Gerold
* - Schlampigkeitsfehler ausgebessert. Es wurde ein Fehler gemeldet, wenn
* man beim Initialisieren der Klasse Email auch den Dateinamen eines
* Attachments übergeben hatte. Es war ein Unterstrich zu viel, der
* Entfernt wurde.

Der Code wurde ausgebessert.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

gerold hat geschrieben: Ebenfalls ist ein Skript geplant, das Emails, mit einem vorgegebenen Betreff, von einem POP-Server abholt, in einen Ordner speichert und daraufhin ein Programm aufruft, dem der Speicherort der Emails übergeben wird. Eventuell wird es ja auch andersrum. --> Alle Emails abholen und je nach Text im Betreff ein anderes Programm aufrufen.
Hi @ all!

Falls ein Programm gesucht wird, mit dem man Emails von einem POP3- oder IMAP-Server abholen kann, dann sollte man sich unbedingt auch **getmail** ansehen. http://pyropus.ca/software/getmail/
Es können auch Regeln definiert werden, die bestimmen, wohin und wie die Email gespeichert werden soll. Ebenfalls kann ein Filter eine Email an ein externes Programm weiterreichen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pascalsv
User
Beiträge: 16
Registriert: Samstag 7. Januar 2006, 15:45

Hallo Gerold,

beindruckendes Modul!! Ich würde aber gerne wissen, für was diese Slots gut sind:

Code: Alles auswählen

class Email(object):
    __slots__ = (
...
Ist es damit möglich, zur Initialisierung schon die entsprechenden Parameter mitzugeben? Wie liest man diese Slots aus? Ich würde dann nämlich in der Send-Methode diese Slots auslesen und einsetzen...

Gruß,

Pascal
Life is short - don't buy green bananas...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

pascalsv hat geschrieben:Ich würde aber gerne wissen, für was diese Slots gut sind:
Zur Speicheroptimierung, s. http://pythonwiki.pocoo.org/Allgemeine_Begriffe

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Pascal!
pascalsv hat geschrieben:beindruckendes Modul!!
Danke! Ich habe aber gerade eben bemerkt, dass nur 10 kB des Modules angezeigt wurden. Deshalb habe ich soeben den Codehighlighter dieses Forums so umgestellt, dass man jetzt den kompletten Code sieht.
pascalsv hat geschrieben:Ich würde aber gerne wissen, für was diese Slots gut sind
[...]
Ist es damit möglich, zur Initialisierung schon die entsprechenden Parameter mitzugeben?
Das war mein erster Versuch mit den New-Style-Klassen von Python zu arbeiten. Ein Feature dieser Klassen ist, dass man die Namen der Variablen, die an die Klasseninstanz gebunden werden können, bekannt geben kann. Python warnt einen dann, wenn man im Code eine Instanzvariable verwendet, die noch nicht definiert wurde und Speicher wird auch gespart, da dadurch die Instanzvariablen anders verwaltet werden.

Da ich das von Visual Basic her gewohnt war, dachte ich, das ist keine schlechte Idee und verwendete es. In der Zwischenzeit bin ich zum Schluss gekommen, dass es nur Zeitverschwendung ist. Ich habe dadurch mehr Aufwand beim Programmieren und schränke die Möglichkeiten einer Klasse mehr ein als notwendig ist. Die Verwendung von __slots__ hat, in meinen Augen, nur dann einen Vorteil, wenn ich die Klasse optimieren muss.

Würde ich heute das Modul neu schreiben, würde ich keine Slots mehr verwenden, da es sich ja nicht um eine Klasse handelt, die hochoptimiert mehrmals aufgerufen wird. Es war ein Versuch und es schadet ja auch niemandem.

Der Effekt, dass man schon beim Erzeugen der Klasse Daten übergeben kann, kommt alleine von der Methode __init__(). Diese Methode wird beim Instanzieren der Klasse aufgerufen. Ich habe das Modul so programmiert, dass es dem, der das Modul verwendet, überlassen wird, ob die Daten schon beim Instanzieren oder später übergeben werden.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Neues Feature:
Es wurden neue Klassen fuer CC-Empfaenger (Carbon Copy) und BCC-Empfaenger (Blind Carbon Copy) hinzugefuegt. Ab jetzt können Emails auch an CC und BCC gesendet werden. Wie das funktioniert sieht man in der Funktion ``testen()``

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Reply-to (Antwort an) kann jetzt auch angegeben werden.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
resi
User
Beiträge: 2
Registriert: Sonntag 28. Mai 2006, 11:32

Servus Gerold

simplemail ist ein tolles Tool, die Dokumentation ist ausserdem vorbildlich.
Was m.E. fehlt, ist ein Header für das Datum, das kann nämlich den Spam-
Core negativ beeinflußen.

Das könnte dann etwa so implementiert werden:

from email.Utils import formatdate

und in send():
...
msg['Date'] = formatdate(time.time())

Desweiteren stellt sich die Frage, ob du nicht auch/stattdessen einen generischen
Header-Eintrag zulässt, also:

email = Email(......)
email.add_header('X-YZ', 'Wert')
email.send()

Gruß,
Karl.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

resi hat geschrieben:simplemail ist ein tolles Tool, die Dokumentation ist ausserdem vorbildlich. Was m.E. fehlt, ist ein Header für das Datum, das kann nämlich den Spam-
Core negativ beeinflußen.
Hi Karl!

Danke für dein Lob und deinen Hinweis. Was den Datums-Header betrifft, habe ich ihn damals sogar absichtlich weg gelassen, da bei meinen Tests der SMTP-Server das Datum automatisch hinzugefügt hat. (getestet mit Postfix) Mir ist es lieber, wenn der Server den Zeitstempel aufdrückt, da die Uhrzeit bei Servern -- glaube ich -- nicht so oft falsch geht wie bei den Clients.

Falls das allerdings andere SMTP-Server **nicht** automatisch machen, dann werde ich das Datum wohl doch dazu tun müssen.

@All: Was ich jetzt brauche, ist eine Antwort auf die Frage: "Gibt es SMTP-Server, die das Datum nicht automatisch hinzufügen?"
Wenn Ja, welche?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
resi
User
Beiträge: 2
Registriert: Sonntag 28. Mai 2006, 11:32

Hi Gerold,

Bei mir hat der SMTP Server (exim4) es nicht automatisch hinzugefügt.
Möglicherweise könnte man den exim4 dahingehend konfigurieren, aber
wenn's dein Modul _auch_ kann, ist es ja kein Schaden :-)

Oder wie gesagt, _beliebige_ weitere Header vom User dazufügen zu lassen.

Gruß,
Karl.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

resi hat geschrieben:Bei mir hat der SMTP Server (exim4) es nicht automatisch hinzugefügt.
Hi Karl!

Ich wusst schon immer, warum ich bei Debian-Installationen Exim sofort durch Postfix ersetzt habe. :-)

Da Exim leider durch die Verwendung in Debian ziemlich oft eingesetzt wird, bleibt mir nichts anderes übrig. Ich werde also das Datum als Header in simplemail einbauen.

Noch einmal vielen Dank für deinen Hinweis.

mfg
Gerold
:-)
Zuletzt geändert von gerold am Sonntag 28. Mai 2006, 19:04, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Änderungen:

* 2006-05-28 Gerold
* - Wortlaut des Headers "User-Agent" geändert.
* - Da nicht jeder SMTP-Server das Datum automatisch zum Header hinzufügt,
* wird ab jetzt das Datum beim Senden hinzugefügt.
* (Karl, danke für den wichtigen Hinweis.)

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@gerold: hast du keinen SVN Server auf dem du das Skript hinterlegen kannst??? Dann könnte ich es einfach mit svn-externals einbinden ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:@gerold: hast du keinen SVN Server auf dem du das Skript hinterlegen kannst??? Dann könnte ich es einfach mit svn-externals einbinden ;)
Hi Jens!

Noch nicht, aber ich arbeite daran. Wahrscheinlich richte ich auf einem unserer Firmen-Internetserver ein Trac für solche Skripte ein.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ist die Version im ersten Post die aktuelle?

Ist zwar nicht so wichtig, aber mir ist aufgefallen, dass an einer Stelle en und de vertauscht sind:

Code: Alles auswählen

class AttachmentNotFound_Exception(Exception):
    """
    en: Das uebergebene Attachment wurde nicht gefunden
    de: Attachment not found
    """
    pass 
:D
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Rebecca hat geschrieben:Ist die Version im ersten Post die aktuelle?
Ist zwar nicht so wichtig, aber mir ist aufgefallen, dass an einer Stelle...
Hi Rebecca!

Ja, im ersten Beitrag steht immer die aktuelle Version. Ich habe jetzt auch einen Hinweis darauf hinzugefügt.

Der Fehler wurde ausgebessert.

Code: Alles auswählen

*   - Fehlerklassen von **SimpleMail_Exception** abgeleitet. Damit wird
*     bei einem Fehler jetzt auch eine aussagekräftigere Fehlermeldung
*     ausgegeben. Dabei habe ich auch die vertauschten Fehlermeldungen
*     ausgetauscht. (Rebecca, danke für die Meldung.)
*   - Da die Klassen **CCRecipients** und **BCCRecipients** sowiso von
*     **Recipients** abgeleitet wurden, kann ich mir das Überschreiben
*     der Initialisierung (__init__) und die Angabe der Slots sparen.
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jens hat geschrieben:@gerold: hast du keinen SVN Server auf dem du das Skript hinterlegen kannst??? Dann könnte ich es einfach mit svn-externals einbinden ;)
Hi Jens!

Es entwickelt sich. :D

Ich (wir) richte(n) gerade ein öffentlich zugängliches Subversion-Repository und ein Trac für "simplemail" ein.

Allerdings würde ich das Projekt erst dann bei dir einbinden, wenn ich ein richtiges Paket daraus gemacht habe. Es wird sich in den nächsten Tagen noch einiges daran ändern.

Aber die URLs stehen schon mal fest.

Trac: http://gelb.bcom.at/trac/simplemail/
SVN: http://gelb.bcom.at/svn/pub/simplemail/

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Eine komplettes trac/SVN nur für simplemail??? Ist das nicht zuviel des guten ;)

Ich meine, vielleicht legst du es besser so an:
  • simplemail/branches
    simplemail/tags
    simplemail/trunk
Dann hast du noch Platz für andere Sachen ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten