2010-01-27 3 views
6

나는이 설정으로 Gmail 계정을 사용하여 (델파이 7, 인디 10) 전자 메일을 보내도록 노력하고 있어요 :인디 10 - IdSMTP.Send() Gmail의 메시지를 보낼 때 계정 달려 있습니다

TIdSmtp :

Port = 587; 
UseTLS := utUseExplicitTLS; 

는 TIdSSLIOHandlerSocketOpenSSL :

SSLOptions.Method := sslvTLSv1; 

모든 확인 설정 될 것으로 보인다. 나는이 응답을 받는다 :

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; 

그리고, 그것은 걸리고, 끝나지 않는다. 전자 메일은 전송되지 않습니다. 무엇이 문제 일 수 있습니까?

답변

1

먼저 다른 전자 메일 서버에서 코드가 작동하는지 확인 했습니까?

얼마 전에 누군가가 Indy TIdHTTP 구성 요소로 http 요청을 수락하는 특정 서버에 문제가 있다고 언급했습니다.

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

그들이이 일을 인디 도서관을 제거 : 그 이유는 그들이 인디은 사용자 에이전트의 일부로 포함했다이었다. Indy에서 만든 악성 웹 서비스가 있었으므로 일부 사이트에서는 해당 사이트에서 만든 응용 프로그램과의 연결을 거부합니다.

사용중인 구성 요소에 UserAgent 속성이 있는지 확실하지 않습니다. 그러나 그렇다면 인디에 대한 언급을 무시하십시오.

+1

UserAgent는 SMTP가 아닌 HTTP 요청입니다 – glob

+0

** glob ** 사용자가 맞습니다; "사용중인 구성 요소에 UserAgent 속성이 있는지 확실하지 않습니다."라고 결론을 내었습니다. –

4

예, indy10 및 tls (일반적으로 Gmail)에서 많은 문제를 겪었습니다.

먼저 반드시 내가 인디의 최첨단 버전 (예. 비 안정 버전)에서 해결되었습니다 간헐적 노점 및 오류를 본 적이 from here

최신 SSL 라이브러리를 가지고 있는지 확인하십시오.

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

우수! 귀하의 게시물이 도움이되었습니다. 내 응용 프로그램은 또한 smtp.send 중에 동결되었습니다. 나는 열쇠가 utUseImplicitTLS 옵션이라고 생각하지만 TIdSSLContex.Create.Free가 무엇을하는지 이해하지 못한다. – Tamm

+0

TIdSSLContext.Create.Free는 개체를 만들고 즉시 해제합니다. TIdSSLContext 개체를 만들 수없는 경우 예외가 트리거됩니다. – glob

1

Indy를 테스트 할 때 "Delphi 예외에서 중지"가 선택되어 있는지 확인해야합니다 (도구, 디버거 옵션, 언어 예외).

일부 루틴, 특히 idSMTP.Send는 전화를 끊는 예외를 '먹는'(숨 깁니다) 경우가 있습니다.