PDA

View Full Version : Brauche Hilfe



kuempi von stein
07-07-06, 13:52
Hello,

habe mal wieder ein JAVA-Problem.

Ich erstelle per Java ein PDF und versende es dann auch gleich per e-mail.
Soweit funktioniert alles bestens.
Problem ist, das das alles über ByteArrayInputStream bzw. ByteArrayOutputStream läuft und ich nun einen zweiten zusätzlichen Anhang für das e-mail anhängen möchte.

Der Sourcecode hier mal in groben Ausschnitten:



import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.StringReader;
ByteArrayOutputStream osANHANG1 = new ByteArrayOutputStream();

anhang1.transform(doc, osANHANG1);

ByteArrayInputStream bis =
new ByteArrayInputStream(osANHANG1.toByteArray());

mail.addAttachment("ANHANG.pdf", bis);


Der zweite (oder auch mehr) zusätzliche Anhang liegt direkt als File vor und muss vom Java nicht mehr erstellt werden.

Wie so oft in meinen jugendlichen Wahn, dachte ich, dass da ja keine grosse Sache ist und muss nun aber feststellen, dass mail.addAttachment einen ByteArrayInputStream verlangt.

Meine erste Überlegung war nun, die vorhandene File byteweise einzulesen, und sie dem ByteArrayInputStream zur Verfügung zu stellen.

Für den ersten Test hatte ich mir gedacht folgenden Code einfach hinter die Anweisung mail.addAttachment("ANHANG.pdf", bis); zu stellen:



File fi = new File("PROBE.jpg");
int dl = (int)fi.length();
byte[] daten = new byte[dl];
try {
FileInputStream fis = new FileInputStream(fi);
int bytes_read = 0;
while(bytes_read < dl ) {
bytes_read+=fis.read(daten,bytes_read,dl-bytes_read);
}
}
catch (IOException e) {
System.out.println(e);
}
ByteArrayInputStream bis = new ByteArrayInputStream(daten.toByteArray());

mail.addAttachment("TEST.jpg", bis);


Nun meine erste Frage:
F1: Wird das so funktionieren?

Leider hat ein erster Test schon mal zu einen Rückschlag geführt, da ich das Programm nicht mehr erstellen kann, (Fehlerzeiger direkt schon auf FILE) vermutlich weil das Hauptprogramm ja nicht mit allen Superklassen i.o. (heisst doch so?) arbeitet, sondern nur die drei import-Anweisungen hat wie oben im ersten Listing.
Warum ist mir nicht ganz klar, ich vermute mal, der ursprüngliche Erschaffer des Programms wollte Hauptspeicher sparen?

Nun gut dachte ich, hänge ich oben als vierten import eben noch import java.io.File; mit rein, aber er machts trotzdem nicht.

Zweite Frage:
F2: Welche Klasse muss ich denn dafür importieren?

Ich hoffe ich habe mich verständlich ausgedrückt und würde mich über baldige Antwort freuen.

kuempi

BenderD
07-07-06, 14:35
Hallo Kuempi,

die Import Anweisung ist eine Compile Time Anweisung (so eine Art ADDLIBLE).
Gute Praxis ist, dass man nur das importiert, was man wirklich braucht, das hat aber nur den Grund die Sache übersichtlich zu halten, mit Speicherverbrauch hat das nix zu tun.
Importieren muss man alles, außer java.lang.* (sone Art QSYS) und das namenlose Package (kein Package angegeben - gleich wieder vergessen, weil Pfui Bä).
Du musst also java.io.File und java.io.FileInputStream importieren, ansonsten wäre es natürlich angeraten die genaue Fehlermeldung zu posten.

mfg

Dieter Bender

PS: und es wäre vielleicht sinnvoll genauer zu beschreiben, was man da verwendet (was ist mail??? Das Spring Framework z.B kann ein File als Attachement anhängen!

RobertPic
07-07-06, 14:48
Zuerst müsste ich wissen, mit welcher API du arbeitest? Im Code kommt nirgends die Definition von mail vor.

Für e-Mail mit mehreren Anhängen benötigt man eine MultipartMessage. Damit die Anhänge richtige verpackt werden, muss man das mit Mimetypes tun. Java erkennt im Normalfall aufgrund der Extension den richtigen Mimetype (activation.jar).

Ich arbeite mit der Sun Mail-API. Ich habe mir diese zusammen mit meinen Extras (speichern in "Gesendete Nachrichten"...) in einem JavaBean abgelegt.

Hier ein paar Codeschnippsel:

Hier mal ein einzelnes Attachment über den DataHandler:


public void setSingleAttachment(String fileName, String displayName)
throws MessagingException {

FileDataSource fds = new FileDataSource(fileName);
msg.setDataHandler(new DataHandler(fds));
msg.setFileName(displayName);
this.mimeMultiPart = false;
}

Hier die Multipartvariante:


public void addAttachment(String fileName, String displayName)
throws MessagingException {
MimeBodyPart mbpx = new MimeBodyPart();

FileDataSource fds = new FileDataSource(fileName);
System.out.println(fds.getContentType());
mbpx.setDataHandler(new DataHandler(fds));
mbpx.setFileName(displayName);

mp.addBodyPart(mbpx);
}

Definitionen:
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

protected Message msg;
protected Multipart mp;

Das Senden geht dann so (Auszug):


if (mimeMultiPart) {
msg.setContent(mp);
}
msg.setSentDate(new Date());

Transport.send(msg);



Robert P.

kuempi von stein
07-07-06, 16:03
Manno,

mühsam ernährt sich das Eichkätzchen oder wie man sagt.

Ich habs hinbekommen.

@BenderD

Danke für die Hilfe, da hatte noch mehr gefehlt als diese zwei import-Anweisungen.
Ich hab dann nach 20 mal testen entnervt aufgegeben und import.java.io.*; genommen.
:D

@RobertPic

Ich glaub das ist hier auch die SUN-Mail-API. Dein code kam mir sehr bekannt vor, aber egal nun.

@ALL

Zur Lösung nur soviel:
Den ganzen Quatsch mit dem byteweisen Einlesen und der Versuch das an den ByteArrayInputStream zu übergeben habe ich mir dann gespart, Robert hatte mich da auch auf den Weg gebracht.
Habe nun einzig und allein die zwei Zeilen hinzugefügt:



FileInputStream fis = new FileInputStream("PROBE.pdf");
mail.addAttachment("TEST.pdf", fis);

Wobei wenn ich statt ner PDF ne JPG genommen habe, das nicht als Anhang sondern nur als Bild im PLAIN-Text eingefügt wurde. Keine Ahnung warum, ist mir auch egal, ich brauche ne PDF als Multianhang, und damit klappts.

Also merci nochmal und vielen Dank für die Anteilnahme.

Jeden Tag einen kleinen Schritt weiter...
;)

kuempi