Seite 2 von 2

Re: Email senden TLS

Verfasst: Sa, 25. Feb 2017 13:12
von Bernd Reinhardt
Hallo
Danke für den Hinweis.
Die Meldung scheint aber vom SMTP-Client zu kommen. Die Datei wird später geschrieben.
Anbei die msgbox mit der Fehlermeldung.

[img]
http://b-reinhardt.de/images/meldung.jpg
[/img]

Am Ende zeige ich die Meldung in einer MSGBOX an. Dazu wird die errorlog gelesen.
Schreiben der Datei sollte somit möglich sein.
Anbei die Anzeigeroutine und der errorhandler.

Code: Alles auswählen

      if lTestMail
         cSubject := "Meine Email " + " Zeit: " + Time() + "  Datum: " + dtoc(date())
         if fSendeFile(cSubject, cDatei, cMyVerzeichnis, cWas, lDemo)
            msgbox("Email konnte verschickt werden ")
         else
            if file(cMyVerzeichnis + "email.log")
               msgbox(memoread(cMyVerzeichnis + "email.log"))  //email.log wird vom logwriter erstellt / geändert
            endif
         endif
      endif

Code: Alles auswählen

/* Klasse für das Schreiben der Logdatei wenn ein Fehler auftritt, bzw. auch wenn alles glatt läuft  */
CLASS LogWriter
   VAR lIsError
   VAR aMessage
   VAR cLogFile

 EXPORTED:

   INLINE METHOD init( cLogFile )
      ::cLogFile := cLogFile
      ::aMessage := {}
      ::lIsError := .F.
   RETURN


   INLINE METHOD write( cMsg )
      AAdd( ::aMessage, cMsg )
   RETURN self


   INLINE METHOD logError( cMsg )
      ::lIsError := .T.
      ::write( cMsg )
   RETURN self


   INLINE METHOD isError
   RETURN ::lIsError


   INLINE METHOD writeLogFile
      LOCAL nHandle

      IF .NOT. FExists( ::cLogFile )
         nHandle := FCreate( ::cLogFile )
      ELSE
         nHandle := FOpen( ::cLogFile )
         FSeek( nHandle, 0, FS_END )
      ENDIF

      AEval( ::aMessage, {|cMsg| FWrite( nHandle, cMsg + CRLF ) } )
      FClose( nHandle )
   RETURN self

ENDCLASS
Gruß
Bernd

Re: Email senden TLS

Verfasst: So, 26. Feb 2017 16:34
von Werner_Bayern
Servus Bernd,

Google sagt dazu:
WSAENOTSOCK10038
Socket operation on nonsocket.
Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist. Entweder hat der Sockethandleparameter nicht auf einen gültigen Socket verwiesen, oder für select war ein Member einer fd_set-Struktur nicht gültig.
Klingt ähnlich wie in Deiner METHOD writeLogFile: Du prüfst nicht, ob das zurückgegebene Handle gültig ist, sondern verlässt Dich drauf.

Ich würde mal den smtpClient-Aufruf so machen:

Code: Alles auswählen

if empty(oSmtpClient := SMTPClient():new(cMailServer,nPort,, oLog, 2 ))
    Fehler
    return .f.
endif
Ansonsten kann es doch nur eine Firewall sein, oder / und AV, die was blocken?
Wenn ich mir die Anmerkungen deines Kunden nochmal durchlese, solltest Du mit den 2 Anmerkungen das Problem finden.
Ich weiß nicht, ob die Socket-Funktionen TEMP-Dateien benötigen? Sind die Umgebungsvariablen bei dem Standardanwender korrekt auf ein Verzeichnis gesetzt, wo er nicht nur Änderungsrechte hat, sondern auch Schreibrechte?

Re: Email senden TLS

Verfasst: Mo, 27. Feb 2017 8:35
von brandelh
Die Fehlermeldung besagt eindeutig, dass der SMTP Server nicht mit dem Mail Server, also der Gegenseite (Provider) connecten konnte.

Code: Alles auswählen

     IF .NOT. oSmtpClient:connect(cLoginName, cPasswort)
      oLog:logError( ERR_MSG_CONNECTION )
Ich denke dass dies hier versucht wurde und dann die Fehlermeldung geschrieben wurde (eventuell mal absichern)
Am Programmende wird dann von deiner msgbox() der Fehler ausgegeben.

Ich weiß nicht welchen LOG Level du eingestellt hast, aber ich denke die Angaben in cLoginName passen nicht zum Mail Konto.
Eventuell auch Kennwort oder Verschlüsselung ... aber ich hatte bei mir immer genauere Aussagen im LOG stehen.

Re: Email senden TLS

Verfasst: Mo, 27. Feb 2017 15:55
von Werner_Bayern
brandelh hat geschrieben:Ich weiß nicht welchen LOG Level du eingestellt hast, aber ich denke die Angaben in cLoginName passen nicht zum Mail Konto.
Eventuell auch Kennwort oder Verschlüsselung ... aber ich hatte bei mir immer genauere Aussagen im LOG stehen.
Nein, siehe Anmerkungen seines Kunden:
Grundsätzlich ist es so, dass bei einem Standardanwender, der auf seinem Homelaufwerk Änderungsrechte hat, es zur Fehlermeldung kommt. Auf Lokallaufwerk D: funktioniert es, dort hat der Anwender Verwaltungsrechte. Wenn ich mich als Domainadmin anmelde, kann ich das Programm auch vom Homelaufwerk H: starten, es funktioniert, hierbei habe ich Verwaltungsrechte. Können Sie mal in diese Richtung testen, wofür die Verwaltungsrechte benötigt werden? Ist bei uns leider ein Problem, da die höchste Berechtigungsstufe für einen Standardanwender „Ändern“ ist.

Re: Email senden TLS

Verfasst: Di, 28. Feb 2017 7:40
von brandelh
Wenn es an den Schreibrechten läge, könnte das ja nur den LOG-Writer betreffen, so habe ich erlebt,
dass EXE auf einem read only einwandfrei laufen bis sie eine XPPERROR.LOG schreiben wollen, die fehlt und das Programm ist auch weg (Web-Server CGI Anwendung).

Wenn das der Fall wäre, dürfte aber weder eine LOG auf der Platte liegen, noch der MsgBox() Aufruf erreicht werden.
Es kommt aber eine Rückmeldung, wobei es auch sein könnte, dass das connect überhaupt keine Antwort erhält und per TimeOut aussteigt.
Kann Outlook mit den Rechten eMails versenden ?

Am Besten mal mit gleichen Rechten z.B. blat oder Outlook testen.
Eventuell sind die DAO Routinen von M$ auch besser geeignet.

Ich selbst arbeite immer mit Standarduser und damit geht es ohne Probleme, nachdem man in der Firewall die EXE freigeschaltet hat !

Re: Email senden TLS

Verfasst: Di, 28. Feb 2017 8:13
von brandelh
Ich meinte natürlich nicht DAO sondern CDO:

viewtopic.php?f=28&t=7726&p=85774&hilit=email+smtp+cdo#p85774

Mich irritiert die Aussage "Ändern" ... darf der eine neue Datei anlegen (create) und eventuell eine bestehende löschen (delete) ?
Beides könnte nötig sein, aber bis auf die - offensichtlich ja erstellte LOG-Datei (zumindest hab ich das so verstanden) - sollte die SMTP Funktion, keine lokalen Platten nutzen !
Ach ja die Anhänge, sind die mit komplettem Pfad hinterlegt, das sollte man immer machen, da sonst oft das EXE Verzeichnis benutzt wird.

Pfade sollte man übrigens aus der Umgebung auslesen:

APPDATA=C:\Users\...\AppData\Roaming
COMPUTERNAME=...
HOMEDRIVE=C:
HOMEPATH=\Users\...
LOCALAPPDATA=C:\Users\...\AppData\Local
LOGONSERVER=\\...
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
PUBLIC=C:\Users\Public
TEMP=C:\Users\...\AppData\Local\Temp
TMP=C:\Users\...\AppData\Local\Temp
USERDOMAIN=...
USERNAME=...

welche jetzt genau für was geeignet ist weiß ich nicht, TEMP sollte eigentlich ziemlich viel Rechte haben.