Ich habe mal weiter gemacht aber so ganz toll ist es immer noch nicht. Ich werde wohl noch weiter daran arbeiten müssen doch damit man einen Fortschritt sieht hier mal der Code. Vielleicht hat ja noch einer ein paar Tipps oder findet Fehler.
Code: Alles auswählen
EnableExplicit
InitNetwork()
Global SMTP_LastAnswer$
Declare.s SMTP_CreateNameAdressString(name$, adress$)
Declare.s SMTP_MailDate()
Declare.s SMTP_GetAdressPart(string$)
Declare.s SMTP_ReceiveNetworkString(verbindung.i)
Declare SMTP_SendNetworkStringBase64(id.i, string$)
Declare.i SMTP_OpenConnection(smtp_server$, from_adress$, from_password$, port=25)
Declare SMTP_SendMail(id.i, from_adress$, subject$, mailbody$, to_adress$, to_cc_adress$="", to_bcc_adress$="")
Declare SMTP_CloseConnection(id.i)
Structure SMTP_Attachment
Dateiname$
MimeTyp$
EndStructure
Declare SMTP_SendFiles(id.i, List attachments.SMTP_Attachment())
Declare SMTP_SendMailAndAttachment(id.i, from_adress$, subject$, mailbody$, to_adress$, List attachments.SMTP_Attachment() ,to_cc_adress$="", to_bcc_adress$="")
Procedure.s SMTP_CreateNameAdressString(name$, adress$)
ProcedureReturn name$+" <"+adress$+">"
EndProcedure
Procedure.s SMTP_MailDate()
Protected date$
date$ = StringField("Sun|Mon|Tue|Wed|Thu|Fri|Sat", DayOfWeek(Date())+1, "|") +", "
date$ + FormatDate("%dd", Date())+" "
date$ + StringField("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec", Month(Date()), "|")+" "
date$ + FormatDate("%yyyy %hh:%ii:%ss", Date())+" +0200"
ProcedureReturn date$
EndProcedure
Procedure.s SMTP_GetAdressPart(string$)
Protected adress$, pos.l, i.l
Repeat
pos = FindString(string$, "<", i)
i = FindString(string$, ">", pos)
If pos > 0
adress$ = adress$+Mid(string$, pos, i-pos+1)
EndIf
Until pos = 0
ProcedureReturn adress$
EndProcedure
Procedure.s SMTP_ReceiveNetworkString(verbindung.i)
Protected len.l, *DatenBuffer = AllocateMemory(2048)
len = ReceiveNetworkData(verbindung, *DatenBuffer, 2048)
ProcedureReturn PeekS(*DatenBuffer, len)
EndProcedure
Procedure SMTP_SendNetworkStringBase64(id.i, string$)
Protected buffer$ = Space(StringByteLength(string$)*1.35+64)
Base64Encoder(@string$, StringByteLength(string$), @buffer$, StringByteLength(string$)*1.35+64)
SendNetworkString(id, buffer$+#CRLF$)
EndProcedure
Procedure.i SMTP_OpenConnection(smtp_server$, from_adress$, from_password$, port=25)
Protected id.i
id = OpenNetworkConnection(smtp_server$, port, #PB_Network_TCP)
If id
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
If Left(SMTP_LastAnswer$, 3) = "220"
SendNetworkString(id, "AUTH LOGIN"+#CRLF$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
If Left(SMTP_LastAnswer$, 3) = "334"
SMTP_SendNetworkStringBase64(id, from_adress$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
If Left(SMTP_LastAnswer$, 3) = "334"
SMTP_SendNetworkStringBase64(id, from_password$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
If Left(SMTP_LastAnswer$, 3) = "235"
SendNetworkString(id, "EHLO SendMail"+#CRLF$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
If Left(SMTP_LastAnswer$, 3) = "250"
ProcedureReturn id
EndIf
EndIf
EndIf
EndIf
EndIf
CloseNetworkConnection(id)
Else
SMTP_LastAnswer$ = "OpenNetworkConnection = 0"
EndIf
Debug SMTP_LastAnswer$
EndProcedure
Procedure SMTP_SendMail(id.i, from_adress$, subject$, mailbody$, to_adress$, to_cc_adress$="", to_bcc_adress$="")
Protected pos1.l, pos2.l, adress$
SendNetworkString(id, "MAIL FROM: "+SMTP_GetAdressPart(from_adress$)+#CRLF$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
If Left(SMTP_LastAnswer$, 3) = "250"
adress$ = SMTP_GetAdressPart(to_adress$)
pos1 = FindString(adress$, "<", 1)
Repeat
pos2 = FindString(adress$, "<", pos1+1)
If pos2 = 0
pos2 = Len(adress$)+1
EndIf
SendNetworkString(id, "RCPT TO: "+Mid(adress$, pos1, pos2-pos1)+#CRLF$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
pos1 = pos2
Until pos1 = Len(adress$)+1
If Left(SMTP_LastAnswer$, 3) = "250"
SendNetworkString(id, "DATA"+#CRLF$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
If Left(SMTP_LastAnswer$, 3) = "354"
SendNetworkString(id, "Date: "+SMTP_MailDate()+#CRLF$)
SendNetworkString(id, "From: "+from_adress$+#CRLF$)
SendNetworkString(id, "To: "+to_adress$+#CRLF$)
If to_cc_adress$ : SendNetworkString(id, "cc: "+to_cc_adress$+#CRLF$) : EndIf
If to_bcc_adress$ : SendNetworkString(id, "Bcc: "+to_bcc_adress$+#CRLF$) : EndIf
SendNetworkString(id, "Subject: "+subject$+#CRLF$)
SendNetworkString(id, #CRLF$)
SendNetworkString(id, mailbody$+#CRLF$)
SendNetworkString(id, "."+#CRLF$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
If Left(SMTP_LastAnswer$, 3) = "250"
ProcedureReturn 1
EndIf
EndIf
EndIf
EndIf
CloseNetworkConnection(id)
Debug SMTP_LastAnswer$
EndProcedure
Procedure SMTP_CloseConnection(id.i)
SendNetworkString(id, "QUIT"+#CRLF$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
CloseNetworkConnection(id)
EndProcedure
Procedure SMTP_SendFiles(id.i, List attachments.SMTP_Attachment())
Protected nr.i, InputBufferLength.l, OutputBufferLength.l, *InputBuffer, *OutputBuffer
ResetList(attachments())
While NextElement(attachments())
nr = ReadFile(#PB_Any, attachments()\Dateiname$)
If nr
InputBufferLength = Lof(nr)
OutputBufferLength = InputBufferLength*1.35+64
*InputBuffer = AllocateMemory(InputBufferLength)
If *InputBuffer
*OutputBuffer = AllocateMemory(OutputBufferLength)
If *OutputBuffer
SendNetworkString(id, #CRLF$)
SendNetworkString(id, "--myboundary"+#CRLF$)
SendNetworkString(id, "Content-Type: "+attachments()\MimeTyp$+"; name="+Chr(34)+GetFilePart(attachments()\Dateiname$)+Chr(34)+#CRLF$)
SendNetworkString(id, "Content-Transfer-Encoding: base64"+#CRLF$)
SendNetworkString(id, #CRLF$)
ReadData(nr, *InputBuffer, InputBufferLength)
OutputBufferLength = Base64Encoder(*InputBuffer, InputBufferLength, *OutputBuffer, OutputBufferLength)
SendNetworkData(id, *OutputBuffer, OutputBufferLength)
FreeMemory(*OutputBuffer)
EndIf
FreeMemory(*InputBuffer)
EndIf
CloseFile(nr)
EndIf
Wend
EndProcedure
Procedure SMTP_SendMailAndAttachment(id.i, from_adress$, subject$, mailbody$, to_adress$, List attachments.SMTP_Attachment() ,to_cc_adress$="", to_bcc_adress$="")
Protected pos1.l, pos2.l, adress$
SendNetworkString(id, "MAIL FROM: "+SMTP_GetAdressPart(from_adress$)+#CRLF$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
If Left(SMTP_LastAnswer$, 3) = "250"
adress$ = SMTP_GetAdressPart(to_adress$)
pos1 = FindString(adress$, "<", 1)
Repeat
pos2 = FindString(adress$, "<", pos1+1)
If pos2 = 0
pos2 = Len(adress$)+1
EndIf
SendNetworkString(id, "RCPT TO: "+Mid(adress$, pos1, pos2-pos1)+#CRLF$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
pos1 = pos2
Until pos1 = Len(adress$)+1
If Left(SMTP_LastAnswer$, 3) = "250"
SendNetworkString(id, "DATA"+#CRLF$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
If Left(SMTP_LastAnswer$, 3) = "354"
SendNetworkString(id, "Date: "+SMTP_MailDate()+#CRLF$)
SendNetworkString(id, "From: "+from_adress$+#CRLF$)
SendNetworkString(id, "To: "+to_adress$+#CRLF$)
If to_cc_adress$ : SendNetworkString(id, "cc: "+to_cc_adress$+#CRLF$) : EndIf
If to_bcc_adress$ : SendNetworkString(id, "Bcc: "+to_bcc_adress$+#CRLF$) : EndIf
SendNetworkString(id, "Subject: "+subject$+#CRLF$)
SendNetworkString(id, "MIME-Version: 1.0"+#CRLF$)
SendNetworkString(id, "Content-Type: multipart/mixed; boundary="+Chr(34)+"myboundary"+Chr(34)+#CRLF$)
SendNetworkString(id, #CRLF$)
SendNetworkString(id, "--myboundary"+#CRLF$)
SendNetworkString(id, "Content-Type: text/plain; charset=ascii"+#CRLF$)
SendNetworkString(id, #CRLF$)
SendNetworkString(id, mailbody$+#CRLF$)
SMTP_SendFiles(id, attachments())
SendNetworkString(id, "--myboundary--"+#CRLF$)
SendNetworkString(id, "."+#CRLF$)
SMTP_LastAnswer$ = SMTP_ReceiveNetworkString(id)
If Left(SMTP_LastAnswer$, 3) = "250"
ProcedureReturn 1
EndIf
EndIf
EndIf
EndIf
CloseNetworkConnection(id)
Debug SMTP_LastAnswer$
EndProcedure
; ;Beispiel
; Define id.i, from_adress$, subject$, mailbody$, to_adress$
;
; from_adress$ = SMTP_CreateNameAdressString("sender", "sendername@mail.de")
; to_adress$ = SMTP_CreateNameAdressString("empfänger", "zielname@mail.de")
;
; subject$ = "Hallo Hallo"
; mailbody$ = "Dies ist eine Test E-Mail gesendet mit PB"+Chr(10)+";-)"
;
; id = SMTP_OpenConnection("smtp.server.de", "sendername@mail.de", "senderpasswort")
; If id
; If SMTP_SendMail(id, from_adress$, subject$, mailbody$, to_adress$)
; Debug "E-Mail wurde gesendet!"
; Else
; Debug "Fehler! E-Mail wurde nicht gesendet!"
; EndIf
; SMTP_CloseConnection(id)
; EndIf