Mail-Lib - E-Mail versenden

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Mail-Lib - E-Mail versenden

Beitrag von kunstlust »

@ts-soft
Sorry das verstehe ich nur begrenzt, was ist für mich zu tun, was muss ich wo setzen?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mail-Lib - E-Mail versenden

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Mail-Lib - E-Mail versenden

Beitrag von kunstlust »

@ts-soft
Welchen Weg würdest du gehen, über die API von Windows?
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Mail-Lib - E-Mail versenden

Beitrag von kunstlust »

Ich habe den Thread abgeschaltet, weil nach Einbindung der "UserLibThreadSafe" noch mehr Fehler aufgetreten sind und ich die Funktion nicht brauche
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mail-Lib - E-Mail versenden

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
kunstlust
Beiträge: 259
Registriert: 12.04.2012 23:47
Wohnort: Hannover
Kontaktdaten:

Re: Mail-Lib - E-Mail versenden

Beitrag 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

Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: Mail-Lib - E-Mail versenden

Beitrag 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 :wink:

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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Mail-Lib - E-Mail versenden

Beitrag 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
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mail-Lib - E-Mail versenden

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: Mail-Lib - E-Mail versenden

Beitrag 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. :allright:

Gruß,
Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten