Stringbuffer -> MimeBodyPart

Status
Nicht offen für weitere Antworten.

neurox

Aktives Mitglied
Hallo ihr lieben,

ich versuche seit Stunden den Inhalt (CSV) eines Stringbuffers als MimeBodyPart an eine Email zu hängen. Im Moment wüßte ich nur, wie ich den ganzen Kram in eine Datei schreibe und dann anhänge, aber das erscheint mir irgendwie nicht richtig sauber, da ich dann auch irgendwo immer schreibrechte im Dateisystem brauche.

Kann mir jemand weiterhelfen?

Meine Momentane Idee ist die hier:

Code:
MimeBodyPart part = new MimeBodyPart();
part.setContent(passwords.toString(), "text/csv");
part.setDataHandler(new DataHandler(new DataSource().getInputStream()));
part.setFileName("pass.csv");

Das das Snippet nicht funktionier ist mir klar, das ist jetzt nur mal zur verdeutlichung, wo ich hin will.

Hat jemand eine Idee?

Viele Grüße
neurox
 

neurox

Aktives Mitglied
Hallo allerseits,

entweder mangelt es in diesem Forum an Interesse oder an Leuten mit der richtigen Antwort zu der Frage. Für den letzteren Fall möchte ich jetzt kurz die Antwort auf das Problem einstellen, für den Fall das jemand das selbe Problem hat.

Mein Problem war, dass ich ein Email-Attachment per java.mail anhängen wollte, ohne den Umweg über das Dateisystem zu gehen. Das Attachment soll quasi on-the-fly generiert werden.

Die kurze Antwort ist, dass ich einfach die Schnittstelle DataSource neu implementiert und dem DataHandler übergeben habe.

Hier kurz der Code:

Code:
part = new MimeBodyPart();
StringBufferDataSource mds = new StringBufferDataSource(passwords);
part.setDataHandler(new DataHandler(mds));
part.setFileName("pass.csv");
mp.addBodyPart(part);

Und hier noch die Implementierung der neuen Klasse samt Schnittstelle:

Code:
package com.scaratec.tools;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.activation.DataSource;

public class StringBufferDataSource implements DataSource {
	
	StringBuffer sb;
	
	public StringBufferDataSource(StringBuffer sb){
		this.sb = sb;
	}

	@Override
	public String getContentType() {
		// TODO Auto-generated method stub
		return "text/csv";
	}

	@Override
	public InputStream getInputStream() throws IOException {
		// StringBuffer in ein ByteArray konvertieren
		byte[] content = String.valueOf(this.sb.toString()).getBytes("UTF8");
		return new ByteArrayInputStream(content);
	}

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public OutputStream getOutputStream() throws IOException {
		// TODO Auto-generated method stub
		return null;
	}

}

Im Grunde genommen ist das nun sehr angenehm gelösst, da ich jeden InputStream an den MimeBodyPart schicken kann. Das muss dann nicht unbedingt ein StringBuffer sein, sondern kann jeder DatenStrom sein.

Mir ist klar, dass das vermutlich ein Anfänger Problem ist, aber da ich in den Foren (auch international) und auch im meinen Zahlreichen Büchern nicht fündig geworden bin, hoffe ich, dass ich hiermit helfen kann.

Viele Grüße
neurox
 
G

Guest

Gast
Ich glaube, die javax.mail.util.ByteArrayDataSource macht so ziemlich das gleiche.
 

neurox

Aktives Mitglied
Tja, sieht ganz so aus. Hätte man mir irgendwie auch vorher sagen können. Naja, so habe ich aber wieder etwas zugelernt. Mache das ja noch nicht so lange ...
 
G

Guest

Gast
Tut mir leid, ich schaue nur sporadisch ins Form.

Aber ein Tip für die Zukunft, bei Interfaces in der API immer nach "All Known Implementing Classes" schauen.
 

neurox

Aktives Mitglied
Vielen Dank für den Tipp. Wie gesagt, ich mache das ja auch noch nicht so lange. Als ich dann die Sache mit dem DataHandler gefunden habe, war ich dann von der Implementierung auch nicht mehr so weit entfernt. Netto waren dass ja auch nur 4 Zeilen, von denen ich mindestens eine auch bei der andern Klasse gebraucht hätte. Den Rest hat eclipse gemacht, wie man sieht.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben