Ich denke, jeder Interessierte hat sich schon mal mit dem SMTP-Protokoll beschäftigt um Emails per Winsock zu verschicken. Das klappt auch ganz gut, schließlich ist das Protokoll einfach aufgebaut. Wenn man jedoch Dateien verschicken will, muss man schon ein weniger tiefer forschen. Hier kommt nämlich ein neues Format hinzu, das MIME-Format. Zudem müssen die Dateien vorher kodiert werden.
Es gibt verschiedene Kodierung, ich habe hier einfach mal Base64 gewählt, da diese wohl am gebräuchlichsten ist. Schaut euch einfach den Code an, die Funktion SendFile gibt den Text zurück, der per Winsock an den Server geschickt werden muss.
Kurz noch zur Base64-Kodierung: das eigentliche Prinzip ist, aus 8-Bit- Zeichen 6-Bit-Zeichen zu machen, indem man 3 Bytes über 4 Bytes verteilt. Um dieses Prinzip besser zu verstehen, gibt es eine "langsame" Variante der Kodierung, die mit Strings arbeiten. Für größere Dateien ist das aber zu langsam, dort arbeitet man mit Tabellen und Bitoperationen. Im Projekt sind beide Varianten, die verständliche aber langsame und die schnelle.
History
16.03.2003 Hinzugefügt
Autor: Dominik Auras <Dominik_auf_vbinside.de>
Code aus Base64.bas
Dim Base64Tab(63) As Byte
Dim Ready As BooleanPublic Sub Init()
For i = 65 To 90
Base64Tab(i - 65) = i
Next
For i = 97 To 122
Base64Tab(i - 71) = i
Next
For i = 0 To 9
Base64Tab(i + 52) = 48 + i
Next
Base64Tab(62) = 43
Base64Tab(63) = 47
Ready = True
End Sub
Public Function EncodeB64(ByVal EingabeString As String) As String
Dim Bits As String
Dim nBits As String
Dim nEncBits As String
If Ready = False Then
Init
End If
For i = 1 To Len(EingabeString)
Bits = Bits & ToBin(Asc(Mid$(EingabeString, i, 1)))
Next i
For i = 1 To Len(Bits) - (Len(Bits) Mod 24) Step 24
nBits = Mid$(Bits, i, 24)
EncodeB64 = EncodeB64 & Chr$(Base64Tab(ToDec("00" & _
Mid$(nBits, 1, 6)))) & Chr$(Base64Tab(ToDec("00" & _
Mid$(nBits, 7, 6)))) & Chr$(Base64Tab(ToDec("00" & _
Mid$(nBits, 13, 6)))) & Chr$(Base64Tab(ToDec("00" & _
Mid$(nBits, 19, 6))))
Next i
If Len(EingabeString) Mod 3 = 1 Then
nBits = ToBin(Asc(Mid$(EingabeString, Len(EingabeString))))
EncodeB64 = EncodeB64 & Chr$(Base64Tab(ToDec("00" & _
Mid$(nBits, 1, 6)))) & Chr$(Base64Tab(ToDec("00" & _
Mid$(nBits, 7, 2) & "0000"))) & "=="
ElseIf Len(EingabeString) Mod 3 = 2 Then
nBits = ToBin(Asc(Mid$(EingabeString, Len(EingabeString) - _
1))) & ToBin(Asc(Mid$(EingabeString, Len(EingabeString))))
EncodeB64 = EncodeB64 & Chr$(Base64Tab(ToDec("00" & _
Mid$(nBits, 1, 6)))) & Chr$(Base64Tab(ToDec("00" & _
Mid$(nBits, 7, 6)))) & Chr$(Base64Tab(ToDec("00" & _
Mid$(nBits, 13, 4) & "00"))) & "="
End If
End Function
Public Sub Span(Zeichen As Long, ByVal Eingabe As String, ByRef _
Ausgabe As String)
Dim Zeilen As Long
Zeilen = CLng(Len(Eingabe) / Zeichen)
If (Len(Eingabe) / Zeichen) Mod Zeichen > 0 Then
Zeilen = Zeilen + 1
End If
If Zeilen <= 1 Then
Ausgabe = Eingabe: Exit Sub
End If
For i& = 0 To Zeilen - 1
Ausgabe = Ausgabe & Mid$(Eingabe, i * Zeichen + 1, Zeichen) _
& vbCrLf
Next i
End Sub
Public Function EncodeFile(Dateiname As String) As String
Dim nFile As String, Temp As String, EncodedFile As String
Open Dateiname For Binary As #1
Do While Loc(1) < LOF(1)
nFile = nFile & Chr$(CByte(Asc(Input(1, #1))))
Loop
Close #1
Temp = EncodeB64Fast(nFile)
Span 76, Temp, EncodedFile
EncodeFile = EncodedFile
End Function
Public Function ToBin(ByVal nummer As Byte) As String
Dim i As Long
For i = 7 To 0 Step -1
If 2 ^ i <= nummer Then
nummer = nummer - 2 ^ i: ToBin = ToBin & "1"
Else
ToBin = ToBin & "0"
End If
Next i
End Function
Public Function ToDec(ByVal nummer As String) As Byte
Dim i As Byte, n As Byte
n = 8
For i = 1 To 8
n = n - 1
If Mid$(nummer, i, 1) = "1" Then
ToDec = ToDec + 2 ^ n
End If
Next i
End Function
Public Function EncodeB64Fast(ByVal EingabeString As String) As String
Dim Bits As String
Dim nBits As String
Dim nEncBits As String
Dim iByte(0 To 2) As Byte, oByte(0 To 2) As Byte
If Ready = False Then
Init
End If
For i = 1 To Len(EingabeString) - (Len(EingabeString) Mod 3) Step 3
iByte(0) = Asc(Mid$(EingabeString, i, 1))
iByte(1) = Asc(Mid$(EingabeString, i + 1, 1))
iByte(2) = Asc(Mid$(EingabeString, i + 2, 1))
EncodeB64Fast = EncodeB64Fast & Chr$(Base64Tab((iByte(0) \ _
4) And &H3F)) & Chr$(Base64Tab(((iByte(0) And &H3) * 16) _
Or ((iByte(1) \ 16) And &HF))) & _
Chr$(Base64Tab(((iByte(1) And &HF) * 4) Or ((iByte(2) \ _
64) And &H3F))) & Chr$(Base64Tab((iByte(2) And &H3F)))
Next i
If Len(EingabeString) Mod 3 = 1 Then
iByte(0) = Asc(Mid$(EingabeString, Len(EingabeString), 1))
iByte(1) = 0
EncodeB64Fast = EncodeB64Fast & Chr$(Base64Tab((iByte(0) \ _
4) And &H3F)) & Chr$(Base64Tab(((iByte(0) And &H3) * 16) _
Or ((iByte(1) \ 16) And &HF))) & Chr$(61) & Chr$(61)
ElseIf Len(EingabeString) Mod 3 = 2 Then
iByte(0) = Asc(Mid$(EingabeString, Len(EingabeString) - 1, 1))
iByte(1) = Asc(Mid$(EingabeString, Len(EingabeString), 1))
iByte(2) = 0
EncodeB64Fast = EncodeB64Fast & Chr$(Base64Tab((iByte(0) \ _
4) And &H3F)) & Chr$(Base64Tab(((iByte(0) And &H3) * 16) _
Or ((iByte(1) \ 16) And &HF))) & _
Chr$(Base64Tab(((iByte(1) And &HF) * 4) Or ((iByte(2) \ _
64) And &H3F))) & Chr$(61)
End If
End Function