Seite 1 von 2
Email Lesen
Verfasst: Mi, 18. Mai 2016 9:14
von Rolf Ramacher
guten Morgen zusammen,
ich lese emails mit Hilfe von Marshall Soft- klappt und funkt. gut. Nur eines.
es funkt. bisher nur wenn emails im Posteingang bereits vorhanden sind. Ich möchte aber das Programm starten und das dann eingehende emails erkannt und verarbeitet werden.
xseegetemailcount
liefert die gesamte anzahl der emails
starte ich das Programm - kopiere die email hinein
die Variable nNbrMsg bleibt bei Null
Code: Alles auswählen
do while lWeiter = .t.
nNbrMsg:=XseeGetEmailCount(0)
nMsgNbr:=1
* decode downloaded email ?
if nDecodeFlag = TRUE
? "Email will be decoded"
else
* do not decode downloaded files !
? "Email will NOT be decoded!"
nCode = XseeIntegerParam(0, SEE_RAW_MODE, 1)
endif
msgbox(var2lchar(nNbrMsg))
If nNbrmsg >0
For i = 1 to nNbrMsg
If ((nMsgNbr>0) .AND. (nMsgNbr <= nNbrMsg))
.... hier macht er seinen Teil.
Endif
nMsgNbr++
Next i
Else
nNbrMsg:=XseeGetEmailCount(0)
nMsgNbr:=1
msgbox(var2lchar(nNbrMsg))
Endif
msgbox("nach endif")
sleep(1000)
enddo
Re: Email Lesen
Verfasst: Mi, 18. Mai 2016 9:30
von brandelh
Mit Marshall kenn ich mich nicht aus, aber je nach Zugang (POP3 oder IMAP) muss man auf dem Server aktiv nachfragen ob was neues da ist.
Du schreibst, dass du die vorhandenen erkennst aber keine neuen, das hört sich nach Cache an, es müsste ein refresh oder "neue eMail suchen" Befehl geben.
Re: Email Lesen
Verfasst: Mi, 18. Mai 2016 9:44
von Scarmo
Hallo Rolf
Oder einfach einen Thread erstellen, welcher nichts anderes macht wie alle 60 Sekunden nach neuen Emails schaut.
Gruss
Marco
Re: Email Lesen
Verfasst: Mi, 18. Mai 2016 10:30
von Herbert
5 bis 10 Minuten genügen auch
Re: Email Lesen
Verfasst: Mi, 18. Mai 2016 11:50
von Tom
Das ist ein Klassiker für SetTimerEvent. Dann kann man sich die DO ... WHILE-Schleife auch sparen. BTW, "nDecodeFlag" wird nach meinem Dafürhalten nicht in der Funktion ermittelt, sondern steht offenbar schon vorher fest. Das dürfte nicht funktionieren. BTW2: "DO WHILE lWeiter = .T." ist syntaktisch richtig, aber bei logischen Variablen genügt "DO WHILE lWeiter".
Re: Email Lesen
Verfasst: Do, 19. Mai 2016 14:20
von Rolf Ramacher
Hallo Tom,
kurze Nachfrage: Der SetTimerEvent steht dann in der Proc Main. SetTimerEvent rufe ich dann diese Function auf, die das ganze abrufen der email und verarbeiten durchführt
Ist das so richtig ?
Re: Email Lesen
Verfasst: Do, 19. Mai 2016 14:45
von Tom
Hallo, Rolf.
Du kannst den Aufruf platzieren, wo Du möchtest - in der MAIN() bietet sich allerdings an. Es sähe dann wie folgt aus:
Code: Alles auswählen
SetTimerEvent(<nHundertstelSekunden>,<bAufrufcodeblock>)
also beispielsweise
Was dazu führen würde, dass die Funktion "CheckMails" alle 5 Sekunden aufgerufen wird. Darin bräuchtest Du dann keine endlose DO-WHILE-Schleife mehr, ansonsten könnte sie - vorausgesetzt, sie funktioniert - so bleiben, wie sie derzeit ist.
Achtung: Es darf immer nur ein Timer-Event geben; der nächste Aufruf killt den vorigen. Im Prinzip ist das eine Kapselung des normalen Multithreadings (arbeitet intern auch so), mit dem Unterschied, dass es eben einen Timer gibt. Den kann man in Threads allerdings auch selbst verwirklichen. Wenn man mehrere Funktionalitäten innerhalb desselben Timers benötigt, fasst man sie in einer Funktion zusammen.
Edit: Es
läuft auch in einem Thread. Das bedeutet, dass Du PRIVATEs oder geöffnete Workareas nicht siehst. Du musst Dich um derlei innerhalb der Funktion kümmern.
Re: Email Lesen
Verfasst: Do, 19. Mai 2016 14:46
von Werner_Bayern
Servus Rolf,
das sieht etwas wirr aus. Ich mache das so:
Code: Alles auswählen
oStatus2:setCaption("Suche nach Nachrichten...")
nNbrMsg = XseeGetEmailCount(0)
if nNbrMsg < 0
oFehler:setCaption(ShowError(nNbrMsg))
return .f.
else
oStatus2:setCaption(ltrim(str(nNbrMsg)) + " Nachricht(en) vorhanden.")
If nNbrMsg = 0
oFehler:setCaption("Schliesse Verbindung.")
oStatus1:setCaption("Keine neuen Mails vorhanden!")
oStatus2:setCaption("")
nCode = XseeClose(0)
nCode = XseeRelease()
return .t.
endif
// Hier Mails holen mit XseeGetEmailFile!
Re: Email Lesen
Verfasst: Do, 19. Mai 2016 14:52
von Werner_Bayern
Servus Rolf,
ein fixer Timer ist hier evtl. gefährlich, wenn die Abfragen in der Zeit nicht fertig werden, oder z. B. eine Wartezustand (Fehlermeldung etc.) erzeugt wird.
Dann wird die Funktion evtl. nochmal aufgerufen, obwohl die vorherige Abfrage noch läuft.
Ich mache das daher mit einem eigenen Thread und frag immer vor dem nächsten Aufruf auf oThread:active ab. Ist ja sehr einfach zu realisieren - wie Tom auch schon indirekt empfiehlt.
Re: Email Lesen
Verfasst: Do, 19. Mai 2016 15:10
von Tom
Ich mache das mit Get-Set-Funktionen:
Code: Alles auswählen
SetTimerEvent(100,{||MacheIrgendWas()})
FUNCTION MacheIrgendWas()
IF IchMacheSchonIrgendwas()
RETURN NIL
ENDIF
IchMacheSchonIrgendwas(.T.)
... Code ...
IchMacheSchonIrgendwas(.F.)
RETURN NIL
FUNCTION IchMacheSchonIrgendwas(lSet)
STATIC lIchMacheWas := .F.
IF PCOUNT()>0
lIchMacheWas := lSet
ENDIF
RETURN lIchMacheWas
Re: Email Lesen
Verfasst: Sa, 28. Mai 2016 12:21
von Rolf Ramacher
Guten Morgen Werner,
so sieht die PRG jetzt aus nach deinem vorschlag, aber jetzt passiert gar nichts. ergibt zwar Meldung ab, aber kein Download und kein Löschen der email
Code: Alles auswählen
* connect to POP3 server
? "Connecting to POP3 server " + LTrim(Str(nProxyPort))
nCode = XseePop3ConnectSSL(0, nProxyPort, nPop3Port, @cPop3Server, @cPop3User, @cPop3Pass, Chr(0))
if nCode < 0
ShowError(nCode)
return
endif
* get # messages waiting
? "Getting message status..."
* decode downloaded email ?
if nDecodeFlag = TRUE
? "Email will be decoded"
else
* do not decode downloaded files !
? "Email will NOT be decoded!"
nCode = XseeIntegerParam(0, SEE_RAW_MODE, 1)
endif
do while lWeiter = .t.
nNbrMsg:=XseeGetEmailCount(0)
msgbox(var2lchar(nNbrMsg))
For i = 1 to nNbrMsg
? "Reading Message ", LTRIM(STR(nMsgNbr)), ", please wait..."
nCode = XseeGetEmailFile(0, nMsgNbr, @cEmailName, @cEmailDir, @cAttachDir)
if nCode < 0
ShowError(nCode)
* return
endif
? "Saved as ", LTRIM(cEmailName)
* display "From:" header
cBuffer = SPACE(256)
nCode = XseeGetHeader(0, SEE_GET_FROM, @cBuffer, 255)
if nCode > 0
? "From: " + Left(cBuffer, nCode)
endif
cHeader:=cBuffer
* display "Subject:" header
cBuffer = SPACE(256)
nCode = XseeGetHeader(0, SEE_GET_SUBJECT, @cBuffer, 255)
if nCode > 0
? "Subject: " + Left(cBuffer, nCode)
endif
cBetreff:=cBuffer
* get list of attachment file names
cBuffer = SPACE(1024)
nCode = XseeDebug(0, SEE_GET_ATTACH_NAMES, @cBuffer, 1024)
if nCode > 0
? "Attachment names are:"
? Left(cBuffer, nCode)
endif
* get list of attachment file types
cBuffer = SPACE(1024)
nCode = XseeDebug(0, SEE_GET_ATTACH_TYPES, @cBuffer, 1024)
if nCode > 0
? "Attachment types are:"
? Left(cBuffer, nCode)
endif
Do Case
Case At("visulution",cUser) >0
// email-empfänger rauslesen ??
If substr(cBetreff,1,5) = "12345"
aDir:=Directory((cAttachDir+"\*.*") )
For z = 1 to Len(aDir)
cFile:=aDir[z][1]
nPos:=At("-",cFile)
cNeufile:=substr(cFile,nPos+1)
Copy File( (cAttachDir+"\"+cfile)) to (cImport+"\"+cNeufile )
Next z
lLoesch:=.t.
Else
lLoesch:=.f.
Endif
FileDelete( (cAttachDir+"\*.*") )
Case At("transfer",cUser) >0
// abfrage nach KD-Nr. im Betreff
If substr(cBetreff,1,5) = "12345"
aDir:=Directory((cAttachDir+"\*.*") )
For z = 1 to Len(aDir)
cFile:=aDir[z][1]
nPos:=At("-",cFile)
cNeufile:=substr(cFile,nPos+1)
Copy File( (cAttachDir+"\"+cfile)) to (cImport+"\"+cNeufile )
Next z
lLoesch:=.t.
Else
lLoesch:=.f.
Endif
FileDelete( (cAttachDir+"\*.*") )
Case At("inventur",cUser) >0
aDir:=Directory((cAttachDir+"\*.*") )
For z = 1 to Len(aDir)
cFile:=aDir[z][1]
nPos:=At("-",cFile)
cNeufile:=substr(cFile,nPos+1)
Copy File( (cAttachDir+"\"+cfile)) to (cVerz+"\"+cNeufile )
Next z
lLoesch:=.t.
FileDelete( (cAttachDir+"\*.*") )
EndCase
* uncomment the following to delete the email
*** deleting message from server
If lLoesch = .t.
nCode = XseeDeleteEmail(0, nNbrMsg)
? "Message ", LTRIM(STR(nNbrMsg)), " deleted from server."
Endif
Next i
lLoesch:=.f.
If File("emaillesen.txt")
lWeiter:=.f.
Endif
sleep(1000)
enddo
? "Closing connection."
nCode = XseeClose(0)
nCode = XseeRelease()
FErase("emaillesen.txt")
return
Re: Email Lesen
Verfasst: Mi, 08. Jun 2016 15:25
von Rolf Ramacher
Hi zusammen
ich komme irgendwie nicht so ganz weiter. Hier wie der Vorschlag von Werner. Aber er bleibt bei einer email stehen. sobald neue email reinkommen. beim ersten mal liest er die richtige Anzahl der vorhandenen emails. danach bleibt er bei Null
ich kann aber nicht erkennen warum ?
Code: Alles auswählen
do while lWeiter = .t.
nNbrMsg:=XseeGetEmailCount(0)
msgbox(var2lchar(nNbrMsg))
For i = 1 to nNbrMsg
lLoesch := .f.
? "Reading Message ", LTRIM(STR(nNbrMsg)), ", please wait..."
nCode = XseeGetEmailFile(0, nNbrMsg, @cEmailName, @cEmailDir, @cAttachDir)
if nCode < 0
ShowError(nCode)
* return
endif
? "Saved as ", LTRIM(cEmailName)
* display "From:" header
cBuffer = SPACE(256)
nCode = XseeGetHeader(0, SEE_GET_FROM, @cBuffer, 255)
if nCode > 0
? "From: " + Left(cBuffer, nCode)
endif
cHeader:=cBuffer
* display "Subject:" header
cBuffer = SPACE(256)
nCode = XseeGetHeader(0, SEE_GET_SUBJECT, @cBuffer, 255)
if nCode > 0
? "Subject: " + Left(cBuffer, nCode)
endif
cBetreff:=cBuffer
* get list of attachment file names
cBuffer = SPACE(1024)
nCode = XseeDebug(0, SEE_GET_ATTACH_NAMES, @cBuffer, 1024)
if nCode > 0
? "Attachment names are:"
? Left(cBuffer, nCode)
endif
* get list of attachment file types
cBuffer = SPACE(1024)
nCode = XseeDebug(0, SEE_GET_ATTACH_TYPES, @cBuffer, 1024)
if nCode > 0
? "Attachment types are:"
? Left(cBuffer, nCode)
endif
--- hier plausibilitätsprüfungen
* uncomment the following to delete the email
*** deleting message from server
If lLoesch = .t.
nCode = XseeDeleteEmail(0, nNbrMsg)
? "Message ", LTRIM(STR(nNbrMsg)), " deleted from server."
Endif
Next i
lLoesch:=.f.
If File("emaillesen.txt")
lWeiter:=.f.
Endif
sleep(1000)
enddo
Re: Email Lesen
Verfasst: Do, 09. Jun 2016 1:35
von Werner_Bayern
Servus Rolf,
es fehlt noch einiges an Code, z. B. Dein XseeSetProxySSL().
Du setzt lWeiter nach dem ersten Durchlauf auf .f., kann es daran liegen?
Re: Email Lesen
Verfasst: Do, 09. Jun 2016 8:25
von Rolf Ramacher
Guten Morgen Werner,
lWeiter wird auf .f. wenn die Datei "emaillesen.txt" existiert. dann wird das programm beendet. die xseeset - Funktionen habe ich weiter vorher definiert auch wie decoderflag auf .t. vor der do while schleife.
oder müssen die da auch rein. ?
vor der do while schleife
Code: Alles auswählen
nCode = XseeAttach(1, SEE_KEY_CODE)
if nCode < 0
? "Key code = " + LTRIM(STR(SEE_KEY_CODE))
? "Error code = " + LTRIM(STR(nCode)) + ": Cannot attach SEE (check key code)"
return
endif
* registered version always returns 999
if nCode <> 999
? Ltrim(Str(nCode)) + " days remaining for evaluation"
endif
* enable SEE logging
nCode = XseeStringParam(0,SEE_LOG_FILE, @cLogName)
* decode unnamed attachments (if any)
nCode = XseeIntegerParam(0, SEE_DECODE_UNNAMED, 1)
* prefix attachment filenames with "101-", "102-", etc.
nCode = XseeIntegerParam(0, SEE_FILE_PREFIX, 101)
* direct SEE to make an undecoded copy when seeGetEmailFiles is called
* (this applies to non-raw mode only)
nCode = XseeIntegerParam(0, SEE_SET_RAWFILE_PREFIX, Asc("_") )
* pass POP3 proxy server info to SEE
Kode = XseeSetProxySSL(0, 1, @cProxyDir, @cProxyCert, @cProxyExe)
if Kode < 0
ShowError(Kode)
return
else
? "Proxy parameters set"
endif
* connect to POP3 server
? "Connecting to POP3 server " + LTrim(Str(nProxyPort))
nCode = XseePop3ConnectSSL(0, nProxyPort, nPop3Port, @cPop3Server, @cPop3User, @cPop3Pass, Chr(0))
if nCode < 0
ShowError(nCode)
return
endif
* get # messages waiting
? "Getting message status..."
* decode downloaded email ?
if nDecodeFlag = TRUE
? "Email will be decoded"
else
* do not decode downloaded files !
? "Email will NOT be decoded!"
nCode = XseeIntegerParam(0, SEE_RAW_MODE, 1)
endif
Re: Email Lesen
Verfasst: Sa, 11. Jun 2016 15:18
von Werner_Bayern
Servus Rolf,
der Fehler ist relativ einfach:
Code: Alles auswählen
For i = 1 to nNbrMsg
lLoesch := .f.
? "Reading Message ", LTRIM(STR(nNbrMsg)), ", please wait..."
nCode = XseeGetEmailFile(0, nNbrMsg, @cEmailName, @cEmailDir, @cAttachDir)
Du liest immer nur die letzte Mail mit nNbrMsg. Hier gehört i rein:
Code: Alles auswählen
nCode = XseeGetEmailFile(0, i, @cEmailName, @cEmailDir, @cAttachDir)
Re: Email Lesen
Verfasst: Sa, 11. Jun 2016 15:42
von Werner_Bayern
Hier der überarbeitete Code, der funktioniert:
Code: Alles auswählen
do while lWeiter = .t.
nNbrMsg:=XseeGetEmailCount(0)
For i = 1 to nNbrMsg
? "Reading Message ", LTRIM(STR(i)), ", please wait..."
nCode = XseeGetEmailFile(0, nNbrMsg, @cEmailName, @cEmailDir, @cAttachDir)
if nCode < 0
? ShowError(nCode)
return
endif
? "Saved as ", LTRIM(cEmailName)
* display "From:" header
cBuffer = SPACE(256)
nCode = XseeGetHeader(0, SEE_GET_FROM, @cBuffer, 255)
if nCode > 0
? "From: " + Left(cBuffer, nCode)
endif
* display "Subject:" header
cBuffer = SPACE(256)
nCode = XseeGetHeader(0, SEE_GET_SUBJECT, @cBuffer, 255)
if nCode > 0
? "Subject: " + Left(cBuffer, nCode)
endif
* get list of attachment file names
cBuffer = SPACE(1024)
nCode = XseeDebug(0, SEE_GET_ATTACH_NAMES, @cBuffer, 1024)
if nCode > 0
? "Attachment names are:"
? Left(cBuffer, nCode)
endif
* get list of attachment file types
cBuffer = SPACE(1024)
nCode = XseeDebug(0, SEE_GET_ATTACH_TYPES, @cBuffer, 1024)
if nCode > 0
? "Attachment types are:"
? Left(cBuffer, nCode)
endif
// --- hier plausibilitätsprüfungen
*** deleting message from server
If lLoesch = .t.
nCode = XseeDeleteEmail(0, i)
? "Message ", LTRIM(STR(i)), " deleted from server."
Endif
Next i
lLoesch:=.f.
If File("emaillesen.txt")
lWeiter:=.f.
Endif
sleep(1000)
enddo
nCode = XseeClose(0)
nCode = XseeRelease()
return
Achte auf die i ersetzt bei nNbrMsg.
Re: Email Lesen
Verfasst: Sa, 11. Jun 2016 20:55
von Hans Zethofer
jetzt hast wieder die falsche Var drinnen
Code: Alles auswählen
nCode = XseeGetEmailFile(0, nNbrMsg, @cEmailName, @cEmailDir, @cAttachDir)
Re: Email Lesen
Verfasst: Sa, 11. Jun 2016 23:20
von Werner_Bayern
Danke (mein Testprogramm für Rolf schaut anders aus...)
Re: Email Lesen
Verfasst: Mo, 20. Jun 2016 15:16
von Rolf Ramacher
Hallo Werner
so ich habe es jetzt geändert. ich habe es nochmal geprüft sind 2 emails vorhanden werden beide gelesen und auch gelöscht. Aber wenn ich das Programm starte und danach eine email reinkommt. bleibt
nNbrmsg auf Null stehen
ist noch irgendwo etwas falsch??
Code: Alles auswählen
do while lWeiter = .t.
nNbrMsg:=XseeGetEmailCount(0)
msgbox(var2lchar(nNbrMsg))
For i = 1 to nNbrMsg
lLoesch := .f.
? "Reading Message ", LTRIM(STR(i)), ", please wait..."
nCode = XseeGetEmailFile(0, i, @cEmailName, @cEmailDir, @cAttachDir)
if nCode < 0
ShowError(nCode)
* return
endif
? "Saved as ", LTRIM(cEmailName)
* display "From:" header
cBuffer = SPACE(256)
nCode = XseeGetHeader(0, SEE_GET_FROM, @cBuffer, 255)
if nCode > 0
? "From: " + Left(cBuffer, nCode)
endif
cHeader:=cBuffer
* display "Subject:" header
cBuffer = SPACE(256)
nCode = XseeGetHeader(0, SEE_GET_SUBJECT, @cBuffer, 255)
if nCode > 0
? "Subject: " + Left(cBuffer, nCode)
endif
cBetreff:=cBuffer
* get list of attachment file names
cBuffer = SPACE(1024)
nCode = XseeDebug(0, SEE_GET_ATTACH_NAMES, @cBuffer, 1024)
if nCode > 0
? "Attachment names are:"
? Left(cBuffer, nCode)
endif
* get list of attachment file types
cBuffer = SPACE(1024)
nCode = XseeDebug(0, SEE_GET_ATTACH_TYPES, @cBuffer, 1024)
if nCode > 0
? "Attachment types are:"
? Left(cBuffer, nCode)
endif
* uncomment the following to delete the email
*** deleting message from server
If lLoesch = .t.
nCode = XseeDeleteEmail(0, i)
? "Message ", LTRIM(STR(nNbrMsg)), " deleted from server."
Endif
Next i
lLoesch:=.f.
If File("emaillesen.txt")
lWeiter:=.f.
Endif
sleep(1000)
enddo
? "Closing connection."
nCode = XseeClose(0)
nCode = XseeRelease()
FErase("emaillesen.txt")
Re: Email Lesen
Verfasst: Mo, 20. Jun 2016 15:31
von brandelh
So wie ich das sehe wird die Schleife verlassen sobald die Datei "emaillesen.txt" vorhanden ist.
Dann wird die Datei gelöscht.
Rufst du diese Funktion alle z.b. 5 Minuten auf, sollte das so funktionieren wie du willst, vorausgesetzt die Infos von "emaillesen.txt" werden verarbeitet, das hab ich jetzt nicht geprüft.
Re: Email Lesen
Verfasst: Mo, 20. Jun 2016 15:39
von Rolf Ramacher
Hi Hubert,
nein das hast du wohl falsch verstanden. Was in emaillesen.txt drin steht ist egal. Diese Datei dient nur, um die Applikation zu beenden. Das Programm läuft ja - nur die Varialbe bleibt auf Null stehen.
Das ist was ich nicht verstehe.
Re: Email Lesen
Verfasst: Mo, 20. Jun 2016 16:34
von Werner_Bayern
Servus Rolf,
wie bereits telefonisch besprochen, ich hab in meiner Endlosschleife auch das Verbinden und Schließen des Mailservers mit drin, so funktioniert es seit Jahren. Teste das bitte mal bei Dir.
Re: Email Lesen
Verfasst: Di, 21. Jun 2016 9:11
von Rolf Ramacher
guten Morgen @Werner
wenn ich dieses
Code: Alles auswählen
nCode = XseeClose(0)
nCode = XseeRelease()
Kode = XseeSetProxySSL(0, 1, @cProxyDir, @cProxyCert, @cProxyExe)
if Kode < 0
ShowError(Kode)
return
else
? "Proxy parameters set"
endif
* connect to POP3 server
? "Connecting to POP3 server " + LTrim(Str(nProxyPort))
nCode = XseePop3ConnectSSL(0, nProxyPort, nPop3Port, @cPop3Server, @cPop3User, @cPop3Pass, Chr(0))
if nCode < 0
ShowError(nCode)
return
endif
* get # messages waiting
? "Getting message status..."
* decode downloaded email ?
if nDecodeFlag = TRUE
? "Email will be decoded"
else
* do not decode downloaded files !
? "Email will NOT be decoded!"
nCode = XseeIntegerParam(0, SEE_RAW_MODE, 1)
endif
innerhalb der Do while-Schleife aber nach dem
Next i
einfüge - wird das Programm beendet. Sieht das bei dir anders aus? Was muss ich machen?
Re: Email Lesen
Verfasst: Di, 21. Jun 2016 15:53
von Rolf Ramacher
Ich glaube ich habs.
danke
Re: Email Lesen
Verfasst: Mi, 22. Jun 2016 12:45
von Werner_Bayern
Bitte
Das heißt, es läuft jetzt und Du bekommst auch zwischenzeitlich neue Mails?