2010-01-27 16 views
6

próbuję wysłać wiadomość e-mail przy użyciu konta Gmail (Delphi 7, Indy 10) z tymi ustawieniami:Indy 10 - IdSMTP.Send() zawiesza się podczas wysyłania wiadomości z konta Gmail

TIdSmtp:

Port = 587; 
UseTLS := utUseExplicitTLS; 

TIdSSLIOHandlerSocketOpenSSL:

SSLOptions.Method := sslvTLSv1; 

Wszystko wydaje się być ustawione ok. Otrzymuję tę odpowiedź:

Resolving hostname smtp.gmail.com. 
Connecting to 74.125.77.109. 
SSL status: "before/connect initialization" 
SSL status: "before/connect initialization" 
SSL status: "SSLv3 write client hello A" 
SSL status: "SSLv3 read server hello A" 
SSL status: "SSLv3 read server certificate A" 
SSL status: "SSLv3 read server done A" 
SSL status: "SSLv3 write client key exchange A" 
SSL status: "SSLv3 write change cipher spec A" 
SSL status: "SSLv3 write finished A" 
SSL status: "SSLv3 flush data" 
SSL status: "SSLv3 read finished A" 
SSL status: "SSL negotiation finished successfully" 
SSL status: "SSL negotiation finished successfully" 
Cipher: name = RC4-MD5; description = RC4-MD5     SSLv3 Kx=RSA  Au=RSA Enc=RC4(128) Mac=MD5 
; bits = 128; version = TLSv1/SSLv3; 

A następnie zawiesza się i nie kończy. E-mail nie jest wysyłany. Jaki może być problem?

Odpowiedz

3

Problemem było proste. Nie byłem wystarczająco cierpliwy i aplikacja się nie zawiesiła, długi czas oczekiwania. Limit czasu był wynikiem nieprawidłowych ustawień.

1

Po pierwsze, czy zweryfikowałeś, że kod działa z innymi serwerami poczty e-mail?

Jakiś czas temu ktoś wspomniał, że miał problemy z niektórymi serwerami akceptującymi żądania HTTP z komponentem Indy TIdHTTP. Powodem było to, że miał Indy włączone jako część UserAgent:

 Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)'; 

Kiedy usunięto Indy Biblioteka to działało. Najwyraźniej w Indy pojawiły się złośliwe serwisy internetowe, więc niektóre witryny będą odrzucać połączenia z aplikacjami stworzonymi z niego.

Nie jestem pewien, czy używany składnik ma jakąkolwiek właściwość UserAgent. Ale jeśli tak jest, należy odrzucić wszelkie odniesienia do Indy.

+1

UserAgent jest dla żądań HTTP, nie SMTP – glob

+0

** glob ** masz rację; Podsumowałem, mówiąc: "Nie jestem pewien, czy używany składnik ma jakąkolwiek właściwość UserAgent" –

4

Tak, widziałem wiele problemów z indy10 i tls (ogólnie gmail).

najpierw upewnij się, że masz najnowsze biblioteki SSL from here

Widziałem sporadyczne stragany i błędów, które zostały rozwiązane w wersji krwawienie krawędzi indy (czyli tzw. Non-stable release). zobacz http://www.indyproject.org/sockets/download/svn.DE.aspx

dla gmail, i zazwyczaj używają implicityTLS na porcie 465 ..

idSmtp := TIdSMTP.Create(nil); 
    try 
    idSmtp.IOHandler := nil; 
    idSmtp.ManagedIOHandler := true; 

    // try to use SSL 
    try 
     TIdSSLContext.Create.Free; 
     idSmtp.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idSmtp); 
     if (smtpSettings.port = 465) then 
     idSmtp.UseTLS := utUseImplicitTLS 
     else 
     idSmtp.UseTLS := utUseExplicitTLS; 
    except 
     idSmtp.IOHandler.Free; 
     idSmtp.IOHandler := nil; 
    end; 

    if (idSmtp.IOHandler = nil) then 
    begin 
     idSmtp.IOHandler := TIdIOHandler.MakeDefaultIOHandler(idSmtp); 
     idSmtp.UseTLS := utNoTLSSupport; 
    end; 

    // send message, etc 

    finally 
    idSmtp.Free; 
    end; 
+0

Doskonały! Twój post pomógł mi. Moja aplikacja również zamarzła podczas smtp.send. Myślę, że kluczem była opcja utUseImplicitTLS, ale również nie rozumiem, co robi ten TIdSSLContex.Create.Free. – Tamm

+0

TIdSSLContext.Create.Free tworzy obiekt i natychmiast go zwalnia. Ma na celu wywołanie wyjątku, jeśli nie można utworzyć obiektu TIdSSLContext. – glob

1

Podczas testowania Indy, powinieneś być pewien, że zaznaczone jest "Zatrzymaj na Delphi Wyjątki" (Narzędzia, Opcje debuggera, Wyjątki językowe).

Niektóre procedury, w szczególności idSMTP.Send, "zjada" (lub ukrywa) wyjątki powodujące zawieszenie.

Powiązane problemy