Content einer email in sql-datenbank speichern

  • Themenstarter Themenstarter dalco
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
D

dalco

Gast
hallo,
ich versuche einen kleinen mailbrowser zu schreiben, dazu will ich die bereits abgerufenen mails in einer sql datenbank speichern, es klappt bei der adresse, subjekt und einen datum.
beim inhalt, den ich mit:

messages.getContent();

bekomme, speichert er es nicht in die datenbank, hab das feld schon als VARCHAR oder TEXT genommen, wie kann ich den inhalt speichern, vorallem wenn der inhalt der mail nicht nur aus einfachem text besteht, denn damit geht es.

und mit:

messages.getSentDate();

wollte ich die zeit der letzten mail festhalten, um danach nur alle danach kommenden erneut in die datenbank zu speichern, alle abfragen auf diese zeit hin scheitern aber leider.

hier der teil des speichern:
-------------------------------------------------------------------------
// Connect to the POP3 server
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore(provider);
store.connect(host, username, password);

// Open the folder
Folder inbox = store.getFolder("INBOX");

if (inbox == null) {
System.out.println("No INBOX");
System.exit(1);
}
inbox.open(Folder.READ_ONLY);

// Get the messages from the server
Message[] messages = inbox.getMessages();

for (int i = 0; i < messages.length; i++) {
Message m = messages;

System.out.println("-------------------------------------------------- MAIL: "+i);
System.out.println( " Von: " + m.getFrom()[0] );
System.out.println("-- BETREFF -- " + messages.getSubject());
System.out.println("-- ZEIT -- " + messages.getSentDate());
System.out.println("-- INHALT -- " + messages.getContent() );



data[0] = messages.getSubject();
data[2] = messages.getSentDate();
data[1] = m.getFrom()[0];


db.connectToDatabase();
con = db.getConnection();
update.doEntrie(con , "INSERT INTO tino (id, fromAdr, subject, sendTime, contend) VALUES (\""
+i+"\",\""
+m.getFrom()[0]+"\",\""
+messages.getSubject()+"\",\""
+messages.getSentDate()+"\",\""
+messages.getContent()+"\")");
db.close();
}

-----------------------------------------------------

danke für eure tipps
mfg
Tino
 
Das ist doch ein JDBC Thema und kein Netzwerk-Thema?

Folgende Fragen stellen sich mir:

1) Wieso benutzt du keine [ code ] [ /code ] Tags?
2) Wieso öffnest du in einer FOR-Schleife X-Mal die DB Verbindung und schließt sie wieder? Vor der Schleife öffnen und danach schließen. Aber nicht immer und immer wieder IN der Schleifen.
3) Was ist "update.doEntrie()"?? Ich hätt's so gemacht (weiß nicht warum du da noch eine extra Klasse für benutzt wenn du da schon mit dem Connection-Objekt rumhantierst ):

Code:
Statement statement = con.createStatement();
int affected = statement.executeUpdate(""INSERT INTO tino (id, fromAdr, subject, sendTime, contend) VALUES (\""
+i+"\",\""
+m.getFrom()[0]+"\",\""
+messages[i].getSubject()+"\",\""
+messages[i].getSentDate()+"\",\""
+messages[i].getContent()+"\")"); 
System.out.println(affected+" Zeilen in die DB eingetragen.");
 
hi,
das mit dem "code" seh ich jetzt auch, du hast mir leider nicht auf meine frage geantwortet, sondern meinen gleichen code gepostet, das schließen der datenbank ok, und die extra klasse hab ich halt.
beantworte doch bitte die frage, warum ich den mit getContent() fehler bekomme und das nicht in ein TEXT-Feld in der sql datenbank speichern kann.
deine idee ist nur eine andere schreibweise, kümmert sich aber nicht um die frage.
danke
Tino
 
Ich seh in deinen Posts bis dato kein "?".

Aber mal davon abgesehen, das hier könnte eine Frage sein:

wie kann ich den inhalt speichern, vorallem wenn der inhalt der mail nicht nur aus einfachem text besteht

Hab ich dir ja bereits geschrieben, und zwar NICHT mit deinem Code. Meine Fragen hast du übrigens gekonnt ignoriert. find ich nicht so schön für jemanden der Hilfe erwartet und nicht "mitarbeitet".

Der DB ist es schnuppe ob der Mailcontent aus HTML, ASCII oder sonst was besteht. Fakt ist: Es passt in einen String. Und was in einen String passt, das kann man als Text in der DB speichern.

Da bei uns allen hier im Forum die Kristallkugel - die einem sonst immer alles verrät, was der Threadersteller nicht preisgeben kann/will - defekt ist, kann ich dir nicht weiterhelfen. Ohne meine Kristallkugel hab ich keinen Schimmer was das für ein ominöser Fehler sein soll. Aber vielleicht kommst du ja auf den Trichter uns zu verraten was das für ein Fehler ist und welche DB du benutzt.

Also erst die Frage richtig stellen und genug Details liefer, und dann erst "klugscheißen" ;-)
 
Was liefert dir getContent zurück? Ich vermute du wirst nicht drum herum kommen den Content als binary in die Datenbank zu schreiben!
 
Ich kenn das mail-Protokoll nicht, aber wenn ich Bilder in den Body einfüge, wo werden die dann übermittelt? Ist der Content sicher immer Text?
 
Die JavaMailAPI verrät es uns:

http://java.sun.com/products/javamail/javadocs/javax/mail/Part.html hat gesagt.:
Content:

The data type of the "content" is returned by the getContentType() method. The MIME typing system is used to name data types.
.
.
.
getContentType

java.lang.String getContentType()
throws MessagingException

Returns the Content-Type of the content of this part. Returns null if the Content-Type could not be determined.

The MIME typing system is used to name Content-types.

Returns:
The ContentType of this part
Throws:
MessagingException
See Also:
DataHandler

.
.
.
getContent

java.lang.Object getContent()
throws java.io.IOException,
MessagingException

Return the content as a Java object. The type of the returned object is of course dependent on the content itself. For example, the object returned for "text/plain" content is usually a String object. The object returned for a "multipart" content is always a Multipart subclass. For content-types that are unknown to the DataHandler system, an input stream is returned as the content

This is a convenience method that just invokes the DataHandler's getContent() method

Returns:
Object
Throws:
MessagingException
java.io.IOException - this is typically thrown by the DataHandler. Refer to the documentation for javax.activation.DataHandler for more details.
See Also:
DataHandler.getContent()
 
hallo,

ich häng dir mal die fehlermeldung an, vielleicht kannst du was damit anfangen, ich denke eben, dass es der datenbank nicht egal ist, ob es nur aus text besteht, einfache text-mails speichert es ab, aber welche mit bildern, wie zb. werbemails von gmx nicht, da kommt es zu folgenden fehlermeldungen:

Code:
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'lass es und sammel briefmarken", 
naja vielleicht findet sich ja mal zeit drübe' at line 1
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3243)
	at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1343)
	at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1260)
	at database.DB_Entrie.doEntrie(DB_Entrie.java:17)
	at mailserver.POP3Client.ReceiveMails(POP3Client.java:82)-------------------------------------------------- MAIL:  1

	at gui.GUIBuilder.<init>(GUIBuilder.java:95)
	at gui.GUIBuilder.getInstance(GUIBuilder.java:66)
	at start.Start.main(Start.java:9)

vielleicht hilft dir das weiter.
vielleicht muss ich mit getContent() alles in einen langen String umwandeln, der evtl. bilder weglässt??
oder klatscht er mir dann alles hintereinander und würde zeilenumbrüche weglassen, kurz, ich lege eine tabelle an mit namen und betreff, wenn ich zb. auf betreff klicke kommt die ganze email, wie zb beim outlook.
dazu sollte der inhalt der mail halt auch so wiedergegeben werden wie er geschrieben wurde und den wollte ich eben in der sql datenbank als großen TEXT feld speichern.

danke Tino
 
Der Fehler sieht danach aus, als ob du ein Zeichen in deinem String hast, welches du maskieren musst. Irgend ein Zeichen scheint da das SQL-Statement ungültig werden zu lassen.

Du kannst nicht jede Mail mit getContent in Text umwandeln. Es gibt in der Tat auch Mails bei denen das nicht geht weil im Content binäre Dateianhänge mit reingewurschtelt sind. Du musst also abhängig von getCOntentType() den Mailinhalt in der DB speichern bzw. den Mailinhalt vorher konvertieren. Ist halt eine Designfrage. Willst du nur die Texte in der DB haben oder alles, inklusive Dateianhänge?

Wenn letzteres, dann wirst du das Objekt, welches getCOntent() zurückliefert serialisieren und tatsächlich als BLOB in der DB speichern müssen. Aber das ist nun wirklich kein Netzwerkthema mehr.

- Alex
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben