externe Emails abrufen und in eine Tabelle schreiben

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich habe hier im Forum eine Lösung gefunden, wie ich Email von externen Servern abholen kann. Diese möchte ich nun in eine Datenbank speichern. Bis her sieht das bei mir so aus:

Code: Alles auswählen

if __name__ == "__main__":
	mail = poplib.POP3_SSL('pop.googlemail.com', 995)
	mail.user("meine_email")
	mail.pass_("mein_passwort")
	messages = len(mail.list()[1])
	for i in range(messages):	
		raw_mail = mail.retr (i+1)
		str = string.join(raw_mail[1], "\n")
		my_mail = email.message_from_string(str)
				
		conn = dbtools.opendb ()
		cursor = conn.cursor()

		cursor.execute("""INSERT INTO mail_incomming 
			(mail_from, mail_to, mail_subject, mail_date) 
			VALUES 
			(%s, %s, %s, %s)""", [
			my_mail["From"],
			my_mail["To"],
			my_mail["Subject"],
			my_mail["Date"]
			])
		conn.close ()
			
		for part in my_mail.walk():
			if (part.get_filename()):
				print (part.get_filename())
				conn = dbtools.opendb ()
				cursor = conn.cursor()
				cursor.execute("""INSERT INTO mail_incomming_append
					(append_id,append, filename)
					VALUES
					((SELECT MAX(id) from mail_incomming), %s, %s)""", [ 
					part.get_payload(decode=True),
					part.get_filename()])
				conn.close ()
Die Routine funktioniert auch so weit ganz gut. Nur irgendetwas stimmt mit den Anhängen nicht. Ich schreibe den Anhang nur in die Tabelle wenn es auch einen Filenamen dazu gibt. Schaue ich mir aber dann die Anhänge an, also will diese öffnen ( zB. nen .jpg ), kann dieses nicht angezeigt werden. Da ich in diesem Email Gebiet neu bin, weiß ich nicht, wo der Fehler liegt.
Kann da jemand helfen?
BlackJack

@The Hit-Man: Da fehlen ein paar Schritte. Ein *.jpg in einer Datenbank kann man ja zum Beispiel nicht einfach so öffnen. Wie bekommst Du das aus der Datenbank heraus und was machst Du dann damit? Wie unterscheidet sich der Dateiinhalt vom Original? Die gleiche Grösse? Ungefähr der gleiche Inhalt, oder komplett etwas anderes?
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

die datei bekomme ich mit mysql-query-browser raus. da gibts für die mySQL datenbank ja kleine frontends zum bearbeiten der daten. da kannste dann einfach die splate anklicken, die du speichern möchtest. da ich ja den filenamen mit speicher, weiß ich unter welchen namen ich die daten speichern muß. wenn sie dann auf festplatte liegt, versuche ich sie zu öffnen. die genau größe habe ich allerdings noch nicht untersucht.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ich würde auch erst einmal probieren die Dateien auf der Festplatte abzulegen und dann zu öffnen. Möglicherweise ist dies ja auch ein Problem mit der Schnittstelle zu MySQL.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ich glaube, es liegt an dem MultiPart ... Manche Dateien lassen sich bis zu einer bestimmten Größe öffnen. Denn ob die Datei Multipart ist, frage ich gar nicht ab ...
Denn kleine Dateien, lassen sich ohne Probleme öffnen und dekodiert sind sie dann auch schon.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich verstehe nur nicht, wie ich das machen soll. Wenn ich nun einen MultiPart gefunden habe, wie sauge ich den dann weiter runter? Kann mir da jemand auf die Sprünge helfen?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

The Hit-Man hat geschrieben:Ich verstehe nur nicht, wie ich das machen soll. Wenn ich nun einen MultiPart gefunden habe, wie sauge ich den dann weiter runter? Kann mir da jemand auf die Sprünge helfen?
Ich habe noch nie mit der poplib gearbeitet, aber bisher verwendest du laut Code doch part.get_payload. Suchst du jetzt eine Alternative dazu oder wie ist deine Frage zu verstehen?
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

nein, ich suche keine Alternative. Die Sache ist ja, die. Ich kann die Anhänge ja runterladen, bis zu einer bestimmten Größe ( so wie es scheint ). Ich dachte jetzt, das das jetzt was mit dem MultiPart zu tun hat. Das mit den Anhängen läuft eben noch nicht ganz rund und ich finde den Fehler einfach nicht. Mit dem email Modul arbeite ich auch das erste mal.
BlackJack

@The Hit-Man: Bei welcher Grösse gibt es denn das Problem? Hast Du Dir die Grösse der heruntergeladenen Daten mal angeschaut? Und geht es hier immer noch über die Datenbank? Soll heissen hast Du die Bilder mal nach dem herunterladen als Datei gespeichert statt sie in die Datenbank zu schreiben? Um auszuschliessen dass es an der DB liegt. Welchen Typ hat das Feld dort? Ist das in der Grösse begrenzt? Hast Du mal versucht was passiert wenn Du Daten in das Feld schreibst die grösser sind als erlaubt? Gibt es dann eine Fehlermeldung, oder werden dann einfach Daten ignoriert/abgeschnitten?
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ahja, da bringste mich auf was. Das Feld ist nen blob aber wie groß ich da rein schreiben darf, weiß ich gar nicht. Ich gehe doch davon aus, das das unbegrenzt ist. ich nutze debian squeeze und habe so weit alles auf default gelassen in der Datenbank. Allerdings, die Datenbank schimpft nicht wenn ich dort große Dateien rein packe ( die Anhänge ). Oder meckert die Datenbank nicht wenn Daten in Felder gesetzt werden, die viel zu groß sind. Ich bin davon ausgegangen, das es dann so eine Art truncate Meldung gibt. Auf Platte, hatte ich sie noch nicht gespeichert sondern immer direkt in die Datenbank. Ich werde das morgen mal testen und bescheid geben. Wäre es denn eher sinnvoller, nur die Filenamen zu speichern und die Binaries dann auf Platte zu speichern?
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

genau, Du hast recht. Wenn ich sie direkt speicher, auf Platte, sind die Dateien komplett. Wieso dann nicht in der Datenbank?
Die Routine hat sich ja jetzt nicht großartig geändert.

Code: Alles auswählen

# -*- coding: utf-8 -*-

import getpass, poplib
import dbtools
import email
import string

if __name__ == "__main__":
	mail = poplib.POP3_SSL('pop.googlemail.com', 995)
	mail.user("user")
	mail.pass_("pass")
	messages = len(mail.list()[1])
	for i in range(messages):	
		raw_mail = mail.retr (i+1)
		str = string.join(raw_mail[1], "\n")
		my_mail = email.message_from_string(str)
		
		'''	
		conn = dbtools.opendb ()
		cursor = conn.cursor()

		cursor.execute("""INSERT INTO mail_incomming 
			(mail_from, mail_to, mail_subject, mail_date) 
			VALUES 
			(%s, %s, %s, %s)""", [
			my_mail["From"],
			my_mail["To"],
			my_mail["Subject"],
			my_mail["Date"]
			])
		conn.close ()
		'''
		for part in my_mail.walk():
			if (part.get_filename()):
				print (part.get_filename())
				with open("./append/"+part.get_filename(), 'wb') as mailfile:
					mailfile.write(part.get_payload(decode=True))
				'''
				conn = dbtools.opendb ()
				cursor = conn.cursor()
				cursor.execute("""INSERT INTO mail_incomming_append
					(append_id,append, filename)
					VALUES
					((SELECT MAX(id) from mail_incomming), %s, %s)""", [ 
					part.get_payload(decode=True),
					part.get_filename()])
				conn.close ()
				'''

EDIT:
Allerdings kommen nicht aus allen Mails die Anhänge raus. Einige fehlen. Könnte das am MultiPart liegen?
Antworten