JavaMail versendet PDFs fehlerhaft

Status
Nicht offen für weitere Antworten.

tuomo

Aktives Mitglied
Hallo Leutz,

ich hab eine Frage zu JavaMail und dem versenden von Dateien. Wenn ich ein PDF im Anhang per eMail versende, kann ich nach dem Empfang der eMail die Datei nicht mehr öffnen. Ich habe es auch mit einem Word-Dokument ausprobiert, da funktioniert (mal zur Abwechslung) alles prima. Kann mir jemand erklären, woran das liegt?

Ich hab hier mal den Code-Schnippsel wo ich den Anhang bastel:
Code:
// Mitteilung/Anhang der Mail konstruieren
		
		Multipart lMultipartBody = null;
		
		lMultipartBody = new MimeMultipart();
		BodyPart lBodyPart = new MimeBodyPart();
		
		try {
			
			lBodyPart.setText(pMessage);
			lMultipartBody.addBodyPart(lBodyPart);
			
			if (pAttachment != null) {
				
				lBodyPart = new MimeBodyPart();
	
				DataSource lAttachment = new FileDataSource(pAttachment.getAbsolutePath());
				lBodyPart.setDataHandler(new DataHandler(lAttachment));
				lBodyPart.setFileName(pAttachment.getName());
				
				lMultipartBody.addBodyPart(lBodyPart);
			}
		} catch (MessagingException pException) {
			
			mLogger.info(
					"The mail could not be sent because mail body could not be constructed." +
					"\n\tCauses by: " + pException.getMessage());
			
			throw new MyRuntimeException(
					UUID.fromString("cd11d473-0400-4387-b5df-4427dabfa766"),
					"The mail could not be sent because mail body could not be constructed" +
					"\n\tCauses by: " + pException.getMessage(),
					pException);
		}
		
		
		// Message-Objekt erstellen, ueber das die Nachricht konfiguriert wird
		MimeMessage lMessage = new MimeMessage(lSession);
		
		try {
			
			lMessage.setFrom(lSender);
			
			lMessage.setRecipient(Message.RecipientType.TO, lRecipient);
			
			lMessage.setSubject(pSubject);
			
			lMessage.setContent(lMultipartBody);
			
		} catch (MessagingException pException) {

			mLogger.info(
					"The mail could not be sent because mail could not be constructed." +
					"\n\tCauses by: " + pException.getMessage());
			
			throw new MyRuntimeException(
					UUID.fromString("464db4de-3563-47e5-b45a-76272612206e"),
					"The mail could not be sent because mail could not be constructed." +
					"\n\tCauses by: " + pException.getMessage(),
					pException);
		}

Also ich kann mir nicht vorstellen, dass es am Code liegt, da es ja mit anderen Dokumenten klappt. Oder muss ich vielleicht noch irgendeinen Paramter setzen? Ich bin ratlos und leider findet man zu dem Problem nichts.

Danke für eure Zeit!
 

robertpic71

Bekanntes Mitglied
Das Problem könnte am Mimetype liegen. Prüfe einmal im Quelltext der e-Mail (im e-Mail Client wie z.b. Outook den Quelltext anzeigen lassen). Zumindest bei den älternen MailAPI's ist keine Mimetype-Umsetzung für PDF vordefiniert.

Teste auch mal andere e-Mail-Clients - viele machen das PDF trotz fehlendem Mimetype auf.

/Robert
 

tuomo

Aktives Mitglied
robertpic71 hat gesagt.:
Prüfe einmal im Quelltext der e-Mail (im e-Mail Client wie z.b. Outook den Quelltext anzeigen lassen)

Also wenn ich mir den Header der Mail anschaue, bekomme ich das:

MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_0_18662247.1207209217261"
X-AVK-Virus-Check: AVKA 18.161;F1206
X-AVK-Virus-Check: AVKA 18.165;02.04.2008
Return-Path: JMSRequestConsumer@outclass-development.com
X-OriginalArrivalTime: 03 Apr 2008 07:53:38.0106 (UTC) FILETIME=[D36459A0:01C8955F]
Date: 3 Apr 2008 09:53:38 +0200

------=_Part_0_18662247.1207209217261
Content-Type: text/plain; charset=Cp1252
Content-Transfer-Encoding: quoted-printable

------=_Part_0_18662247.1207209217261
Content-Type: application/octet-stream; name=Maven-Plugins.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=Maven-Plugins.pdf


------=_Part_0_18662247.1207209217261--

Für mich sieht das nicht ungewöhlich aus, denn wenn ich das mit dem Header einer eMail vergleiche, die ich per Outlook versendet habe, sieht das mehr oder weniger genauso aus.

Könnte es denn sein, dass die JavaMail-API das Dokument irgendwie falsch zerhäckselt, so dass das nicht wieder richtig zusammengesetzt werden kann?

Gruß
 

Niki

Top Contributor
Meiner Meinung nach sollte statt
Code:
Content-Type: application/octet-stream; name=Maven-Plugins.pdf
Content-Transfer-Encoding: base64

besser das stehen:
Code:
Content-Type: application/pdf; name=Maven-Plugins.pdf
Content-Transfer-Encoding: base64
 

Niki

Top Contributor
es tut mir leid, ich habe es mit deinem code ausprobiert und es funktioniert bei mir, bei mir steht genauso:
Code:
Content-Type: application/octet-stream; name="testpdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=test.pdf
im email-content drin. ich öffne die email mit ms outlook. vielleicht liegt bei deinem email-client ein problem.
 

tuomo

Aktives Mitglied
Hmm, schade.

Also es ist zwar schön, dass es nicht an meinem Code liegt und eigentlich funktioniert, aber das eröffnet ganz neue weiten der Fehlersuche. Denn wie gesagt, wenn ich mir selber eine eMail schicken, mit Outlook sende und empfange, dann kann ich die PDFs problemlos öffnen. Auch wenn ich PDFs geschickt bekomme, klappt 's. Daher glaub ich ehr nicht, dass es am Client liegt.

Werde ich wohl noch ein bisschen weitersuchen müssen. Aber zumindest weiß ich dass der Code funktioniert.

Danke euch!
 

robertpic71

Bekanntes Mitglied
tuomo hat gesagt.:
Denn wie gesagt, wenn ich mir selber eine eMail schicken, mit Outlook sende und empfange, dann kann ich die PDFs problemlos öffnen. Auch wenn ich PDFs geschickt bekomme, klappt 's. Daher glaub ich ehr nicht, dass es am Client liegt.

1.) Schau einmal bei den e-Mail die funktionieren den Mimetype in der Quelle an. Sagt aber auch nicht alles aus. Outlook verpackt die e-Mail etwas anders (Stichwort winmail.dat).
2.) Speicher einmal das PDF und öffene es dann im Explorer. Damit kannst du sicherstellen, dass das File selber richtig rüberkommt.

Ich habe im Netz auf die Schnelle das hier gefunden:

Code:
I've been doing this successfully with JavaMail and iText. Just create a
MimeBodyPart containing the data. Some example code:

// You have a ByteArrayOutputStre­am containing the PDF called pdf. You have
called iText's document.close() to finish the PDF generation.

String applicationType = "application/pdf";
MimeBodyPart bp = new MimeBodyPart();
bp.setDataHandler(n­ew DataHandler(new ByteArrayDataSource­(pdf.toByteArray(),
applicationType)));­
bp.setFileName("My PDF File.pdf");

MimeMultipart wholeEmail = new MimeMultipart();
// Add your other MimeBodyParts (covering email etc)
wholeEmail.addBodyP­art(bp);

Ich habe da eher Quick&Dirty die activation.jar überschrieben. Dort gibt es ein mimetype.default in der meta-inf. Ich habe da einfach alle gängigen Endungen mit ihren passenden Mimetype versehen.

/Robert
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben