Mail Funktionen (POP3, SMTP und Mailauswertung)
Verfasst: 07.04.2006 16:27
Im Rahmen meines derzeitigen Spleens bin ich dabei, einen Mailaccount abzufragen, die Mails auszuwerten und evtl. wieder was zu verschicken.
Um das Ei (siehe Ostern) nicht nochmals neu zu erfinden, habe ich im Forum und in der Codebase tüchtig geklaut.
Mein Verdienst ist eigentlich nur die Auswertungsfunktion und evtl. das Zusammenstellen udn ein paar kleine Ergänzungen.
Naja, hier also etwas Code für das Abfragen und Abrufen von Mails
So, dann hier der Code, um einfache Textmails, Mails im html-format und Mails mit Anhängen auszuwerten. Erkennt base64-Verschlüsselungen und decodiert auch
und dann noch der Code, um Mails wieder zu versenden. Geht auch (gerade) mit Authentifizierung (z.B. gmx)
So, das wärs erst mal.
Um das Ei (siehe Ostern) nicht nochmals neu zu erfinden, habe ich im Forum und in der Codebase tüchtig geklaut.
Mein Verdienst ist eigentlich nur die Auswertungsfunktion und evtl. das Zusammenstellen udn ein paar kleine Ergänzungen.
Naja, hier also etwas Code für das Abfragen und Abrufen von Mails
Code: Alles auswählen
; Einen Mailaccount abfragen und Mails abrufen
; 2006 by Dostej PB 4.0
;{ inits
If Not InitNetwork()
Debug "Error - Can not init the network"
End
EndIf
;}
;{ Basis
Procedure WaitNetworkClientEvent(ConnectionID_L.l, TimeOut_L.l)
For x = 1 To TimeOut_L
Event_L = NetworkClientEvent(ConnectionID_L)
If Event_L Or x = TimeOut_L
Break
EndIf
Delay(1)
Next
ProcedureReturn Event_L
EndProcedure
Procedure.s ReceiveNetworkString(ConnectionID_L.l)
Back_S.s
Buffer_S.s
Ergebnis_L.l
Repeat
Buffer_S = Space(3000)
Ergebnis_L = ReceiveNetworkData(ConnectionID_L, @Buffer_S, 3000)
Back_S + RTrim(Buffer_S)
Until Ergebnis_L < 3000
ProcedureReturn Back_S
EndProcedure
;}
;{ Mail-Funktionen
Procedure.l ConnectPOP3(ServerName_S.s, UserName_S.s, Passwort_S.s)
ConnectionID_L.l
ConnectionID_L = OpenNetworkConnection(ServerName_S, 110)
If ConnectionID_L
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
If Left(ReceiveNetworkString(ConnectionID_L), 3) = "+OK"
SendNetworkString(ConnectionID_L, "USER " + UserName_S + #CRLF$)
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
If Left(ReceiveNetworkString(ConnectionID_L), 3) = "+OK"
SendNetworkString(ConnectionID_L, "PASS " + Passwort_S + #CRLF$)
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
If Left(ReceiveNetworkString(ConnectionID_L), 3) = "+OK"
ProcedureReturn ConnectionID_L
Else
CloseNetworkConnection(ConnectionID_L)
EndIf
Else
CloseNetworkConnection(ConnectionID_L)
EndIf
Else
CloseNetworkConnection(ConnectionID_L)
EndIf
Else
CloseNetworkConnection(ConnectionID_L)
EndIf
Else
CloseNetworkConnection(ConnectionID_L)
EndIf
Else
CloseNetworkConnection(ConnectionID_L)
EndIf
EndIf
EndProcedure
Procedure CountMails(ConnectionID_L.l)
S.s
Back_L.l
SendNetworkString(ConnectionID_L, "STAT" + #CRLF$)
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
S = ReceiveNetworkString(ConnectionID_L)
; debug "Count Mails: " + S
If Left(S, 3) = "+OK"
Back_L = Val(StringField(S, 2, " "))
EndIf
EndIf
ProcedureReturn Back_L
EndProcedure
Procedure GetTotalMailsSize(ConnectionID_L.l)
Back_L.l
S.s
SendNetworkString(ConnectionID_L, "LIST" + #CRLF$)
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
S = ReceiveNetworkString(ConnectionID_L)
Debug "Mailsize: " + S
If Left(S, 3) = "+OK"
Back_L = Val(StringField(StringField(S, 2, "("), 1, " "))
EndIf
EndIf
ProcedureReturn Back_L
EndProcedure
Procedure.s GetMailList(ConnectionID_L.l) ; get the List of all Mails
SendNetworkString(ConnectionID_L, "LIST" + #CRLF$)
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
S.s = ReceiveNetworkString(ConnectionID_L)
EndIf
; debug "---LIST--------"
; debug S
ProcedureReturn S
EndProcedure
Procedure.s GetMailMsgList(ConnectionID_L.l, ID_L.l) ; get the List the specified Mails
SendNetworkString(ConnectionID_L, "LIST " + Str(ID_L) + #CRLF$)
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
S.s = ReceiveNetworkString(ConnectionID_L)
EndIf
; debug "---LIST " + Str(ID_L) + " --------"
; debug S
ProcedureReturn S
EndProcedure
Procedure.l GetMailSize(ConnectionID_L.l, Index_L) ; return the size of the specified mail
Back_L.l
SendNetworkString(ConnectionID_L, "LIST " + Str(Index_L) + #CRLF$)
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
S.s = ReceiveNetworkString(ConnectionID_L)
; debug "Mailsize (" + Str(Index_L) + "): " + S
If Left(S, 3) = "+OK"
Back_L = Val(StringField(S, 3, " "))
EndIf
EndIf
ProcedureReturn Back_L
EndProcedure
Procedure.s GetMail(ConnectionID_L.l, Index_L) ; returns the specified mail
S.s
SendNetworkString(ConnectionID_L, "RETR " + Str(Index_L) + #CRLF$)
While WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
S + ReceiveNetworkString(ConnectionID_L)
Wend
; debug "----MAIL-------"
; debug S
If Left(S, 3) = "+OK"
ProcedureReturn S
EndIf
EndProcedure
Procedure DeleteMail(ConnectionID_L.l, Index_L) ; set the specified mail to delete - this will be done if "QUIT" is send
SendNetworkString(ConnectionID_L, "DELE " + Str(Index_L) + #CRLF$)
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
If Left(ReceiveNetworkString(ConnectionID_L), 3) = "+OK"
ProcedureReturn Index_L
EndIf
EndIf
EndProcedure
Procedure ResetMails(ConnectionID_L.l) ; Clear all "Delete" Flag from Mails
SendNetworkString(ConnectionID_L, "RSET" + #CRLF$)
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
If Left(ReceiveNetworkString(ConnectionID_L), 3) = "+OK"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure ResetTimeOut(ConnectionID_L.l) ; Keeps the connection open
SendNetworkString(ConnectionID_L, "NOOP" + #CRLF$)
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
If Left(ReceiveNetworkString(ConnectionID_L), 3) = "+OK"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure SaveAndQuitPOP3(ConnectionID_L.l) ; Close the connection and all Mails with the delete-Flag will be deleted
SendNetworkString(ConnectionID_L, "QUIT" + #CRLF$)
If WaitNetworkClientEvent(ConnectionID_L, 1000) = 2
If Left(ReceiveNetworkString(ConnectionID_L), 3) = "+OK"
CloseNetworkConnection(ConnectionID_L)
ProcedureReturn 1
EndIf
EndIf
CloseNetworkConnection(ConnectionID_L)
EndProcedure
;}
; Demo
S.s
ServerName_S.s = "pop.server.com"
UserName_S.s = "dein username"
Password_S.s = "dein passwort"
ConnectionID_L = ConnectPOP3(ServerName_S, UserName_S, Password_S)
If ConnectionID_L
; Einen Mailaccount abfragen
Anzahl_L.l = CountMails(ConnectionID_L)
Debug "Global"
Debug "CountMails: " + Str(Anzahl_L)
Debug "GetList: " + GetMailList(ConnectionID_L)
Debug "GetTotalMailsSize: " + Str(GetTotalMailsSize(ConnectionID_L))
Debug " "
Debug "now the details"
For x = 1 To Anzahl_L ; get the List for every single mail
Debug "GetList " + Str(x) + ": " + GetMailMsgList(ConnectionID_L, x)
Debug "GetMailSize: " + Str(GetMailSize(ConnectionID_L, x))
Debug " "
Next
Debug " "
Debug "now the content of the Mails"
For x = 0 To Anzahl_L-1 ; get the List for every single mail
S = GetMail(ConnectionID_L, x)
Debug "GetMail: " + S
If CreateFile(1, "Mail" + Str(x) + ".txt")
WriteData(1, @S, Len(S))
CloseFile(1)
EndIf
Debug " "
Next
Debug " "
Debug "now close the Mail-Account"
Debug "ResetMails: " + Str(ResetMails(ConnectionID_L))
Debug "ResetTimeOut: " + Str(ResetTimeOut(ConnectionID_L))
Debug "SaveAndQuitPOP3: " + Str(SaveAndQuitPOP3(ConnectionID_L))
Else
Debug "Error while connecting"
EndIf
Code: Alles auswählen
Global ExePfad_GS.s = GetCurrentDirectory() + "\"
#FileTemp = 0
#FileSave = 1
; sonstiges
Procedure.s KorrigiereFileName(Pfad_S.s) ; ersetzt ungültige zeichen mit "_"
*P.Byte = @Pfad_S
For x = 0 To Len(Pfad_S)-1
; Debug Str(*P\b) + " - " + Chr(*P\b)
If *P\b < 32 Or *P\b = 34 Or *P\b = 42 Or *P\b = 47 Or *P\b = 58 Or *P\b = 60 Or *P\b = 62 Or *P\b = 63 Or *P\b = 92 Or *P\b = 124
*P\b = 95 ; _ ersetzen
EndIf
*P +1
Next
ProcedureReturn Pfad_S
EndProcedure
; Funktionseinheiten
Procedure.l Hole_Content_Typ(S.s) ; liest aus dem übergebenen String den Content-typ aus und gibt einen Zahlencode zurück
Back_L.l
Content_Type_S.s
Content_Type_S = LTrim(StringField(S, 2, ":"))
Debug "Content_Type_S: " + Content_Type_S
; hier können nun die verschiedenen Content-Arten abgefragt werden
If LCase(Left(Content_Type_S, 10)) = "text/plain"
Debug "einfaches Textfile"
Back_L = 1
ElseIf LCase(Left(Content_Type_S, 9)) = "text/html" ; Mail als hmtl
Debug "HTML Mail"
Back_L = 2
ElseIf LCase(Left(Content_Type_S, 21)) = "multipart/alternative" ; mehrteilige Daten gemischt
Debug "mehrteiliges Mail"
Back_L = 3
EndIf
ProcedureReturn Back_L
EndProcedure
Procedure.l Hole_Content_Encoding(S.s) ; liest aus dem übergebenen String den Content-encoding typ aus und gibt einen Zahlencode zurück
Back_L.l
S.s
S = LTrim(StringField(S, 2, ":"))
;Debug "Encoded_S: " + Back_L
If LCase(Left(S, 6)) = "base64"
Debug "Typ Base 64 gefunden "
Back_L = 1
EndIf
ProcedureReturn Back_L
EndProcedure
Procedure.s Lese_Block(FileHandle_L) ; liest die nächsten Strings bis zur nächsten Leerzeile und gibt sie als String zurück
Back_S.s
S.s
Repeat
S = ReadString(FileHandle_L) ; Zeilenweise auslesen
; Debug "ausgelesen: " + S
Back_S + S
Until S = ""
ProcedureReturn Back_S
EndProcedure
; Mailteile extrahieren
Procedure.s Lese_TextBlock(S.s, FileHandle_L.l, Encoded_L.l) ; liest den nächsten textblock und gibt den Inhalt - evtl. decodiert - zurück
Back_S.s
; den Datenblock auslesen
S + Lese_Block(FileHandle_L) ; liest die nächsten Strings bis zur nächsten Leerzeile und gibt sie als String zurück
;Debug "Grösse des Body: " + Str(Len(S))
If Encoded_L = 1 ; decodieren
t = Len(S)
;Debug "------" + Str(t)
If t < 64 ; die minimale Buffergrösse sicherstellen
t = 64
EndIf
Temp_S.s = Space(t)
Base64Decoder(@S, Len(S), @Temp_S, t)
Back_S = Temp_S
Else
Back_S = S
EndIf
ProcedureReturn Back_S
EndProcedure
Procedure.l Lese_MailAnhang(FileHandle_L.l, Encoded_L.l, SaveAs_S.s) ; liest den Mailanhang und speichert ihn in einem File; gibt 1 zurück, wenn der Teil gespeichert werden konnte
Back_L.l
S.s
Temp_S.s
; den Datenblock auslesen
S = Lese_Block(FileHandle_L) ; liest die nächsten Strings bis zur nächsten Leerzeile und gibt sie als String zurück
If Encoded_L = 1 ; evtl. decodieren
t = Len(S)
;Debug "------" + Str(t)
If t < 64 ; die minimale Buffergrösse sicherstellen
t = 64
EndIf
Temp_S.s = Space(t)
Base64Decoder(@S, Len(S), @Temp_S, t)
S = Temp_S
EndIf
; den Content speichern
If CreateFile(#FileSave, ExePfad_GS + SaveAs_S)
WriteData(#FileSave, @S, Len(S))
CloseFile(#FileSave)
Back_L = 1
EndIf
ProcedureReturn Back_L
EndProcedure
Procedure Decode_Mail(FileHandle_L.l) ; decodiert ein Mail, das als Datei gespeichert ist
; langsamer aber einfacher als das im Speicher zu machen
S.s
Ende_L.l ; 1, wenn Ende der Mailteile erreicht (nur bei mehrteiligen Mails)
Subject_S.s
SubjectPfad_S.s ; Das Subjekt des Mails auf Pfadeignung umstrukturiert
Encoded_L.l ; 1, wenn Mail base64 encoded
Encoded_Teil_L.l ; 1, wenn Teil des Mails base64 encoded
Reply_to_S.s
Content_Type_L.l = 1 ; wenn keine Angabe, dann von einfachem textfile ausgehen
Content_Type_Teil_L.l = 1 ; Typ des Teil des Mails -> keine Angabe, dann von einfachem textfile ausgehen
Header_L.l = 1 ; 1, wenn beim Auslesen noch im Header
Boundary_S.s ; enthält den Trenner-String zwischen verschiedenen Mailteilen
MailTeil_L.l ; welcher Teil des Mails ist das (nur bei mehrteiligen Mails)
While Eof(FileHandle_L) = 0
S = ReadString(FileHandle_L) ; Zeilenweise auslesen
; Debug S
If S <> "." ; Ende des Mails
If Header_L ;{ wenn im Header, prüfe auf gewisse Einträge
If S = "" ; leerzeile, dann ist das Ende des Headers erreicht
Header_L = 0
Debug "Ende des Headers"
EndIf
If FindString(S, "Subject", 1) ; wenn das Subjekt gefunden
t = FindString(S, ":", 1)
Subject_S = Right(S, Len(S)-t)
Debug "Subjekt: " + Subject_S
SubjectPfad_S = KorrigiereFileName(Subject_S)
Debug SubjectPfad_S
EndIf
If FindString(S, "Reply-To", 1) ; wenn das Subjekt gefunden
S = Trim(StringField(S, 2, ":"))
Reply_to_S = Right(S, Len(S)-t)
Debug "Reply_to_S: " + Reply_to_S
EndIf
If FindString(S, "Content-Transfer-Encoding", 1) ; wenn das Mail codiert ist
Encoded_L = Hole_Content_Encoding(S)
EndIf
If FindString(S, "Content-Type", 1) ; Was enthält das Mail
Content_Type_L = Hole_Content_Typ(S)
; den Trenn-String extrahieren
If Content_Type_L = 3 ; mehrteilige Daten gemischt
S = ReadString(FileHandle_L) ; lese nächste Zeile
Boundary_S = StringField(S, 2, Chr(34)) ; hole den Trennstring
Debug "Boundary_S " + Boundary_S
EndIf
EndIf
;}
Else ; Inhalte des Mails (Body und Anhänge)
; je nach Art des Mails entsprechend verarbeiten
Select Content_Type_L
Case 1 ;{ einfaches textfile
Debug "verarbeite als text"
S = Lese_TextBlock(S, FileHandle_L, Encoded_L)
Debug "Mailinhalt enc: " + S
Content_Type_L = 0 ; keine weitere Verarbeitung
;}
Case 2 ;{ Mail als HTML
;}
Case 3 ;{ mehrteilige Daten gemischt
Debug " teile gesondert speichern und je nach Art der Teile evtl. weiterverarbeiten"
Repeat
MailTeil_L + 1
Debug " "
Debug " TEIL " + Str(MailTeil_L) + "----------------------------------"
; lese weiter aus, bis das erste Mal der Trennstring erscheint
Repeat
S = ReadString(FileHandle_L) ; Zeilenweise auslesen
Debug S
Until FindString(S, Boundary_S, 1) Or Eof(FileHandle_L)
Debug "----- Boundary_S: "+ Boundary_S
; dann lese Content-Type und evtl. Content encoding
S = ReadString(FileHandle_L) ; nächste Zeile
If S <> "" ; wenn Leerzeile, dann war das der letzte Teil
Content_Type_Teil_L = Hole_Content_Typ(S)
Debug "Art des Teils: " + Str(Content_Type_Teil_L)
; Die nächsten Infos auslesen bis zur Leerzeile
Repeat
S = ReadString(FileHandle_L) ; Zeilenweise auslesen
If S <> ""
Encoded_Teil_L = Hole_Content_Encoding(S) ; ist dieser Teil verschlüsselt?
Debug "Encoded_Teil_L: " + Str(Encoded_Teil_L)
EndIf
Until S = ""
; und verarbeite die Teile entsprechend
If MailTeil_L = 1 And Content_Type_Teil_L = 1 ;{ ist der erste Teil Text -> Mailbody
S = Lese_TextBlock("", FileHandle_L, Encoded_Teil_L)
Debug "Mailinhalt Textpart: " + S
;}
ElseIf Content_Type_Teil_L = 1 ; ist ein weiterer Teil Text -> Als textfile abspeichern
Lese_MailAnhang(FileHandle_L, Encoded_Teil_L, SubjectPfad_S + " - " + Str(MailTeil_L) + ".txt")
ElseIf Content_Type_Teil_L = 2 ; HTML-Mail -> abspeichern
Debug "verarbeite als HTML " + Str(Encoded_Teil_L)
Lese_MailAnhang(FileHandle_L, Encoded_Teil_L, SubjectPfad_S + " - " + Str(MailTeil_L) + ".html")
ElseIf Content_Type_Teil_L = 3 ;
Else
; mit laufender Nummer speichern
Lese_MailAnhang(FileHandle_L, Encoded_Teil_L, SubjectPfad_S + " - " + Str(MailTeil_L) + ".part")
EndIf
Else
Ende_L = 1
EndIf
Until Ende_L Or Eof(FileHandle_L)
;}
EndSelect
EndIf
EndIf
Wend
EndProcedure
If ReadFile(#FileTemp, ExePfad_GS + "Beispiele\Mail3.txt") ; Hier der Link zu einem heruntergeladenen Mail
Decode_Mail(#FileTemp)
CloseFile(#FileTemp)
EndIf
Code: Alles auswählen
;{ inits
If Not InitNetwork()
Debug "Error - Can not init the network"
End
EndIf
;}
Declare.s Base64Encode(strText.s)
Declare SendFiles()
Declare.s GetMIMEType(Extension.s)
Declare send(msg.s)
Declare SendESMTPMail(name.s,sender.s,recipient.s,username.s,Password.s,smtpserver.s,subject.s,body.s)
Global ConnectionID.l
Global NewList Attachments.s()
InsertElement(Attachments())
Attachments() = "Link zu irgendeiner Datei"
Enumeration
#eHlo
#RequestAuthentication
#Username
#Password
#MailFrom
#RcptTo
#Data
#Quit
#Complete
EndEnumeration
mailserver.s="mail.gmx.de"
pop3server.s="pop.gmx.de"
mailto.s="Zieladresse"
mailfrom.s="Deineadresse"
MailUser_S.s = "Dein benutzername"
mailpass.s="Dein passwort"
subject.s="nur ein Test"
;Sending Mail with SMTP-AUTH
SendESMTPMail("Absnedername",mailfrom, mailto, MailUser_S,mailpass,mailserver,subject,"This is the body")
; Don´t fill the Username/Password if you want to sent regular
;sendesmtpmail("Clipper","my@email.com","your@email.com","","","smtp.mailserver.com","Hallo","This is the body")
Procedure SendESMTPMail(name.s,sender.s,recipient.s,username.s,Password.s,smtpserver.s,subject.s,body.s)
ConnectionID = OpenNetworkConnection(smtpserver, 25)
If ConnectionID
loop250.l=0
Repeat
If NetworkClientEvent(ConnectionID)
ReceivedData.s=Space(9999)
ct=ReceiveNetworkData(ConnectionID ,@ReceivedData,9999)
If ct
cmdID.s=Left(ReceivedData,3)
cmdText.s=Mid(ReceivedData,5,ct-6)
Debug "<" + cmdID + " " + cmdText
Select cmdID
Case "220"
If Len(username)>0
send("Ehlo " + Hostname())
state=#eHlo
Else
send("HELO " + Hostname())
state=#MailFrom
EndIf
Case "221"
send("[connection closed]")
state=#Complete
quit=1
Case "235"
send("MAIL FROM: <" + sender + ">")
state=#RcptTo
Case "334"
If state=#RequestAuthentication
send(Base64Encode(username))
state=#Username
EndIf
If state=#Username
send(Base64Encode(Password))
state=#Password
EndIf
Case "250"
Select state
Case #eHlo
send("AUTH LOGIN")
state=#RequestAuthentication
Case #MailFrom
send("MAIL FROM: <" + sender + ">")
state=#RcptTo
Case #RcptTo
send("RCPT TO: <" + recipient + ">")
state=#Data
Case #Data
send("DATA")
state=#Quit
Case #Quit
send("QUIT")
EndSelect
Case "251"
send("DATA")
state=#Data
Case "354"
send("X-Mailer: eSMTP 1.0")
send("To: " + recipient)
send("From: " + name + " <" + sender + ">")
send("Reply-To: "+sender)
send("Date:" + FormatDate("%dd/%mm/%yyyy @ %hh:%ii:%ss", Date()) )
send("Subject: " + subject)
send("MIME-Version: 1.0")
send("Content-Type: multipart/mixed; boundary="+Chr(34)+"MyBoundary"+Chr(34))
send("")
send("--MyBoundary")
send("Content-Type: text/plain; charset=us-ascii")
send("Content-Transfer-Encoding: 7bit")
send("")
send(body.s)
SendFiles()
send("--MyBoundary--")
send(".")
Case "550"
quit=1
EndSelect
EndIf
EndIf
Until quit = 1
CloseNetworkConnection(ConnectionID)
MessageRequester("","Ende")
EndIf
EndProcedure
Procedure send(msg.s)
;Delay(10)
Debug "> " + msg
msg+#CRLF$
SendNetworkData(ConnectionID, @msg, Len(msg))
EndProcedure
Procedure SendFiles()
ResetList(Attachments())
While(NextElement(Attachments()))
File.s=Attachments()
send("")
If ReadFile(0,File.s)
Debug File
InputBufferLength.l = Lof(0)
OutputBufferLength.l = InputBufferLength * 1.4
*memin=AllocateMemory(InputBufferLength)
If *memin
*memout=AllocateMemory(OutputBufferLength)
If *memout
Boundry.s = "--MyBoundary"
send(Boundry)
send("Content-Type: "+GetMIMEType(GetExtensionPart(File.s)) + "; name=" + Chr(34) + GetFilePart(File.s) + Chr(34))
send("Content-Transfer-Encoding: base64")
send("Content-Disposition: Attachment; filename=" + Chr(34) + GetFilePart(File) + Chr(34))
send("")
ReadData(0,*memin,InputBufferLength)
Base64Encoder(*memin,60,*memout,OutputBufferLength)
send(PeekS(*memout,60)) ; this must be done because For i=0 To OutputBufferLength/60 doesn´t work
Base64Encoder(*memin,InputBufferLength,*memout,OutputBufferLength)
For i=1 To OutputBufferLength/60
temp.s=Trim(PeekS(*memout+i*60,60))
If Len(temp)>0
send(temp)
EndIf
Next
EndIf
EndIf
FreeMemory(-1)
CloseFile(0)
EndIf
Wend
ProcedureReturn
EndProcedure
Procedure.s Base64Encode(strText.s)
Define.s Result
*B64EncodeBufferA = AllocateMemory(Len(strText)+1)
*B64EncodeBufferB = AllocateMemory((Len(strText)*3)+1)
PokeS(*B64EncodeBufferA, strText)
Base64Encoder(*B64EncodeBufferA, Len(strText), *B64EncodeBufferB, Len(strText)*3)
Result = PeekS(*B64EncodeBufferB)
FreeMemory(-1)
ProcedureReturn Result
EndProcedure
Procedure.s GetMIMEType(Extension.s)
Extension = "." + Extension
hKey.l = 0
KeyValue.s = Space(255)
datasize.l = 255
If RegOpenKeyEx_(#HKEY_CLASSES_ROOT, Extension, 0, #KEY_READ, @hKey)
KeyValue = "application/octet-stream"
Else
If RegQueryValueEx_(hKey, "Content Type", 0, 0, @KeyValue, @datasize)
KeyValue = "application/octet-stream"
Else
KeyValue = Left(KeyValue, datasize-1)
EndIf
RegCloseKey_(hKey)
EndIf
ProcedureReturn KeyValue
EndProcedure