Beiträge von Bitnugger

    Bei _OL_ItemFind bekomme ich die ersten 1-3 mal den @error 1001... davor wird _OL_ItemSend und _OL_ItemSendReceive ausgeführt, dann wird 1 Sekunde gewartet. 1 Sek. scheint wohl zu wenig zu sein, aber warum passiert das?


    Code
    > _OL_ItemFind($oOutlook = Object, "*\Postausgang ", 43, "[Subject]='Telefonnummern Kunden Tour 1 04.06.2020 23:00:42'", "", "", "", "", 2) @error = 1001, @extended = 0 $iOutlook_PID = 17060
    - _OL_ItemFind($oOutlook = Object, "*\Gesendete Elemente", 43, "[Subject]='Telefonnummern Kunden Tour 1 04.06.2020 23:00:42'", "", "", "", "", 2) @error = 0, @extended = 0 $iOutlook_PID = 17060
    > _OL_ItemFind($oOutlook = Object, "*\Postausgang ", 43, "[Subject]='Telefonnummern Kunden Tour 1 04.06.2020 23:00:42'", "", "", "", "", 2) @error = 1001, @extended = 0 $iOutlook_PID = 17060
    - _OL_ItemFind($oOutlook = Object, "*\Gesendete Elemente", 43, "[Subject]='Telefonnummern Kunden Tour 1 04.06.2020 23:00:42'", "", "", "", "", 2) @error = 0, @extended = 0 $iOutlook_PID = 17060
    > _OL_ItemFind($oOutlook = Object, "*\Postausgang ", 43, "[Subject]='Telefonnummern Kunden Tour 1 04.06.2020 23:00:42'", "", "", "", "", 2) @error = 0, @extended = 0 $iOutlook_PID = 17060
    - _OL_ItemFind($oOutlook = Object, "*\Gesendete Elemente", 43, "[Subject]='Telefonnummern Kunden Tour 1 04.06.2020 23:00:42'", "", "", "", "", 2) @error = 0, @extended = 0 $iOutlook_PID = 17060

    Ich vermute mal, dass diese Outlook Spezialität hier zuschlägt:

    Hehe... ja, das wird es wohl sein! Direkt nach _OL_Open wird die Outlook.exe mit ProcessExists gefunden, ist dann aber schnell wieder verschwunden.


    Tzzz... nun ja, man muss ergo sicherstellen, das die Outlook.exe bereits gestartet wurde, bevor man mit _OL_* arbeitet.

    Ich habe noch ein wenig experimentiert, denn es war mir zu grobschlächtig, mehrmals den kompletten Inhalt des Postausgangs/Posteingangs als Array zu holen, um mit _ArraySearch zu überprüfen, ob die gesuchte Mail darin enthalten ist.


    So kann man den kompletten Inhalt holen:

    $aItems = _OL_ItemFind($oOutlook, "*\Posteingang", $olMail, "", "", "", "", "", 2) ; EN = *\Inbox

    $aItems = _OL_ItemFind($oOutlook, "*\Postausgang", $olMail, "", "", "", "", "", 2) ; EN = *\Outbox


    So bekommt man jedoch nur die gesuchte Mail geliefert, insofern sie vorhanden ist:

    $aItems = _OL_ItemFind($oOutlook, "*\Posteingang", $olMail, "[Subject]='" & $sSubject & "'", "", "", "", "", 2) ; EN = *\Inbox

    $aItems = _OL_ItemFind($oOutlook, "*\Postausgang", $olMail, "[Subject]='" & $sSubject & "'", "", "", "", 2) ; EN = *\Outbox


    Jetzt bin ich allerdings sehr erstaunt, dass die zweite Variante nur dann funktioniert, wenn die Outlook.exe gestartet wurde, bevor das Objekt $oOutlook mit _OL_Open() erstellt wird!


    Hier liefert mir _OL_ItemFind folgende Fehlermeldung: @error = 3, @extended = 4

    ; @error |3 - Error accessing the specified folder. See @extended for errorcode returned by _OL_FolderAccess

    ; @extended |4 - Specified folder could not be found. @extended is set to the index of the subfolder in error (1 = root folder)


    Die Mail wird aber versandt... ich kann nur nicht via OutlookEX UDF darauf zugreifen.


    water , hast du eine Idee bzw. weißt du, warum das so ist?


    Das Script dazu (_OL_Mail_senden.au3) findet ihr im Anhang. Hier muss die Variable $sMeineMailadresse gesetzt werden.


    Wenn ich allerdings mit _OL_Check_InOutbox.au3 eine bereits vorhandene Nachricht abfrage, funktioniert die zweite Variante auch ohne dass Outlook gestartet wird. Hier muss die Variable $sSubject vor dem Start korrigiert werden.

    Da Sleep in Millisekunden angegeben wird, wird er die 10 Sekunden sicher überleben

    Hehe... oh ja, ich werde alt... ne, ich bin alt, und senil! :D


    Habe nun auch herausgefunden, wie ich den Postausgang überprüfe... schön zu wissen, aber nicht relevant für mich, da ich mit Thunderbird hantiere. 8o


    Ah ja: _Main musst Du noch irgendwo aufrufen :)

    Ok, da muss ich dir wohl zustimmen... habe es korrigiert. 8o


    Eine weitere Möglichkeit statt Sleep wäre es, den Ordner Postausgang auf Inhalt zu prüfen. Sobald er leer ist, müssten eigentlich alle Mails gesendet sein.

    Die Idee kam mir auch... doch auch hier muss ein Abbruch-Timer gesetzt werden, damit es nicht zur Endlosschleife wird, falls Outlook die Mail, aus welchen Gründen auch immer, nicht verschicken kann. Nötig wären dann aber zwei Timer... denn es ja nicht bekannt, wie lange es dauert, bis Outlook die Mail in den Ordner Postausgang verfrachtet hat... denn wenn zu früh geprüft wird, ob der Ordner leer ist, wird das ein Schuss ins eigene Knie. Und um ganz sicher zu gehen, reicht es nicht aus, zu prüfen, ob der Ordner leer ist... es muss geprüft werden, ob genau diese Mail nicht mehr im Ordner ist. Würde mich aber schon interessieren, wie man das prüfen kann...


    Das Sleep von 10 auf 10000 setzen... erhöht aber die Wahrscheinlichkeit extrem, das Windi vor Erhalt der Mail bereits verstorben ist. :rofl:

    _OL_ItemSendReceive läuft leider asynchron d.h. es wird nicht auf die Fertigstellung des Befehls gewartet.

    Baue doch nach _OL_ItemSendReceive und vor _OL_Close ein Sleep von z.B. 10 Sekunden ein.

    Das ist dann natürlich tückisch... ich würde das _OL_Open/_OL_Close aber auch nicht in der Funktion _Mail_senden platzieren, sondern es etwa so machen:

    Du hast das 2 mal drin ist das so korrekt.

    Nein, habe es korrigiert...


    Das hab ich so probiert funktioniert aber nicht wenn Outook nicht voher offen ist.

    offen ist... du meinst, wenn es nicht angezeigt wird? Denn gestartet wurde es ja... mit:

    Code
    Local $oOutlook = _OL_Open()
    If @error <> 0 Then Exit MsgBox(16, "OutlookEX UDF", "Error creating a connection to Outlook. @error = " & @error & ", @extended = " & @extended)


    Ich habe das jetzt mal so bei mir getestet...

    ...und die Mail kommt an!


    So sieht der Inhalt dann aus:

    Vorname Name 1

    Straße 1

    PLZ 1 Ort 1

    Privat: Telefonnr 1

    Firma: Telefonnr 2

    Mobil: Handy 1

    If StringLen($aTermine[$i][3]) = 4 Then
    $sBody &= "0" & $aTermine[$i][3] & " " & $aTermine[$i][4] & "<br>" ; PLZ Ort 4 stellig mit 0
    Else
    $sBody &= $aTermine[$i][3] & " " & $aTermine[$i][4] & "<br>" ; PLZ Ort 5 stellig
    Endif

    Das kannst du auch viel einfacher machen:

    AutoIt
    $sBody &= StringRight("0" & $aTermine[$i][3], 5) & " " & $aTermine[$i][4] & "<br>" ; PLZ Ort immer 5-stellig, anderfalls mit führender 0: Bsp.: 2151 ===>>> 02151


    Local $Meldung = GUICtrlCreateLabel("", $Poslinks - 150, $Poshoch +500, 550, 30)
    Local $Meldung = GUICtrlCreateLabel("Mail versendet an " &$Mailadress , $Poslinks - 100, $Poshoch + 500, 600, 30)

    Hier verwendest du für beide Labels dieselbe Variable... das macht keinen Sinn! Zudem sind sie die beiden Zeilen an dieser Stelle schlecht platziert... denn du willst die Labels ja sicher nicht in der Outlook-GUI erzeugen, was so auch nicht ginge, oder?

    Die Labels werden somit bei jedem Funktionsaufruf erzeugt... die erzeugt man vorher. Dann brauchst du in der Funktion _Mail_senden() nur den den Status und den Text entsprechend setzen.


    So z.B.:

    GUISetFont(18) sollte auch nicht in der Funktion _Mail_senden() stehen.


    GUICtrlSetColor ($Meldung , $COLOR_Green)

    Tja, für welches der beiden Labels wird sich GUICtrlSetColor wohl entscheiden? ;-)

    Von GUICtrlCreateLabel bekommst du eine Control-ID zurück... das würde ich immer als Kürzel im Variablennamen kenntlich machen:

    AutoIt
    Local $idMeldung_01 = GUICtrlCreateLabel("", $Poslinks - 150, $Poshoch +500, 550, 30)
    Local $idMeldung_02 = GUICtrlCreateLabel("Mail versendet an " &$Mailadress , $Poslinks - 100, $Poshoch + 500, 600, 30)
    GUICtrlSetColor($idMeldung_01, $COLOR_Green)
    GUICtrlSetColor($idMeldung_02, $COLOR_Green)

    Wobei hier der erste Labels keine für mich ersichtliche Funktion hat, denn er zeigt ja keinen Text an...


    Mail_senden() ... eigenen Funktionen solltest du immer ein _ voransetzen, damit sie besser von den nativen Funktionen zu unterscheiden sind. Also: _Mail_senden()


    Es ist ja schon mal prima, das du deinen Code in Code-Tags setzt... wenn du die Sytax-Hervorhebung nun noch auf AutoIt setzt, bekommst du 100 von 100 möglichen Punkten! 8o

    Kann man mit der OutookEx eine Mail senden, ohne das man nochmal extra Outlook öffnen muß.

    Wenn du eine Frage stellst, dann sollte der Satz auch mit einem Fragezeichen enden...


    Und ja, sicher geht das, sonst würde die OutookEx doch keinen Sinn machen.


    Outlook wird durch diese Zeile geöffnet:

    Global $oOutlook = _OL_Open()


    Globale Variablen haben übrigens nichts in einer Funktion zu suchen, da sollten nur Lokale Variablen deklariert werden.

    Wenn IP und/oder MAC bekannt sind, kannst du den ARP-Cache auslesen... denn da stehen die drin, wenn das Gerät verbunden ist.

    Hier noch mal mit GetWindowTextW...


    Evtl. auch interessant: Working with Strings

    Um das Ganze noch flexibler zu machen, kann man auch den Pointer und die Anzahl der Bytes übergeben:

    Die Anzahl der Bytes kannst du mit .sizeof ermitteln.

    Code
    # Compile x64: nim c -d:release -o:transfer.dll transfer.nim
    # Compile x86: nim c --cpu:i386 -d:release -o:transfer32.dll transfer.nim
    # * x64: Call sendData
    # * x86: Call sendData@4
    proc sendData(pData: ptr UncheckedArray[byte]): int {.stdcall,exportc,dynlib.} =
    var iCount: int = pData.sizeof
    for i in 0..iCount - 1:
    result += int(pData[i])
    pData[iCount - 1] = 0 # den letzten Wert auf 0 setzen (als Test)

    Hier noch eine etwas erweiterte Version von @Oscar's BassTest.nim, die nun (dank Oscar) auch mit UTF-8-Zeichen im Pfad klar kommt... und die mich viele graue Haare gekostet hat!


    Wird kein Parameter (Verzeichnis oder Datei) angegeben, öffnet sich ein FileDialog, mit dem eine oder mehrere Dateien geladen werden können. Erfolgt im FileDialog keine Auswahl, wird das Programm beendet.

    Alternativ kann aber auch eine Datei angegeben werden, die eine M3U-Playlist oder eine Liste von Verzeichnissen und /oder Dateien enhält. Dazu muss vor dem Dateiname ein -l: (kleines L) stehen.

    Zudem kann mit -v:n.n die Lautstärke gesetzt werden. Erlaubte Werte: 0.0 - 1.0. Default ist -v:0.5


    Bsp.:

    BassTest.exe

    BassTest.exe -v:0.3

    BassTest.exe "f:\Audio\MP3\International\S\Supertramp\1992 - The Very Best Of Supertramp Vol.02" ; Verzeichnis (ohne abschließenden Backslash)

    BassTest.exe "f:\Audio\MP3\International\S\Supertramp\1992 - The Very Best Of Supertramp Vol.02\01. Supertramp - Lady.mp3" ; Datei

    BassTest.exe -l:"f:\Audio\MP3\International\S\Supertramp\1992 - The Very Best Of Supertramp Vol.02\1992 - The Very Best Of Supertramp Vol.02.m3u" ; M3U-Playlist

    BassTest.exe "-l:m:\playlist.lst" ; Listfile, z.B. mit Total Commander (%UL)

    BassTest.exe -v:0.7 -l:"m:\playlist.lst" ; Listfile, z.B. mit Total Commander (%UL)


    Erfolgreich getestet habe ich folgende Formate: ".mp3", ".m4a", ".flac", ".wav", ".wma", ".aif", ".ac3", ".mp2". Mit entsprechenden Add-ons geht aber noch viel mehr.

    Dateien

    • BassTest.zip

      (372,9 kB, 1 Mal heruntergeladen, zuletzt: )

    Bei mir funktioniert es nun auch... nur sehr seltsam, dass es mit --app:lib nicht funktioniert.


    Hier hin habe ich die Archive mingw32.7z und mingw64.7z entpackt:

    c:\Users\<USER>\scoop\apps\nim\current\dist\

    mingw32

    mingw64

    nimble


    Hier die nim.cfg geändert:

    Allerdings darf man keine Direktive wie #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 setzen, dann gibt es in der Tat diverse Deklarationsmeldungen.

    Habe ich nicht... bis auf den Time Stamp, der als Kommentar eingefügt wird, ist das Script bis auf ein paar eliminierte Leerzeilen unverändert und schmeißt bei mir 4 Errors und 4 Warnings.


    Ich sehe aber gerade, dass Andy es zwischenzeitlich wohl geändert hat... hier die Version mit ein paar eliminierten Leerzeilen, die ich via Copy-Button in SciTE eingefügt hatte:


    Und ja, die aktuelle Version funktioniert, wenn die Zeile "Global Const $SRCCOPY = 0x00CC0020" eingefügt wird.

    Ohne weitere Infos ist doch alles nur :Glaskugel:

    Eben... sagte ich doch bereits in meinem ersten Post! ;)


    Allerdings funktioniert dein letztes Script bei mir nicht, weil einige Variablen nicht deklariert wurden: