# JavaMail versendet PDFs fehlerhaft



## tuomo (3. Apr 2008)

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:

```
// 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 (3. Apr 2008)

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 (3. Apr 2008)

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 (3. Apr 2008)

Meiner Meinung nach sollte statt

```
Content-Type: application/octet-stream; name=Maven-Plugins.pdf
Content-Transfer-Encoding: base64
```

besser das stehen:

```
Content-Type: application/pdf; name=Maven-Plugins.pdf
Content-Transfer-Encoding: base64
```


----------



## tuomo (3. Apr 2008)

@Niki
 Aber wie kann ich das aus Java heraus beeinflussen?


----------



## Niki (3. Apr 2008)

es tut mir leid, ich habe es mit deinem code ausprobiert und es funktioniert bei mir, bei mir steht genauso:

```
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 (3. Apr 2008)

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 (3. Apr 2008)

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:


```
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


----------

