Seite 3 von 6
Re: Mail-Lib - E-Mail versenden
Verfasst: 14.07.2012 16:52
von kunstlust
@ts-soft
Sorry das verstehe ich nur begrenzt, was ist für mich zu tun, was muss ich wo setzen?
Re: Mail-Lib - E-Mail versenden
Verfasst: 14.07.2012 16:56
von ts-soft
In den CompilerOptionen ein SubSystem eintragen, wenn Du Unicode oder Threadsafe benutzt.
Wie genau das Subsystem heißt findest Du in der Hilfe zur Lib, ich kann es Dir nicht genau sagen,
ich verwende keine UserLibs, die dies erforderlich machen.
UserLibUnicode oder ähnlich heißt das SubSystem.
Re: Mail-Lib - E-Mail versenden
Verfasst: 14.07.2012 16:58
von kunstlust
@ts-soft
Welchen Weg würdest du gehen, über die API von Windows?
Re: Mail-Lib - E-Mail versenden
Verfasst: 14.07.2012 17:03
von kunstlust
Ich habe den Thread abgeschaltet, weil nach Einbindung der "UserLibThreadSafe" noch mehr Fehler aufgetreten sind und ich die Funktion nicht brauche
Re: Mail-Lib - E-Mail versenden
Verfasst: 14.07.2012 17:18
von ts-soft
kunstlust hat geschrieben:@ts-soft
Welchen Weg würdest du gehen, über die API von Windows?
Den müsste ich mir erst suchen. Aber diese UserLib ist mir mit zu vielen Einschränkungen verbunden.
- Nicht Plattformunabhängig (nicht so wichtig)
- Keine 64-Bit Unterstützung (kann man notfalls tolerieren)
- Kein Sourcecode (man ist vom Support des Herstellers abhängig, da nutzt es auch nicht viel, das der Support von Gnozal ist hervorragend ist)
Unter diesen Voraussetzungen würde ich mir 3x mal überlegen überhaupt ein Projekt zu beginnen, außer vielleicht einer kleinen Spielerei.
Re: Mail-Lib - E-Mail versenden
Verfasst: 14.07.2012 17:32
von kunstlust
@TS-Soft
Es ist schon schade, das diese "Grundfunktion" in PB nicht drin ist, welcher Mailserver nimmt noch Mails ohne "SMTP-Auth" an. Das selbe Problem habe ich unter AutoIT auch gehabt, dort ist jedoch die API leichter zu nutzen, sodass ich mir das von einem VBS Sample abgeschaut habe:
Code: Alles auswählen
Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Example CDO Message"
objMessage.From = "me@my.com"
objMessage.To = "test@paulsadowski.com"
objMessage.HTMLBody = "<h1>This is some sample message html.</h1>"
'objMessage.CreateMHTMLBody "Body"
'objMessage.CreateMHTMLBody "file://c|/temp/test.htm"
objMessage.Bcc = "you@your.com"
objMessage.Cc = "you2@your.com"
objMessage.Send
Re: Mail-Lib - E-Mail versenden
Verfasst: 14.07.2012 17:37
von Falko
Schade, das Droopy seine Mailfunktion aus seiner Lib herausgenommen hat.
Da ich noch ein altes Beispiel einer älteren Droopy-Lib habe, habe ich diesen Teil
extrahiert und soweit es bei mir funktioniert anpassen können. Vielleicht hilft es hier
jemanden weiter
Code: Alles auswählen
;- _____________________________________________________________________________
;- | |
;- | SendEmail (New) |
;- | _______________ |
;- | |
;- |___________________________________________________________________________|
;{ SendEmail (New) (Start)
; Author : clipper
; PureBasic 3.93
; Changed to Purebasic 4.61 x86 from Falko
; Sending Mail with SMTP-AUTH + add multiple attachments
; Don´t fill the Username if you don't want authentification
Enumeration
#eHlo
#RequestAuthentication
#Username
#Password
#MailFrom
#RcptTo
#Data
#Quit
#Complete
EndEnumeration
ProcedureDLL SendEMailInit()
Global NewList Attachments.s()
Global SendEMailConnectionID.l
EndProcedure
ProcedureDLL AddAttachment(File.s)
AddElement(Attachments())
Attachments() = file
EndProcedure
ProcedureDLL NoAttachment()
ClearList(Attachments())
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
Procedure.s Base64Encode(strText.s)
;DefType.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.s = PeekS(*B64EncodeBufferB)
FreeMemory(*B64EncodeBufferA)
FreeMemory(*B64EncodeBufferB)
ProcedureReturn Result
EndProcedure
Procedure Send(msg.s)
msg+#CRLF$
SendNetworkData(SendEMailConnectionID, @msg, Len(msg))
EndProcedure
Procedure SendFiles()
ResetList(Attachments())
While(NextElement(Attachments()))
file.s=Attachments()
Send("")
If ReadFile(0,file.s)
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
ProcedureDLL SendEmail(Name.s,sender.s,recipient.s,Username.s,Password.s,smtpserver.s,subject.s,body.s)
If InitNetwork()
SendEMailConnectionID = OpenNetworkConnection(smtpserver, 25)
If SendEMailConnectionID
loop250.l=0
Repeat
If NetworkClientEvent(SendEMailConnectionID)
ReceivedData.s=Space(9999)
ct=ReceiveNetworkData(SendEMailConnectionID ,@ReceivedData,9999)
If ct
cmdID.s=Left(ReceivedData,3)
cmdText.s=Mid(ReceivedData,5,ct-6)
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(SendEMailConnectionID)
EndIf
EndIf
EndProcedure
Name.s="Mein Name bei email.de" ; Hier ist egal was steht.
sender.s="Mein@Mail.de" ;E-Mail des Senders
recipient.s="Empfaenger@SeineMail.de";E-Mail des Empfängers
Username.s="Benutzername" ; Username
Password.s="XXXXXXX" ; hier dein Kennwort
smtpserver.s="mail.SMTP.DE" ; Hier bei Evanzo mail. + E-Mailaccount
subject.s="Diese Mail wurde von mir geschickt" ; Hier Betreffzeile
body.s="Das ist eine Mail, die ich mal testweise an mich selber ueber PB schicke" ; Hier der Text im Body
SendEMailInit()
SendEmail(Name,sender,recipient,Username,Password,smtpserver,subject,body)
Falls noch was geändert werden muss, wäre es ok, wenn ihr das hier posten würdet.
Bei mir hat es, so wie ich es angepasst habe, jedenfalls funktioniert.
Gruß,
Falko
Re: Mail-Lib - E-Mail versenden
Verfasst: 14.07.2012 17:43
von Kiffi
Hier die COMate-Variante (ungetestet):
Code: Alles auswählen
IncludePath "[DeinPfadZu]\COMatePLUS\" ; Pfad anpassen!
XIncludeFile "comateplus.pbi"
Define objMessage.COMateObject
objMessage = COMate_CreateObject("CDO.Message")
If objMessage
objMessage\SetStringProperty("Subject='Example CDO Message'")
objMessage\SetStringProperty("From='me@my.com'")
objMessage\SetStringProperty("To='test@paulsadowski.com'")
objMessage\SetStringProperty("HTMLBody='<h1>This is some sample message html.</h1>'")
objMessage\SetStringProperty("Bcc='you@your.com'")
objMessage\SetStringProperty("Cc='you2@your.com'")
objMessage\Invoke("Send")
objMessage\Release()
Else
Debug "!objMessage"
EndIf
Re: Mail-Lib - E-Mail versenden
Verfasst: 14.07.2012 18:00
von ts-soft
@Falko
Der Code funktioniert, mal sehen vielleicht überarbeite ich den mal, enthält ja viel unnötiges und Unicode wird der auch nicht mögen.
Der Code stammt IMHO aus diesem Board, aber das alte Archiv wurde ja gelöscht.
Re: Mail-Lib - E-Mail versenden
Verfasst: 14.07.2012 18:41
von Falko
ts-soft hat geschrieben:@Falko
Der Code funktioniert, mal sehen vielleicht überarbeite ich den mal, enthält ja viel unnötiges und Unicode wird der auch nicht mögen.
Der Code stammt IMHO aus diesem Board, aber das alte Archiv wurde ja gelöscht.
Danke Thomas,
das freut mich sehr.
Gruß,
Falko