2015-09-22 62 views
0

我想發送一個電子郵件使用Indy 10在德爾福5,會發生什麼,它不希望進行身份驗證,因爲它向我顯示「Nooo」消息。到目前爲止,我在這裏有這個代碼(我從另一個堆棧溢出問題中獲得)。我不知道爲什麼它不適合我,因爲它顯然是爲另一個人做的...也許我錯過了一些東西,我用我的兩封實際郵件和密碼取代了senderemail並收到了郵件。德爾福5發送電子郵件與Indy

編輯

所以這就是我現在,它會彈出一個「必須首先發出STARTTLS命令。」錯誤然而現在...我這個真糊塗......

EDIT 2

所以我設法使它工作,這裏的最終結果。隨意告訴我,如果有什麼不正確的做法......我有一個訪問衝突,直到我加入了「IdSMTP.Authenticate;」在發送消息之前!

procedure TForm1.Button3Click(Sender: TObject); 
var 
    IdSMTP: TIdSMTP; 
    Email: TIdMessage; 
    SSLHandler: TIdSSLIOHandlerSocketOpenSSL; 
begin 
    IdSMTP := TIdSMTP.Create(nil); 
    SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    Email := TIdMessage.Create(nil); 
    try 
     SSLHandler.MaxLineAction := maException; 
     SSLHandler.SSLOptions.Method := sslvSSLv23; 
     SSLHandler.SSLOptions.Mode := sslmUnassigned; 
     SSLHandler.SSLOptions.VerifyMode := []; 
     SSLHandler.SSLOptions.VerifyDepth := 0; 

     IdSMTP.IOHandler := SSLHandler; 
     IdSMTP.Host := 'smtp.gmail.com'; 
     IdSMTP.Port := 587; 
     IdSMTP.Username := '[email protected]'; 
     IdSMTP.Password := 'password'; 
     IdSMTP.UseTLS := utUseExplicitTLS; 

     Email.From.Address := '[email protected]'; 
     Email.Recipients.EmailAddresses := '[email protected]'; 
     Email.Subject := 'Test subject'; 
     Email.Body.Text := 'Test body'; 

     IdSMTP.Connect; 
     if IdSMTP.Connected then 
     begin 
      IdSMTP.Authenticate; 
      IdSMTP.Send(Email); 
      IdSMTP.Disconnect; 
     end; 
    finally 
     Email.Free; 
     SSLHandler.Free; 
     IdSMTP.Free; 
    end; 
end; 
+2

注意,'=進行AuthType satDefault'並不適用於所有服務器工作。它使用 'AUTH LOGIN'命令,這是不安全的,並且一些服務器已經丟棄了 對它的支持。您應該考慮使用'AuthType = satSASL'來代替 'TIdSMTP.SASLMechanisms'集合。您不需要手動調用Authenticate() – Marusyk

+0

Gmail使用SMTP的25,465和587,但由於幾乎所有的isps阻止25,因此465是首選的SMTP,其中SSL使用gmail,而587是使用TLS端口的首選SMTP。 – Marusyk

+0

GMail可以使用不允許訪問您的程序的設置 - 嘗試在您的設置中找到「訪問不太安全的應用程序」。 – smooty86

回答

1

嘗試使用此代碼:

IdSMTP := TIdSMTP.Create(nil); 
    try 
    IdSMTP.UseTLS := utNoTLSSupport; 
    IdSMTP.Host := 'smtp.gmail.com'; 
    IdSMTP.Port := 25; 
    IdSMTP.AuthType := satDefault; 
    IdSMTP.Username := '[email protected]'; 
    IdSMTP.Password := 'Password';   

    IdMessage := TIdMessage.Create(nil); 
    try 
     IdMessage.From.Name := 'My Name'; 
     IdMessage.From.Address := '[email protected]'; 
     IdMessage.Subject := 'E-mail subject'; 
     IdMessage.Body.Add('E-mail body.'); 
     IdMessage.Recipients.EMailAddresses := '[email protected]';   
     IdMessage.ReceiptRecipient.Name := 'Name'; 

     if not IdSMTP.Connected then 
      IdSMTP.Connect; 

     IdSMTP.Send(IdMessage); 

    finally 
      IdMessage.Free; 
      IdSMTP.Disconnect; 
    end; 

    finally 
    IdSMTP.Free; 
    IdSSLIOHandlerSocketOpenSSL1.Free; 
+0

它告訴我「SSL IOHandler是此設置所必需的」,即使我添加了「IdSMTP.IOHandler:= IdSSLIOHandlerSocketOpenSSL1;」行......奇怪 – Cauchemar

+0

「SSLHandler」應該是「IdSSLIOHandlerSocketOpenSSL1」嗎? – Cauchemar

+0

它給了我同樣的錯誤...... :( – Cauchemar