Mailanhang immer nur 4KB


D

deetzen

Hallo,

ich versuche Mails über eine selbstgeschriebene Klasse zu verschicken. Klappt auch schon so weit alles ganz gut, aber mit dem Anhang hab ich so meine Schwierigkeiten.
Egal was ich tue, alle Anhänge werden nach erreichen von 4KB abgeschnitten. :(

Ich denke es muß an folgender Funktion liegen, aber ich weiß nicht wo dort der Fehler liegt:

Code:
Public Function Encode(ByVal strFilePath As String) As String
		Dim fs As New FileStream(strFilePath, FileMode.Open)
		Dim br As New BinaryReader(fs)

		Return (Convert.ToBase64String(br.ReadBytes(fs.Length)))

		br.Close()
		fs.Close()
End Function
 

mage

Erfahrenes Mitglied
Du konvertierst anscheinend nur den ersten Happen aus deinem Binary Reader.
 

Caracho

Mitglied
Hi,

ich denke mal du solltest zuerst den Stream schliessen und dann den Wert zurück geben.

Code:
Public Function Encode(ByVal strFilePath As String) As String
		Dim fs As New FileStream(strFilePath, FileMode.Open)
		Dim br As New BinaryReader(fs)
                Dim s As String

		s = Convert.ToBase64String(br.ReadBytes(fs.Length))

		br.Close()
		fs.Close()
                return (s)
End Function
Bin nicht mehr so vertraut mit VB Code, aber ich hoffe es sind keine Syntax Fehler drin.
 
D

deetzen

Ja ich weiß, den Fehler habe ich bereits behoben, trotzdem danke für den Hinweis.
Aber das Ändert leider auch nichts...
 

Caracho

Mitglied
Hi,

ich denke nicht dass es an dieser Funktion liegt.
Denke dass der Fehler wo anders ist, wie sieht den die Funktion aus die das Ganze dann weiterverarbeitet?
Lass dir doch einfach über ne MessageBox die Länge des Rückgabe Strings zurückgeben.
Oder hast du das schon gemacht ?
 
D

deetzen

Also es könnte noch hier liegen. Kann der Stream vielleicht nicht mehr senden?

Code:
Dim ObjOutboundData As Stream

DataArray = Encoding.ASCII.GetBytes(strDataToSend.ToCharArray())
ObjOutboundData.Write(DataArray, 0, strDataToSend.Length)
 

Caracho

Mitglied
Ne, der Stream sendet immer alles was du ihm gibst, eventuell Blockiert halt dann die Anwendung, aber er sollte immer alles schreiben.
Vielleicht kannst du noch mehr Code posten.

Ist strDataToSend der Rückgabe-Wert der Encode Methode ?
Wenn ja, dann verstehe ich nicht warum du den Wert, dann wieder in ein byte-Array konvertierst.
 
D

deetzen

Also es sieht folgendermaßen aus:

Code:
If Len(SMTPData.AttachmentFile) > 0 Then

   strDataToSend = "--KkK170891tpbkKk__FV_KKKkkkjjwq" & vbCrLf _
   & "Content-Type: application/octet-stream" & vbCrLf _
   & "Content-Transfer-Encoding: base64" & vbCrLf _
   & "Content-Disposition: attachment;" & vbCrLf _
   & " filename= " & Mid$(SMTPData.AttachmentFile, InStrRev(SMTPData.AttachmentFile, "\") + 1) & vbCrLf & vbCrLf _
   & Encode(SMTPData.AttachmentFile) & vbCrLf
   
   DataArray = Encoding.ASCII.GetBytes(strDataToSend.ToCharArray())
   ObjOutboundData.Write(DataArray, 0, strDataToSend.Length)
End If
 

Caracho

Mitglied
Ah, ich glaub ich weiß an was es liegt.
Wann schließt du bzw. schließt du überhaupt den Stream "ObjOutboundData" ?
Das solltest du auf jeden Fall tun, wenn du mit dem Senden fertig bist!

Füge einfach mal nach deiner letzten Zeile folgenden Code ein:
Code:
ObjOutboundData.Flush()
Wenn du die Email verschickt hast, dann schließe den Stream mit ObjOutboundData.Close().

P.S.: Du solltest deine Nachricht gemäß RFC 2821 noch an die gängige Norm angleichen. Dein
Attachment als Base64 String hat nämlich Zeilen die länger sind als 76 Zeichen, was laut
RFC 2821 nicht gültig ist. (kann natürlich sein dass der SMTP Server die Nachricht trotzdem
ordenlich erkennt)
 
D

deetzen

Ok, schließen tue ich den Stream nun, aber das hilft leider auch nicht wirklich.
Versuche grade die Zeile in mehrere Zeilen aufzusplitten, aber irgendwie stehe ich heut
voll neben mir.
Krieg's grad wirklich nicht hin... :mad:

Also krieg's schon hin, aber meine Methode ist Uuuurlangsam...
 
Zuletzt bearbeitet von einem Moderator: