Wie sende ich eine Excel-Datei per E-Mail?
Ich habe eine excel-Datei (Excel 2003 /xls-format) und ich möchte per E-Mail versenden mit c#.
Mein code senden erfolgreich, aber wenn ich versuche, öffnen Sie die Antwortdatei, es scheint codiert zu Unrecht.
Beispiel hier ist die Antwort, mit dem Namen:
=_utf-8_B_RWxzesOhbW9sw6FzXzIwMTJfMTBfmtzf.dat
Und hier ist die Antwort, die Datei selbst:
=?utf-8?B?VEdWdmJIWmhjMkZ1Wk1Pelh6UXlYekZmpz0ncia9p3v0zi04p0i/VGtW?=\
\ =?utf-8?B?TlgwZFRXaTU0YkhNPT89?=" Content-Transfer-Encoding: base64
Content-Disposition: attachment0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAApgadap7/CQAGAAAAAAAAAAAAAAABAAAA
AQAAAAAAAAAAEAAAIwAAAAEAAAD+////AAAAAAAAAAD/////////////////////
////////////////////////////////////////////////////////////////
//////////////////////////////....
Hier ist mein code-fragment:
...
var attachment = new Attachment(WriteFileToMemory("fileFullPath"), "fileName.xls");
attachment.ContentType = new ContentType("application/vnd.ms-excel");
attachmentCollection.Add(attachment);
...
private Stream WriteFileToMemory(string filePath)
{
var memoryStream = new MemoryStream();
_openedStreams.Add(memoryStream);
using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
var bytes = new byte[file.Length];
file.Read(bytes, 0, (int) file.Length);
memoryStream.Write(bytes, 0, (int) file.Length);
file.Close();
}
memoryStream.Position = 0;
return memoryStream;
}
Wie kann ich die Anlage encoding-Typ und die Kodierung sollte ich mit Excel-Dateien?
Bitte helfen Sie mir dieses problem zu lösen.
Vielen Dank im Voraus.
- Warum gehst du nicht tun:
new Attachment( new FileStream("path", FileMode.Open, FileAccess.Read), "fileName.xls")
? - Ja, du hast Recht. Jetzt benutze ich Ihre Lösung um die Datei zu laden, aber das problem ist immer noch das gleiche. Sie können die E-mail senden, aber die Codierung der excel-Datei falsch ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie, dass es zu Komplex ist, als @Magnus weist darauf hin,
new Attachment()
verarbeiten kannFileStream
s so übergeben Sie einfach einen neuen filestream an den Konstruktor übergeben.Ein Wort der Warnung, obwohl, irgendwie ist off topic, Sie können nicht senden Sie eine E-mail wie, dass mehrere Male seit der stream wird nicht immer zurückgesetzt richtig.
In Fall, dass Sie wollen, generieren Sie in Excel eine Datentabelle, und senden Sie es per E-mail können Sie die excel-Datei wie folgt:
Klappte es bei mir zumindest mit .NET framework 4 und Excel 2016.
Grüße.
stream.Position=0;
ist die Linie, die mir geholfen haben. ohne meine Anlage war nur 504 bytes anstelle von ein paar kBsIch habe eine Lösung gefunden:
Basiert auf dieser Quelle: http://social.msdn.microsoft.com/Forums/en-US/dotnetframeworkde/thread/b6c764f7-4697-4394-b45f-128a24306d55
Ich bin der Lösung des gleichen Problems durch Korrektur der MailMessage-Eigenschaften:
Eine E-Mail, Nachricht, attachment-Namen, die ASCII-fremde Zeichen enthält und länger ist als 41 UTF-8-codierte bytes kodiert ist, zwei mal vor der übertragung in eine Anwendung kompiliert wird für die .NET Framework 4. Dieses problem tritt wegen eines Problems in der .NET Framework 4. Der SMTP-Codierungen umgeschrieben wurden, gehören die korrekte Faltung pro RFC-standards der line-Länge begrenzt. Dieses Verhalten fügt zusätzlichen carriage return line feed (CRLF) Zeichen, wenn der name Zeichenfolge ist zu lang. Diese zusätzlichen steuerzeichen Ursache der name der Anlage werden erneut codiert. Mehr finden Sie hier http://support.microsoft.com/kb/2402064