Email senden TLS

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Re: Email senden TLS

Beitrag 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
Bernd Reinhardt
fa.reinhardt@gmx.de
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Email senden TLS

Beitrag 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?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Email senden TLS

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Email senden TLS

Beitrag 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.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Email senden TLS

Beitrag 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 !
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Email senden TLS

Beitrag 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.
Gruß
Hubert
Antworten