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:

Freitag 11. November 2005, 10:02

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:

Samstag 10. Dezember 2005, 01:10

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:

Samstag 10. Dezember 2005, 12:06

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:

Samstag 10. Dezember 2005, 23:31

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

Samstag 7. Januar 2006, 18:23

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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 7. Januar 2006, 22:25

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

CMS in Python: http://www.pylucid.org
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:

Samstag 7. Januar 2006, 23:32

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:

Mittwoch 22. März 2006, 15:56

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:

Donnerstag 30. März 2006, 14:10

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

Sonntag 28. Mai 2006, 11:43

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:

Sonntag 28. Mai 2006, 17:24

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

Sonntag 28. Mai 2006, 17:43

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:

Sonntag 28. Mai 2006, 18:30

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:

Sonntag 28. Mai 2006, 18:57

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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 29. Mai 2006, 06:49

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten