AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Indy - Mails Abrufen - Socket-Fehler # 10054 Verbindung von Peer zurückgesetzt.

Indy - Mails Abrufen - Socket-Fehler # 10054 Verbindung von Peer zurückgesetzt.

Ein Thema von erich.wanker · begonnen am 11. Jan 2018 · letzter Beitrag vom 29. Jan 2018
Antwort Antwort
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
427 Beiträge
 
Delphi XE4 Professional
 
#1

Indy - Mails Abrufen - Socket-Fehler # 10054 Verbindung von Peer zurückgesetzt.

  Alt 11. Jan 2018, 12:25
Hallo Leute,

ich habe einen Dienst, der Mails alle 10 Minuten abruft
Aber ich bekomme ab und zu "Socket-Fehler # 10054Die Verbindung wurde von Peer zurückgesetzt."

Dann muß ich den Dienst neu starten, dann gehts wieder

Das Problem ist, dass ein Outlook-Programm auch die gleiche Mailadresse abruft (muss leider so sein)
Ich vermute der Fehler kommt (??) wenn die 2 Programme zufällig gleichzeitig auf das Postfach zugreifen?

Die einzige Idee was ich hätte, wäre (bei einem Fehler) etwas zu reseten, damit ich nicht den Diesnt deaktivieren/aktivieren muß, damit es wieder geht


Hat jemand eine Idee, was ich in meinem Dienst machen könnte?



Anbei der Quelltext



Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils,StrUtils , System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs,
  ZAbstractConnection, ZConnection, Data.DB, ZAbstractRODataset,ComCtrls,
  ZAbstractDataset, ZDataset, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
  IdSSL, IdSSLOpenSSL, IdMessage, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdExplicitTLSClientServerBase,IdAttachment, IdMessageClient, IdPOP3,IniFiles,
  Vcl.ExtCtrls,IdText,Registry, StdCtrls;


type
  TMountainWebMailer = class(TService)
    pop: TIdPOP3;
    msg: TIdMessage;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    MAILDATENBANK: TZQuery;
    MAILKONTEN: TZQuery;
    Z_NUMMER: TZQuery;
    ZConnection1: TZConnection;
    Timer1: TTimer;
    MAILANHANG: TZQuery;
    TEMP: TZQuery;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
      ini: TIniFile;
      filename:String;
      meinMemo:TStrings;
      meinMemoFertig:TStrings;

  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  MountainWebMailer: TMountainWebMailer;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  MountainWebMailer.Controller(CtrlCode);
end;

function TMountainWebMailer.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;




procedure TMountainWebMailer.Timer1Timer(Sender: TObject);
var MailCount,Mailgroesse,intIndex :Integer;
    itm:TListItem;
    i:integer;
    s,extensio:string;
    neue_nummer:String;
    neue_nummer_integer:Integer;

    ininame:String;
    lokaler_pfad,
    hostname,
    datenpfad,
    installationspfad,
    domain_name :String;
    anzahl_anhang:Integer;
    erledigt:Integer;

    bereinigter_text:String;
    x:Integer;
    user_inr:Integer;
    stepper,schleife,zaehler1:Integer;

    KOPIE_BELASSEN:String;

    BlobStream: TMemoryStream;


    NUR_SENDEN:Integer;
    KEIN_ANHANG:Integer;
    NUR_WENN_ADRESSE:Integer;

    relevant,gefunden:Integer;
begin





  ininame := extractfilepath(ParamStr(0)) + 'server.ini';
  filename := extractfilepath(ParamStr(0));



  ini := TIniFile.Create(ininame);
  try
    lokaler_pfad := ini.ReadString('DATABASE','Pfad',extractfilepath(ParamStr(0))+'files\database\DATABASE.FDB');
    hostname := ini.ReadString('DATABASE','Host','localhost');
    datenpfad := ini.ReadString('FILES', 'Pfad',extractfilepath(ParamStr(0)));
    installationspfad := ini.ReadString('PFAD', 'Pfad','');
    domain_name := ini.ReadString('DATABASE','Domain','');
  finally
    ini.Free;
  end;


      ZConnection1.Disconnect;
      ZConnection1.HostName:=hostname;
      ZConnection1.Port:=3050;
      ZConnection1.Database:=lokaler_pfad;
      ZConnection1.User:='****';
      ZConnection1.Password:='***';
      ZConnection1.Connect;




      MAILKONTEN.SQL.Clear;
      MAILKONTEN.SQL.Append('SELECT * FROM MAILKONTEN');
      MAILKONTEN.Open;

      MAILANHANG.SQL.Clear;
      MAILANHANG.SQL.Append('SELECT * FROM MAILANHANG WHERE INR = -1');
      MAILANHANG.Open;


while not MAILKONTEN.Eof do
begin


      NUR_SENDEN :=MAILKONTEN.FieldByName('NUR_SENDEN').AsInteger;
      KEIN_ANHANG :=MAILKONTEN.FieldByName('KEIN_ANHANG').AsInteger;
      NUR_WENN_ADRESSE :=MAILKONTEN.FieldByName('NUR_WENN_ADRESSE').AsInteger;

if NUR_SENDEN = 0 then
begin


      POP.Disconnect;
      POP.Host := MAILKONTEN.FieldByName('POP3').AsString;
      POP.Port := strtoint(MAILKONTEN.FieldByName('PORT_POP3').AsString);
      POP.Username := MAILKONTEN.FieldByName('BENUTZERNAME').AsString;
      POP.Password := MAILKONTEN.FieldByName('KENNWORT').AsString;
      POP.Connect;

      USER_INR :=MAILKONTEN.FieldByName('USER_INR').AsInteger;
      KOPIE_BELASSEN:=MAILKONTEN.FieldByName('KOPIE_BELASSEN').AsString;





      MailCount := POP.CheckMessages;


      if MailCount > 0 then
      begin

          for intIndex := 1 to MailCount do
          begin
            msg.Clear;
            pop.Retrieve(intIndex, Msg);


            MAILDATENBANK.SQL.Clear;
            MAILDATENBANK.SQL.Append('SELECT MESSAGID FROM MAILDATENBANK WHERE MESSAGID = '+#39+msg.MsgId+#39+'');
            MAILDATENBANK.Open;



            // Die Mail habe ich noch nicht !!!!!!!!!
            if MAILDATENBANK.RecordCount = 0 then
            begin


                        relevant:=0;
                        if NUR_WENN_ADRESSE = 1 then
                        begin
                        relevant:=1;
                        gefunden:=0;
                        // suche adresse

                        TEMP.SQL.Clear;
                        TEMP.SQL.Append('SELECT EMAIL FROM V_KONTAKT WHERE (EMAIL = '+#39+Msg.From.Text+#39+') OR (EMAIL = '+#39+msg.from.Address+#39+')');
                        TEMP.open;
                        if TEMP.RecordCount <> 0 then gefunden:=1;

                        TEMP.SQL.Clear;
                        TEMP.SQL.Append('SELECT EMAIL FROM V_PERSON WHERE (EMAIL = '+#39+Msg.From.Text+#39+') OR (EMAIL = '+#39+msg.from.Address+#39+')');
                        TEMP.open;
                        if TEMP.RecordCount <> 0 then gefunden:=1;

                        TEMP.SQL.Clear;
                        TEMP.SQL.Append('SELECT EMAIL FROM V_PERSON WHERE (EMAIL = '+#39+Msg.From.Text+#39+') OR (EMAIL = '+#39+msg.from.Address+#39+')');
                        TEMP.open;
                        if TEMP.RecordCount <> 0 then gefunden:=1;

                        TEMP.SQL.Clear;
                        TEMP.SQL.Append('SELECT EMAIL FROM V_MANDANT WHERE (EMAIL = '+#39+Msg.From.Text+#39+') OR (EMAIL = '+#39+msg.from.Address+#39+')');
                        TEMP.open;
                        if TEMP.RecordCount <> 0 then gefunden:=1;


                        if gefunden = 1 then relevant:=2;
                        end;

                        if (relevant = 0) OR (relevant = 2) then
                        begin



            Z_NUMMER.SQL.Clear;
            Z_NUMMER.SQL.add('SELECT GEN_ID( POOL, 1 ) AS IDR FROM RDB$DATABASE');
            Z_NUMMER.open;
            neue_nummer:=inttostr(Z_NUMMER.FieldByName('IDR').AsInteger);
            neue_nummer_integer:=strtoint(neue_nummer);

{

// ---------------------------- STREAM Speichern
try
    BlobStream:= TMemoryStream.Create;
    try
      Msg.SaveToStream(BlobStream);
      BlobStream.Position := 0;
      MAILDATENBANK.Close;
      MAILDATENBANK.SQL.Text := 'insert into MAILDATENBANK (INR, USER_INR, DATEN) values (:inr, :user_inr, :daten)';
      MAILDATENBANK.ParamByName('inr').AsString      := neue_nummer;
      MAILDATENBANK.ParamByName('user_inr').AsInteger := USER_INR;
      MAILDATENBANK.ParamByName('daten').LoadFromStream(BlobStream, ftBlob);
      MAILDATENBANK.ExecSQL;
      BlobStream.Free;
    except
      // Handle exceptions
      Raise;
    end;
except
    BlobStream.Free;
end;
// ---------------------------- STREAM Speichern  ENDE
}




            MAILDATENBANK.SQL.Clear;
            MAILDATENBANK.SQL.Append('SELECT * FROM MAILDATENBANK WHERE INR = '+neue_nummer);
            MAILDATENBANK.Open;




            MAILDATENBANK.APPEND;
            MAILDATENBANK.FieldByName('ZUGRIFFSRECHT').AsString:= MAILKONTEN.FieldByName('ZUGRIFFSRECHT').AsString;
            MAILDATENBANK.FieldByName('INR').AsString:=neue_nummer;
            MAILDATENBANK.FieldByName('USER_INR').AsInteger:=USER_INR;
            MAILDATENBANK.FieldByName('VON').AsString:=Msg.From.Text;
            MAILDATENBANK.FieldByName('ANTWORTADRESSE').AsString:=msg.from.Address;
            MAILDATENBANK.FieldByName('BETREFF').AsString:=Msg.Subject;
            MAILDATENBANK.FieldByName('DATUM').AsDateTime:=Msg.Date;
            MAILDATENBANK.FieldByName('S_DATUM').AsString:= DateToStr(msg.Date);
            MAILDATENBANK.FieldByName('S_UHRZEIT').AsString:=TimeToStr(msg.Date);
            MAILDATENBANK.FieldByName('ZEITSTEMPEL').AsExtended:=Msg.Date;
            MAILDATENBANK.FieldByName('MIMETYPE').AsString:=msg.AttachmentEncoding;
            MAILDATENBANK.FieldByName('CONTENTTYPE').AsString:=msg.ContentType;
            MAILDATENBANK.FieldByName('MESSAGID').AsString:=msg.MsgId;
            MAILDATENBANK.FieldByName('KONTONAME').AsString:=MAILKONTEN.FieldByName('KONTONAME').AsString;
            MAILDATENBANK.FieldByName('KONTONUMMER').AsString:=MAILKONTEN.FieldByName('INR').AsString;

            if Msg.MessageParts.Count = 0 then MAILDATENBANK.FieldByName('ANHANG').AsString:='';
            if Msg.MessageParts.Count > 0 then MAILDATENBANK.FieldByName('ANHANG').AsString:='Anhang';
            MAILDATENBANK.FieldByName('GELESEN').AsInteger:=0;
            MAILDATENBANK.FieldByName('GELOESCHT').AsInteger:=0;
            MAILDATENBANK.FieldByName('IN_OUT').AsString:='IN';
            MAILDATENBANK.FieldByName('PR').AsInteger:=0;
            MAILDATENBANK.FieldByName('ZUORDNUNG').AsString:=MAILKONTEN.FieldByName('ZUGRIFFSRECHT').AsString;

            MAILDATENBANK.Post;

            anzahl_anhang:=0;


          stepper:=0; zaehler1:=0;
          for schleife := 1 to neue_nummer_integer do
            begin
               stepper:=stepper+1;
               if stepper > 99 then
               begin
                 stepper:=0;
                 zaehler1:=zaehler1+100;
               end;
            end;


                      ForceDirectories(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer));


                      {if AnsiContainsStr(Msg.ContentType, 'text/html') then
                      begin
                            Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);
                      end;

                      if AnsiContainsStr(Msg.ContentType, 'text/plain') then
                      begin
                            Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);
                      end;

                      if AnsiContainsStr(Msg.ContentType, 'multipart/alternative') then
                      begin
                            Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);
                      end;

                      if AnsiContainsStr(Msg.ContentType, 'multipart/mixed') then
                      begin
                            Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);
                      end;

                      if AnsiContainsStr(Msg.ContentType, 'multipart/related') then
                      begin
                            Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);
                      end;

                      if AnsiContainsStr(Msg.ContentType, 'application/pdf') then
                      begin
                            Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);
                      end; }



                //Mailteile
                for i := 0 to Msg.MessageParts.Count-1 do
                begin

                      if Msg.MessageParts.Items[i] is tIdAttachment then
                      begin

                        if KEIN_ANHANG = 0 then
                        begin


                        anzahl_anhang:=anzahl_anhang+1;
                        s := (Msg.MessageParts.Items[i] as tIdAttachment).Filename;
                        extensio:= ExtractFileExt(s) ;
                        (Msg.MessageParts.Items[i] as tIdAttachment).savetofile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\Anhang_' + neue_nummer +'_'+inttostr(anzahl_anhang)+extensio);
             { CID --> }(Msg.MessageParts.Items[i] as tIdAttachment).savetofile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\'+(Msg.MessageParts.Items[i] as tIdAttachment).FileName);

                        MAILDATENBANK.Edit;
                        MAILDATENBANK.FieldByName('ANHANG_ANZAHL').AsInteger:=anzahl_anhang;
                        MAILDATENBANK.Post;


                        Z_NUMMER.SQL.Clear;
                        Z_NUMMER.SQL.add('SELECT GEN_ID( POOL, 1 ) AS IDR FROM RDB$DATABASE');
                        Z_NUMMER.open;

                        MAILANHANG.Append;
                        MAILANHANG.FieldByName('INR').AsInteger:=Z_NUMMER.FieldByName('IDR').AsInteger;
                        MAILANHANG.FieldByName('PR').AsString:=neue_nummer;
                        MAILANHANG.FieldByName('ORIGINALNAME').AsString:= (Msg.MessageParts.Items[i] as tIdAttachment).FileName;
                        MAILANHANG.FieldByName('FILE').AsString:= 'Anhang_' + neue_nummer +'_'+inttostr(anzahl_anhang)+extensio;

                        MAILANHANG.Post;

                        end; // if KEIN_ANHANG = 0 then
                      end
                      else
                      begin

                     //if Msg.MessageParts.Items[i] is TIdText then

                         if AnsiContainsStr(Msg.MessageParts.Items[i].ContentType, 'text/html') then
                         TIdText(Msg.MessageParts.Items[i]).Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);

                         if AnsiContainsStr(Msg.MessageParts.Items[i].ContentType, 'multipart/alternative') then
                         TIdText(Msg.MessageParts.Items[i]).Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);

                         if AnsiContainsStr(Msg.MessageParts.Items[i].ContentType, 'text/plain') then
                         TIdText(Msg.MessageParts.Items[i]).Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);

                         if AnsiContainsStr(Msg.MessageParts.Items[i].ContentType, 'multipart/mixed') then
                         TIdText(Msg.MessageParts.Items[i]).Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);

                         if AnsiContainsStr(Msg.MessageParts.Items[i].ContentType, 'multipart/related') then
                         TIdText(Msg.MessageParts.Items[i]).Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);

                         if AnsiContainsStr(Msg.MessageParts.Items[i].ContentType, 'application/pdf') then
                         TIdText(Msg.MessageParts.Items[i]).Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);

                      end;



                end; // for i := 0 to Msg.MessageParts.Count-1 do


                if msg.MessageParts.Count = 0 then // keine Message Parts - Also eine reine Textmail
                begin
                     Msg.Body.SaveToFile(filename +'files\Mails\'+inttostr(zaehler1)+'\'+inttostr(neue_nummer_integer)+'\html_' + neue_nummer + '.html',TEncoding.UTF8);
                end;


            end; // Die Mail habe ich noch nicht

            end; // "NUR_WENN_ADRESSE"

            ///////
            //Kopie am Server belassen: also NICHT löschen
            //pop.Delete(intIndex); // Löscht die aktuelle Mail !!!!

            if KOPIE_BELASSEN='Neinthen pop.Delete(intIndex);

            end;

            end;

      // POP.Disconnect;


end; //if NUR_SENDEN = 0 then



MAILKONTEN.Next;
end;


    ZConnection1.Disconnect;


    // timer1.Enabled:=true; <-- NICHT am anfange disablen .. da bei einem Fehler der timer nie wieder gestartet wird!

end; // procedure

end.
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
136 Beiträge
 
#2

AW: Indy - Mails Abrufen - Socket-Fehler # 10054 Verbindung von Peer zurückgesetzt.

  Alt 29. Jan 2018, 17:01
Hallo,

zuerst einmal wäre es gut zu wissen, warum die Verbindung hakt. Vermutlich hast du keinen Zugriff auf den Mail-Server, oder?

Ich würde als erstes ein Logging einbauen, ich mache das so:
Code:
  IdLogFile:=TIdLogFile.Create(nil);
  IdLogFile.Filename:=IncludeTrailingPathDelimiter(AppDataDir) +
                      IncludeTrailingPathDelimiter(moduleKey)+'IdLogFile.txt';
  IdLogFile.Active:=true;
  SSB_SSLHandler.Intercept:=IdLogFile;
  IdPop3.Intercept:=IdLogFile;
Da wird dann alles gekloggt, auch Passwörter, etc.
AppDataDir uns moduleKey kommt aus meiner Anwendung ist nur ein Beispiel. SSB_SSLHandler ist ein Ersatz für TIdSSLIOHandlerSocketOpenSSL von Secureblackbox, das wirst du auch anpassen müssen.

Weiterhin würde ich die Funktionen
Code:
POP.Connect;
POP.CheckMessages;
POP.Retrieve;
in try..except Blöcke mit entsprechendem Logging setzen.
Zum Beispiel:
Code:
  try
     idPop3.Connect;
  except
    on E : Exception do begin
      // Fehlermeldung protokollieren
      New(InfoMessageRecord);
      InfoMessageRecord^.ThreadID := GetCurrentThreadID;
      InfoMessageRecord^.Content := 'Exception: class name = '+E.ClassName+' / message: '+E.Message;
      PostThreadMessage(ThreadIDMessaging, TH_MESSAGING, TH_INFOMESSAGE, Integer(InfoMessageRecord));
      exit;
    end;
  end;
Auch hier: Kommt aus meiner Anwendung, insbesondere den Except Block musst du anpassen.

Also - als nächstes schauen, warum das passiert, dann kann man entsprechend in der Anwendung reagieren.

lg
Sebastian
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf