Конференция "Сети" » отправка Email через GMail
 
  • cad2206 (04.02.16 15:35) [0]
    Добрый день.
    Вроде тема избита до костей, в сети полно примеров. Но не могу отправить сообщение. Результат: socket error # 10060 connection timed out. Ниже приведен код.


    SSLHandler:= TIdSSLIOHandlerSocketOpenSSL.Create(idSMTP1);

        SSLHandler.MaxLineAction := maException;
        SSLHandler.SSLOptions.Method := sslvTLSv1;
        SSLHandler.SSLOptions.Mode := sslmUnassigned;
        SSLHandler.SSLOptions.VerifyMode := [];
        SSLHandler.SSLOptions.VerifyDepth := 0;

        idSMTP1.IOHandler:= SSLHandler;
        idSMTP1.Host := 'smtp.gmail.com';
        idSMTP1.Port := '587';
        idSMTP1.Username := 'user@gmail.com';
        idSMTP1.Password := 'password';
        idSMTP1.AuthType := satDefault;
        idSMTP1.UseTLS := utUseExplicitTLS;

        idMessage1.From.Text := 'text';
        idMessage1.Subject := 'subject';
        idMessage1.Recipients.EMailAddresses := 'cad2206@gmail.com'
       
        idSMTP1.Connect;
        idSMTP1.Send(idMessage1);



    Подскажите пожалуйста, где ошибка? пишу в Delphi 2010. Indy версии 10. С уважением, Сергей.
  • кгшзх © (04.02.16 15:45) [1]
    telnet smtp.gmail.com 587
  • cad2206 (04.02.16 16:13) [2]
    telnet smtp.gmail.com 587
    отвечает
  • кгшзх © (04.02.16 16:14) [3]
    тады что-то с тлс не того
  • cad2206 (04.02.16 16:19) [4]
    да я понимаю, что где-то засада с TLS, а где - не пойму...
  • cad2206 (05.02.16 14:05) [5]
    пробовал так:


    procedure TForm1.Button1Click(Sender: TObject);
    var
     // variáveis e objetos necessários para o envio
     IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
     IdSMTP: TIdSMTP;
     IdMessage: TIdMessage;
     IdText: TIdText;
     sAnexo: string;
    begin
     // instanciação dos objetos
     IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
     IdSMTP := TIdSMTP.Create(Self);
     IdMessage := TIdMessage.Create(Self);

     try
       // Configuração do protocolo SSL (TIdSSLIOHandlerSocketOpenSSL)
       IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23;
       IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient;

       // Configuração do servidor SMTP (TIdSMTP)
       IdSMTP.IOHandler := IdSSLIOHandlerSocket;
       IdSMTP.UseTLS := utUseImplicitTLS;
       IdSMTP.AuthType := satDefault;
       IdSMTP.Port := 465;
       IdSMTP.Host := 'smtp.gmail.com';
       IdSMTP.Username := 'user@gmail.com';
       IdSMTP.Password := 'pass';

       // Configuração da mensagem (TIdMessage)
       IdMessage.From.Address := 'user@gmail.com';
       IdMessage.From.Name := 'John Smith';
       IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address;
       IdMessage.Recipients.Add.Text := 'user@gmail.com';
       IdMessage.Subject := 'Hello World';
       IdMessage.Encoding := meMIME;

       // Configuração do corpo do email (TIdText)
       IdText := TIdText.Create(IdMessage.MessageParts);
       IdText.Body.Add('The body of the e-mail goes here');
       IdText.ContentType := 'text/plain; charset=iso-8859-1';

       // Conexão e autenticação
       try
         IdSMTP.Connect;
         IdSMTP.Authenticate;
       except
         on E:Exception do
         begin
           MessageDlg('Cannot authenticate: ' +
             E.Message, mtWarning, [mbOK], 0);
           Exit;
         end;
       end;

       // Envio da mensagem
       try
         IdSMTP.Send(IdMessage);
         MessageDlg('Message sent successfully!', mtInformation, [mbOK], 0);
       except
         On E:Exception do
         begin
           MessageDlg('Error while sending a message: ' +
             E.Message, mtWarning, [mbOK], 0);
         end;
       end;
     finally
       // liberação dos objetos da memória
       FreeAndNil(IdMessage);
       FreeAndNil(IdSSLIOHandlerSocket);
       FreeAndNil(IdSMTP);
     end;
    end;
    end.



    это копия кода от http://stackoverflow.com/questions/31776715/send-e-mail-using-gmail-and-indy

    та же ошибка: Connection Timed Out...

    ну может кто даст рабочий код или подскажет, что не так?
  • cad2206 (09.02.16 10:15) [6]
    уважаемые, ну не ужели ни кто не в силах помочь? может я мало данных предоставил для понимания?
  • DVM © (09.02.16 10:25) [7]
    Сними дамп установления соединения с помощью Wireshark и выложи его куда-нибудь. Из него можно будет понять, что не так пошло при установлениии TLS соединения.
  • cad2206 (09.02.16 12:34) [8]
    немного перебрал код:


    //формируем тело сообщения
    IdMessage1 := TIdMessage.Create;
    IdMessage1.From.Address := 'test';
    IdMessage1.Recipients.Add.Address:='test@gmail.com';
    IdMessage1.Subject := UTF8Encode('test');
    IdMessage1.Date:= now;

    //настройка компонентов перед отправкой
    IdSMTP := TIdSMTP.Create(nil);

    IdSMTP.Host:=Form1.Edit1.Text;
    IdSMTP.Port:=StrToInt(Form1.Edit2.Text);
    IdSMTP.Username:=Form1.Edit3.Text;
    IdSMTP.Password:=Form1.Edit4.Text;
    IdSMTP.AuthType:=satDefault;

    //для SSL
    IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    IdSSLIOHandlerSocketOpenSSL.Destination := IdSMTP.Host+':'+IntToStr(IdSMTP.Port);
    IdSSLIOHandlerSocketOpenSSL.Host := IdSMTP.Host;
    IdSSLIOHandlerSocketOpenSSL.Port := IdSMTP.Port;
    IdSSLIOHandlerSocketOpenSSL.DefaultPort := 0;
    IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;

    IdSMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;

    case Form1.ComboBox2.ItemIndex of
         0: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv2;
         1: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv23;
         2: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv3;
         3: IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1
    else
         raise Exception.Create('Выберите тип SSL');
    end;

    case Form1.ComboBox1.ItemIndex of
         0: IdSMTP.UseTLS := utUseExplicitTLS;
         1: IdSMTP.UseTLS := utUseImplicitTLS;
         2: IdSMTP.UseTLS := utUseRequireTLS;
         3: IdSMTP.UseTLS := utNoTLSSupport;
    else
         raise Exception.Create('Выберите тип TLS');    
    end;

    try
     IdSMTP.Connect;
     if idSMTP.Connected then
      MessageBox(handle,pchar('Подключение к SMTP серверу успешно'), pchar('ee'), 48);
    except
     MessageBox(handle,pchar('Ошибка подключения к SMTP Серверу'), pchar('ee'), 48);
     exit;
    end;

    IdSMTP.Send(IdMessage1);

    Application.ProcessMessages;
    IdSMTP.Disconnect;

    idMessage1.Free;
    IdSSLIOHandlerSocketOpenSSL.Free;
    idSMTP.Free;
    end;



    в результате, при значениях:
    IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method = sslvSSLv3 или sslvTLSv1

    IdSMTP.UseTLS := utUseExplicitTLS;

    вроде как выдается сообщение 'Подключение к SMTP серверу успешно'. Но следом Connection timed Out и Connection Closed Gracefully.

    Что за бред...
  • cad2206 (09.02.16 12:54) [9]
    ссылка на файл дампа при коннекте: https://yadi.sk/d/lC1uFiwcoYKyN
    использовал фильтр: tcp.port == 587
  • cad2206 (09.02.16 12:56) [10]
    ошибся с файлом....
  • cad2206 (09.02.16 12:58) [11]
    ан нет, файлик тот, просто фильтр применить нужно tcp.port == 587
  • cad2206 (10.02.16 11:59) [12]
    и вот какой момент, попросил коллегу откомпилировать код, у него delphi 2010, indy 10.5.9.  
    прислал он мне приложение и оно работает!!!! indy у меня 10.5.5. Возможно, причина в этом?
  • DVM © (10.02.16 13:05) [13]

    > cad2206   (09.02.16 12:54) [9]
    > ссылка на файл дампа при коннекте: https://yadi.sk/d/lC1uFiwcoYKyN
    > использовал фильтр: tcp.port == 587

    При установлении TLS соединения сервер по всей видимости не устраивает версия протокола (выбирается TLS1), после чего он рвет соединение.
  • cad2206 (10.02.16 13:20) [14]
    судя по логам сессии так и происходит, но почему при компиляции с другой машины, там тоже TLS1, все прокатывает?
  • DVM © (10.02.16 18:03) [15]

    > cad2206   (10.02.16 13:20) [14]
    > судя по логам сессии так и происходит, но почему при компиляции
    > с другой машины, там тоже TLS1, все прокатывает?

    Выложи дамп, сравним. Очевидно есть различия.
  • cad2206 (25.02.16 12:20) [16]
    Добрый день. Может кому то пригодится. Проблема была действительно в компонентах Indy 10.5.5. После обновления до 10.5.9 проблема исчезла.
 
Конференция "Сети" » отправка Email через GMail
Есть новые Нет новых   [118640   +43][b:0][p:0.003]