Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
Jonnik
Member

Откуда:
Сообщений: 122
Отправляю письмо с вложениями через Gmail используя Indy (10.6.2.5263) c SSL в XE 8.
На одних компах отправлятеся нормально, на других вылетает ошибка ConnClosedGracefully.
На всех моих трех компах все нормально, поэтому даже проверить не могу что именно и когда вылетает.
Нашел тему на этом форуме тут, но она очень старая.
Не разобрался, что именно сделали.
Еще есть это.
Там в конце написали, что типа это часто бывает и надо просто игнорировать ошибку.
Пытался добавить исключение не помогло.
Может, кто сталкивался с этой проблемой ?

  MessageEmail: TIdMessage;
  SMTP: TIdSMTP;
  SSL: TIdSSLIOHandlerSocketOpenSSL;
  Attach: TIdAttachment;
  AttachFile: TIdAttachmentFile;
  AttachMemory : TIdAttachmentMemory;
  StreamFile : TMemoryStream;
begin
  Result := True;

  try
  try

    SMTP := TIdSMTP.Create(nil);
    MessageEmail := TIdMessage.Create(nil);
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

    SSL.SSLOptions.Method := sslvTLSv1;
    SSL.SSLOptions.Mode := sslmUnassigned;
    SSL.SSLOptions.VerifyMode := [];
    SSL.SSLOptions.VerifyDepth := 0;

    MessageEmail.ContentTransferEncoding := 'base64';
    MessageEmail.From.Address := Username;
    MessageEmail.Recipients.EMailAddresses := ToTarget;
    MessageEmail.CharSet := 'UTF-8';  // 'Windows-1251';
    MessageEmail.Subject := Subject; //  AnsiToUtf8(     UTF8Encode(WideString(         ConvertToWIN1251(
    MessageEmail.Body.text := Body;

    SMTP.IOHandler := SSL;
    SMTP.Host := TSMTP;
    SMTP.Port := TPort;
    SMTP.username := Username;
    SMTP.password := Password;
    SMTP.UseTLS := utUseExplicitTLS;


    if Path <> '' then
      begin
        try
          StreamFile := TMemoryStream.Create;

          MainForm.ExcelSS.SaveToStream(StreamFile, TdxSpreadSheetXLSFormat);   //
          StreamFile.Position := 0;
          AttachMemory := TIdAttachmentMemory.Create(MessageEmail.MessageParts, StreamFile);
          AttachMemory.ContentType := 'text/plain';
          AttachMemory.FileName := ClearFileName(StringReplace(Path, '*', 'х',[rfReplaceAll, rfIgnoreCase]), ' ');

        finally
          StreamFile.Free;
        end
      end;



    SMTP.Connect;
    SMTP.Send(MessageEmail);
    SMTP.Disconnect(False);

  Except
     on E : Exception do
      begin
        MessageDlg('Ошибка при отправки письма!'+#13+'Дополнительно ClassName "'+E.ClassName+'", Message"' +E.Message+'"',mtError, [mbOK], 0);
        Result := False;
      end;
  end;

  finally
    AttachMemory.Free;
    //AttachFile.Free;
    SMTP.Free;
    MessageEmail.Free;
    SSL.Free;
  end;
2 окт 18, 17:12    [21693016]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2969
Jonnik,

ConnClosedGracefully, как правило, это нормальное завершение протокола и его можно просто игнорировать.
2 окт 18, 22:37    [21693487]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
Jonnik
Member

Откуда:
Сообщений: 122
makhaon
Jonnik,

ConnClosedGracefully, как правило, это нормальное завершение протокола и его можно просто игнорировать.


Я отловил ошибку так, но письмо не отправилось. Есть еще вараинты ?

 Except
     on E : EIdConnClosedGracefully do
     begin
       Exit;
     end;
 end;
3 окт 18, 14:46    [21694148]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6127
Jonnik,

Я делал когда-то так:

function DoSendMessage(ASMTP: TIdSMTP; AMessage: TIdMessage):boolean;
begin
 Result:=False;
 if not ASMTP.Connected then exit;
 try
   ASMTP.Send(AMessage);
   Result:=True;
 except
   on E:EIdConnClosedGracefully do Result:=True;
   on E:EIdSMTPReplyError do
      begin
        Logging(E.Message+' Error code:'+IntToStr((E as EIdSMTPReplyError).ErrorCode)+
                ' Enhanced code: '+(E as EIdSMTPReplyError).EnhancedCode.ReplyAsStr,True);
        Result:=False;
      end;
   on E:Exception do
      begin
        Logging('Send e-mail message failed. '+E.Message,True);
        Result:=False;
      end;
 end;
end;
3 окт 18, 15:25    [21694203]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
Jonnik
makhaon
Jonnik,

ConnClosedGracefully, как правило, это нормальное завершение протокола и его можно просто игнорировать.


Я отловил ошибку так, но письмо не отправилось. Есть еще вараинты ?

 Except
     on E : EIdConnClosedGracefully do
     begin
       Exit;
     end;
 end;
И куда же ведет этот икзит, и откуда к нему приходит управление?
3 окт 18, 15:27    [21694208]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
Jonnik
Member

Откуда:
Сообщений: 122
Котовасия
Jonnik
пропущено...


Я отловил ошибку так, но письмо не отправилось. Есть еще вараинты ?

 Except
     on E : EIdConnClosedGracefully do
     begin
       Exit;
     end;
 end;
И куда же ведет этот икзит, и откуда к нему приходит управление?


Весь код в первом сообщении. Так будет понятнее. Ошибку отловил, но письмо не ушло

try
    SMTP.Connect;
    SMTP.Send(MessageEmail);
    SMTP.Disconnect(False);

Except
     on E : EIdConnClosedGracefully do
     begin
       Result := True;
     end;

     on E : Exception do
      begin
        MessageDlg('Ошибка при отправки письма!'+#13+'Дополнительно ClassName "'+E.ClassName+'", Message"' +E.Message+'"',mtError, [mbOK], 0);
        Result := False;
      end;
  end;
3 окт 18, 16:48    [21694324]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6127
Jonnik,

Оберни Connect() и Send() отдельно в try..except, чтобы понять, где ты ловишь исключение. EIdConnClosedGracefully приходит, если сервер разрывает соединение со своей стороны. Если оно на Connect() возникает - могут быть разные варианты.
3 окт 18, 17:28    [21694383]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
MinGW
Member

Откуда:
Сообщений: 11
Jonnik
На одних компах отправлятеся нормально, на других вылетает ошибка ConnClosedGracefully.

На тех компах, где ошибка, вообще никогда ни разу не отправляется, или иногда через раз?
4 окт 18, 00:19    [21694709]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
Беззумный Беззумец
Guest
Недоработанное Беззумие:
+
const
    LineBreak: String = #13#10;
    DoubleLineBreak: String = LineBreak+LineBreak;

...

var
    MessageEmail: TIdMessage;
    SMTP: TIdSMTP;
    SSL: TIdSSLIOHandlerSocketOpenSSL;
    Attach: TIdAttachment;
    AttachFile: TIdAttachmentFile;
    AttachMemory: TIdAttachmentMemory;
    StreamFile: TMemoryStream;
        procedure SMTP_PrepareSSL();
        begin
        SSL:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
        try
            SSL.SSLOptions.Method:=sslvTLSv1;
            SSL.SSLOptions.Mode:=sslmUnassigned;
            SSL.SSLOptions.VerifyMode:=[];
            SSL.SSLOptions.VerifyDepth:=0;
        except
            on Error: EException do
                FreeAndNil(SSL);
                // Logging('SMTP_PrepareSSL', Error);
                raise Error;
            end;
        end;
        procedure SMTP_PrepareSMTP();
        begin
        SMTP_PrepareSSL();
        SMTP:=TIdSMTP.Create(nil);
        try
            SMTP.IOHandler:=SSL;
            SMTP.Host:=TSMTP;
            SMTP.Port:=TPort;
            SMTP.username:=Username;
            SMTP.password:=Password;
            SMTP.UseTLS:=utUseExplicitTLS;
        except
            on Error: EException do
                FreeAndNil(SMTP);
                // Logging('SMTP_PrepareSMTP', Error);
                raise Error;
            end;
        end;
        procedure SMTP_PrepareEmail();
        begin
        MessageEmail:=TIdMessage.Create(nil);
        try
            MessageEmail.ContentTransferEncoding:='base64';
            MessageEmail.From.Address:=Username;
            MessageEmail.Recipients.EMailAddresses:=ToTarget;
            MessageEmail.CharSet:='UTF-8'; // 'Windows-1251';
            MessageEmail.Subject:=Subject; // AnsiToUtf8(UTF8Encode(WideString(ConvertToWIN1251(
            MessageEmail.Body.text:=Body;
        except
            on Error: EException do
                FreeAndNil(MessageEmail);
                // Logging('SMTP_PrepareEmail', Error);
                raise Error;
            end;
        end;
        procedure SMTP_PrepareAttach();
        begin
        if Length(Path)>0 then
            try
                StreamFile:=TMemoryStream.Create;
                MainForm.ExcelSS.SaveToStream(StreamFile, TdxSpreadSheetXLSFormat);
                StreamFile.Position:=0;
                AttachMemory:=TIdAttachmentMemory.Create(MessageEmail.MessageParts, StreamFile);
                try
                    AttachMemory.ContentType:='text/plain';
                    AttachMemory.FileName:=ClearFileName(StringReplace(Path, '*', 'х', [rfReplaceAll, rfIgnoreCase]), ' ');
                except
                    on Error: EException do
                        FreeAndNil(AttachMemory);
                        // Logging('SMTP_PrepareAttach', Error);
                        raise Error;
                    end;
            finally
                FreeAndNil(StreamFile);
                end;
        end;
        procedure SMTP_TryToSend();
        const MAX_ATTEMPTS_CNT = 10; WAIT_TIME = 100;
        var CurrentAttempt: Integer;
        begin
        CurrentAttempt:=0;
        while (CurrentAttempt<MAX_ATTEMPTS_CNT) do
            begin
            Inc(CurrentAttempt);
            try
                SMTP.Send(MessageEmail);
                Result:=True;
                Exit;
            except
                on Error: EIdConnClosedGracefully do
                    Sleep(WAIT_TIME);
                else
                    raise Error;
                end;
            end;
        end;
begin
Result:=False;
// Path:=Trim(Path); // ???
// if not FileExists(Path) then Path:=''; // ???
try
    SMTP_PrepareSMTP();
    try
        SMTP.Connect();
        try
            SMTP_PrepareEmail();
            try
                SMTP_PrepareAttach();
                try
                    SMTP_TryToSend();
                finally
                    if Assigned(AttachMemory) then FreeAndNil(AttachMemory);
                    end;
            finally
                FreeAndNil(MessageEmail);
                end;
        finally
            SMTP.Disconnect(False);
            end;
    finally
        FreeAndNil(SMTP);
    end;
except
    MessageDlg('Ошибка при отправки письма!'+DoubleLineBreak+'ClassName :: "'+E.ClassName+'"'+LineBreak+'Message :: "'+E.Message+'"', mtError, [mbOK], 0);
    end;
end;
Мне аж самому интересно, получится ли со всей этой фигнёй взлететь... %)))
4 окт 18, 02:43    [21694728]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
Jonnik
Member

Откуда:
Сообщений: 122
MinGW
Jonnik
На одних компах отправлятеся нормально, на других вылетает ошибка ConnClosedGracefully.

На тех компах, где ошибка, вообще никогда ни разу не отправляется, или иногда через раз?


Вообще ни разу не проходило.
Скоро все проверю и скажу точный результат, где падает.
6 окт 18, 01:21    [21696888]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
Jonnik
Member

Откуда:
Сообщений: 122
Отправил письмо так и получается, что ошика ConnClosedGracefully вылетает при SMTP.Connect.
Может как-то можно узнать ее код ?

try
    SMTP.Connect;
Except
     on E : EIdConnClosedGracefully do
     begin
       Result := True;
     end;
end;

try
    SMTP.Send(MessageEmail);
Except
     on E : EIdConnClosedGracefully do
     begin
       Result := True;
     end;
end;


try
    SMTP.Disconnect(False);

Except
     on E : EIdConnClosedGracefully do
     begin
       Result := True;
     end;
  end;


К сообщению приложен файл. Размер - 14Kb
11 окт 18, 16:29    [21701770]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6127
Jonnik,

Смотри настройки SMTP сервера, файрволы, антивири... У себя сервер рвет входящий коннект - ищи причину.
11 окт 18, 17:22    [21701841]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6127
DarkMaster,

Ну и соответственно проверяй настройки своего соединения. Может ты не на тот порт идешь.
11 окт 18, 17:25    [21701844]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10643
DarkMaster
Может ты не на тот порт идешь.
Тогда ошибка будет другая.

Эта ошибка говорит о том, что соединение было установлено, но серверу что-то не понравилось и он его со своей стороны закрыл.

Логин/пароль/сертификат бы проверить
11 окт 18, 19:50    [21701946]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
Jonnik
Member

Откуда:
Сообщений: 122
_Vasilisk_
DarkMaster
Может ты не на тот порт идешь.
Тогда ошибка будет другая.

Эта ошибка говорит о том, что соединение было установлено, но серверу что-то не понравилось и он его со своей стороны закрыл.

Логин/пароль/сертификат бы проверить


Я же с пяти компов могу отправить все без проблем. А с двух не могу.
Явно тут дело не в паролях и логинах и портах подключения.
Из антивирусников, только Нод и то я его выключал, не помогло.
Вот про сертификат может быть. Но я использую эти стандартные 2 DLL libeay32.dll и ssleay32.dll для SSL, что бы если их нет, то они были всегда под рукой у программы. И они лежат в папке с программой.
Может в винде еще чего не хватает или не той версии и тогда все падает ?
11 окт 18, 20:53    [21701976]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2969
Jonnik,

может быть что угодно. для начала стоит проверить сторонним софтом то же самое действие. мейлеров хватает разных. обязательно сделай те же самые настройки и пробуй. понятно, что пока сторонний мейлер не простучится, твой тоже.
11 окт 18, 21:32    [21701992]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6127
_Vasilisk_
DarkMaster
Может ты не на тот порт идешь.
Тогда ошибка будет другая.

Эта ошибка говорит о том, что соединение было установлено, но серверу что-то не понравилось и он его со своей стороны закрыл.

Логин/пароль/сертификат бы проверить


Да я в общем и целом - я уже говорил выше, что может вызвать ConnectionClosedGracefully.
12 окт 18, 09:58    [21702207]     Ответить | Цитировать Сообщить модератору
 Re: Отправка Email, Indy, ошибка ConnClosedGracefully  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10643
Jonnik
я использую эти стандартные 2 DLL libeay32.dll и ssleay32.dll для SSL
С каких пор они стали стандартными, если они компилируются отдельно, специально для инди?

Проверьте, что везде совпадают версии этих библиотек
12 окт 18, 16:16    [21702729]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить