Laden...

System.Net.Mail.Attachment: unterschiedliches Verhalten zwischen .Net 3.5 & 4.0?

Erstellt von RedDrago vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.943 Views
R
RedDrago Themenstarter:in
17 Beiträge seit 2009
vor 13 Jahren
System.Net.Mail.Attachment: unterschiedliches Verhalten zwischen .Net 3.5 & 4.0?

Hallo,

seit dem wir unser Projekt auf .Net 4.0 umgestellt haben, hab ich ein Problem beim versenden von Mails mit Dateianhängen...

Erst mal die bisherige Umsetzung:


// attachments ist ein List<string> die dateipfade zu allen Dateien enthält, die an die Mail angehangen werden sollen
MailMessage result = new MailMessage();
result.From = new MailAddress(absender);
result.Subject = betreff;
result.Body = nachricht;
if (attachments != null)
{
	foreach (string attachment in attachments)
	{
		result.Attachments.Add(new Attachment(attachment));
	}
}

Unter .Net3.5 hat das ausgereicht. Die Dateien wurden unverändert an die Mail angehangen und auch korrekt empfangen. Kurz und gut, Früher war alles besser 😁

Doch seit .Net4.0 macht das Framework daraus irgendeine andere Datei. War der Name der Datei vorher z.B. "Example01.pdf" erscheint im Anhang stattdessen z.B. "=_utf-8_B_QXVmdHJhZ3NiZXN0w6R0aWd1bmdfTC0w".
Diese Datei kann dann auch nicht mehr als PDF genutzt werden, da daraus ein "application/octet-stream" gemacht wird.

Das beste Ergebnis habe ich bisher hiermit erzielt:


foreach (string attachment in attachments)
{
	if(Path.GetExtension(attachment).ToLower() == ".pdf")
		result.Attachments.Add(new Attachment(new FileStream(attachment, FileMode.Open), new ContentType(MediaTypeNames.Application.Pdf)));
	else
		result.Attachments.Add(new Attachment(attachment));

}

Eine PDF kann dabei aber auch nicht so wirklich raus, denn die Datei im Anhang hat auch hier wieder einen anderen Namen erhalten daraus wurde kurzerhand eine dat-Datei mit dem Namen ATTXXXXX.dat gemacht.

Diese ließ sich dann auch nach dem umbenennen öffnen. Jedoch ist das so nicht akzeptabel, da ich unser Kunde damit später auch Auftragsbestätigungen etc. per Mail verschicken können soll.

Außer diese Funktion in ein anderes Projekt zu verlagern und dass dann unter .Net3.5 laufen zu lassen wüsste ich gerade keine Lösung.

Hat da wer einen Rat was ich hier evtl. falsch mache?

RedDrago

A
350 Beiträge seit 2010
vor 13 Jahren

Hi, nur mal sone Frage : Du hast eine Liste von Attachements.
Warum machst du dann eine neue Instanz des Attachements in die AttachementListe ?

result.Attachments.Add(new Attachment(attachment)

Lieber so

result.Attachments.Add(attachment)

Bei uns ist so ein Problem nicht aufgetreten, vll liegts ja daran ?

Grüße

R
RedDrago Themenstarter:in
17 Beiträge seit 2009
vor 13 Jahren

Hi, nur mal sone Frage : Du hast eine Liste von Attachements.
Warum machst du dann eine neue Instanz des Attachements in die AttachementListe ?

Da ich die Variablendeklaration nicht in dem Codeausschnitt habe, habe ich deswegen extra einen Kommentar oben eingefügt:

// attachments ist ein List<string> die dateipfade zu allen Dateien enthält, die an die Mail angehangen werden sollen

Nochmal komplett:

	private static MailMessage GetMessage(string absender, string betreff, string nachricht, List<string> attachments)
	{
		MailMessage result = new MailMessage();
		result.From = new MailAddress(absender);
		result.Subject = betreff;
		result.Body = nachricht;
		if (attachments != null)
		{
			foreach (string attachment in attachments)
			{
				if(Path.GetExtension(attachment).ToLower() == ".pdf")
					result.Attachments.Add(new Attachment(new FileStream(attachment, FileMode.Open), new ContentType(MediaTypeNames.Application.Pdf)));
				else
					result.Attachments.Add(new Attachment(attachment));
			}
		}
		return result;
	}

Der Ablauf sieht so aus, dass aus Daten in einer Datenbank eine temporäre PDF erstellt wird. Diese wird in einem temp-Ordner zwischen gespeichert. die Datei liegt dort auch mit dem gewünschten Namen vor und lässt sich auch ganz normal verwenden. Das habe ich schon alles getestet. Beim erstellen der Mail werden die Dateien wie im Codeausschnitt zu sehen ist angehängt.

Die Nachricht wird dann wie folgt gesendet und die temporären Dateien im Anschluss wieder gelöscht:

private static void SendMessage(MailMessage message)
	{
		SmtpClient client = new SmtpClient(GetHost(),GetPort());
		client.Credentials = new NetworkCredential("", "");
		client.SendCompleted += Client_SendCompleted;
		client.SendAsync(message, message.Attachments);
	}

	static void Client_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
	{
		AttachmentCollection attachments = e.UserState as AttachmentCollection;
		if (attachments != null)
		{
			foreach (Attachment att in attachments)
			{
				att.ContentStream.Close();
				if (((FileStream)att.ContentStream).Name.Contains(Path.GetTempPath()))
				{
					File.Delete(((FileStream)att.ContentStream).Name);
				}
			}
		}
	}
R
RedDrago Themenstarter:in
17 Beiträge seit 2009
vor 13 Jahren

Die Dateinamen scheinen einfach nur zu lang zu sein. Was mich jedoch wundert. denn zuvor hat es ja auch mit derselben namenslänge problemlos funktioniert.

Damit liegt die eigentliche Ursache wohl eher im Framework bzw. bei MS.

EDIT: Und wenn ein Stream übergeben wird, muss im Attachment der Name gesetzt werden. Sonst erhält man dennoch eine .dat Datei.