2016-01-02 3 views
0

Я пробовал приведенный ниже код для отправки почты, но он показывает, что соединение закрыто грациозно. Я также пробовал 587 и 465 портов. Аутентификация также вызывает ошибку для «5.7.0. Сначала должна выпустить команду STARTTLS. Q27sm64805279pfi.83 - gsmtp».ОШИБКА: Соединение закрыто Изящно

uses 
    IdSMTP, IdMessage, IdEMailAddress; 

procedure SendSimpleMail; 
var 
    IdSMTP: TIdSMTP; 
    IdMessage: TIdMessage; 
    IdEmailAddressItem: TIdEmailAddressItem; 
begin 
    IdSMTP := TIdSMTP.Create(nil); 
    try 
    IdSMTP.Host := 'smtp.gmail.com'; 
    IdSMTP.Port := 25; // or 587 //or 465 
    IdSMTP.AuthType := satDefault; 
    IdSMTP.Username := '[email protected]'; 
    IdSMTP.Password := 'password'; 
    IdSMTP.Connect; 
    if IdSMTP.Authenticate then 
    begin 
     IdMessage := TIdMessage.Create(nil); 
     try 
     IdMessage.From.Name := 'User Name'; 
     IdMessage.From.Address := '[email protected]'; 
     IdMessage.Subject := 'E-mail subject'; 
     IdMessage.Body.Add('E-mail body.'); 

     IdEmailAddressItem := IdMessage.Recipients.Add; 
     IdEmailAddressItem.Address := '[email protected]'; 

     IdSMTP.Send(IdMessage); 
     finally 
     IdMessage.Free; 
     end; 
    end; 
    IdSMTP.Disconnect; 
    finally 
    IdSMTP.Free; 
    end; 
end; 

enter image description here

ответ

0

Чтобы использовать STARTTLS, вам нужно

  1. назначить компонент SSLIOHandler, такие как TIdSSLIOHandlerSocketOpenSSL, к TIdSMTP.IOHandler собственности. Вам придется развернуть DLL OpenSSL с вашим приложением, если оно еще не установлено на целевой машине, на которой будет запущено ваше приложение.

  2. присвоено имя TIdSMTP.UseTLS собственности utUseExplicitTLS, чтобы включить STARTTLS. Убедитесь, что значение TIdSMTP.UseEHLO истинно (по умолчанию), поэтому TIdSMTP может узнать, поддерживает ли сервер STARTTLS.

  3. подключения к порту 587.

Попробуйте это:

uses 
    IdSMTP, IdMessage, IdEMailAddress, IdSSLOpenSSL; 

procedure SendSimpleMail; 
var 
    IdSMTP: TIdSMTP; 
    IdMessage: TIdMessage; 
    IdEmailAddressItem: TIdEmailAddressItem; 
    IdSSL: TIdSSLIOHandlerSocketOpenSSL; 
begin 
    IdSMTP := TIdSMTP.Create(nil); 
    try 
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdSMTP); 
    IdSMTP.IOHandler := IdSSL; 
    IdSMTP.UseTLS := utUseExplicitTLS; 
    IdSMTP.Host := 'smtp.gmail.com'; 
    IdSMTP.Port := 587; 
    IdSMTP.AuthType := satDefault; 
    IdSMTP.Username := '[email protected]'; 
    IdSMTP.Password := 'password'; 
    IdSMTP.Connect; 
    if IdSMTP.Authenticate then 
    begin 
     IdMessage := TIdMessage.Create(nil); 
     try 
     IdMessage.From.Name := 'User Name'; 
     IdMessage.From.Address := 'usernam[email protected]'; 
     IdMessage.Subject := 'E-mail subject'; 
     IdMessage.Body.Add('E-mail body.'); 

     IdEmailAddressItem := IdMessage.Recipients.Add; 
     IdEmailAddressItem.Address := '[email protected]'; 

     IdSMTP.Send(IdMessage); 
     finally 
     IdMessage.Free; 
     end; 
    end; 
    IdSMTP.Disconnect; 
    finally 
    IdSMTP.Free; 
    end; 
end; 

Update: код выше предназначен для Indy 10. Если вы используете Indy 9 вместо этого, есть некоторые различия.

  1. Компонент OpenSSL был назван TIdSSLIOHandlerSocket.

  2. TIdSMTP не поддерживает STARTTLS еще. Вам нужно было бы вручную управлять свойством PassThrough` SSLIOHandler's.

При подключении к порту 587 для явного TLS, вы должны установить PassThrough к истинным изначально, так что вы подключитесь к серверу в незашифрованном виде, а затем отправить команду STARTTLS вручную и установить PassThrough к ложным, чтобы активировать шифрование перед отправкой любого дальнейшие команды SMTP.

Procedure SendMail(); 
begin 
    IdSMTP1.Host := 'smtp.gmail.com'; 
    IdSMTP1.AuthenticationType := atLogin; 
    IdSMTP1.Port := 587; 
    IdSMTP1.Username := '[email protected]'; 
    IdSMTP1.Password := 'password'; 
    IdSSLIOHandlerSocket1.PassThrough := True; 
    IdSMTP1.Connect; 
    try 
    IdSMTP1.SendCmd('STARTTLS', [220]); 
    IdSSLIOHandlerSocket1.PassThrough := False; 
    IdSMTP1.SendCmd('EHLO ' + IdSMTP1.LocalName); 
    IdSMTP1.Authenticate; 
    IdMessage1.Body.Add('Test Message'); 
    IdMessage1.From.Address := '[email protected]'; 
    IdMessage1.Recipients.EMailAddresses := '[email protected]'; 
    IdMessage1.Subject := 'Hi'; 
    try 
     IdSMTP1.Send(IdMessage1); 
    except 
     ShowMessage('Error : email not send'); 
    end; 
    finally 
    IdSMTP1.Disconnect; 
    end; 
end; 

При подключении к порту 465 для неявной SSL, все, что вам нужно сделать, это установить PassThrough ложь перед подключением к серверу. Первоначально соединение будет зашифровано перед отправкой любых команд SMTP вообще, не нужно STARTTLS.

Procedure SendMail(); 
begin 
    IdSMTP1.Host := 'smtp.gmail.com'; 
    IdSMTP1.AuthenticationType := atLogin; 
    IdSMTP1.Port := 465; 
    IdSMTP1.Username := '[email protected]'; 
    IdSMTP1.Password := 'password'; 
    IdSSLIOHandlerSocket1.PassThrough := False; 
    IdSMTP1.Connect; 
    try 
    IdMessage1.Body.Add('Test Message'); 
    IdMessage1.From.Address := '[email protected]'; 
    IdMessage1.Recipients.EMailAddresses := '[email protected]'; 
    IdMessage1.Subject := 'Hi'; 
    try 
     IdSMTP1.Send(IdMessage1); 
    except 
     ShowMessage('Error : email not send'); 
    end; 
    finally 
    IdSMTP1.Disconnect; 
    end; 
end; 
+0

Спасибо, Здесь я использую Delphi 7.0 не будет поддерживать DLL TIdSSLIOHandlerSocketOpenSSL, так что я могу изменить кодировку, как так. Так как я получил то же сообщение об ошибке в этом коде. – Barani

+0

Здесь я использую версию Indy 9.00.10. Он показывает «Не удалось загрузить библиотеку SSL». ошибка. Порт: 587, а также я попытался кодировать порт 465, он также вызывает ошибку «Соединение закрыто грациозно». – Barani

+0

Кроме того, я добавил подробный скриншот компонента для моего вопроса. – Barani

0

Спасибо, Здесь я использую Delphi 7.0 будет поддерживать DLL TIdSSLIOHandlerSocketOpenSSL, так что я могу изменить кодировку, как так. Так как я получил то же сообщение об ошибке в этом коде.

Procedure SendMail(); 
    var Resp : integer; 
    begin 
      IdSMTP1.Host :='smtp.gmail.com'; 
      IdSMTP1.AuthenticationType:= atLogin; 
      IdSMTP1.Port := 587; 
      IdSMTP1.Username := '[email protected]'; 
      IdSMTP1.Password := 'password'; 
      IdSMTP1.Connect; 
      if IdSMTP1.Connected then 
      Begin 
       Resp:= -1; 
       Resp:= IdSMTP1.SendCmd('STARTTLS',Resp); 
       IdMessage1.Body.Add('Tets Message'); 
       IdMessage1.From.Address    := '[email protected]'; 
       IdMessage1.Recipients.EMailAddresses := '[email protected]'; 
       IdMessage1.Subject := 'Hi'; 
       try 
       IdSMTP1.Send(IdMessage1); 
       except 
        ShowMessage('Error : email not send'); 
       end; 
       IdSMTP1.Disconnect; 
      end; 
    end; 
+0

Я предполагаю, что вы используете (очень устаревшую) версию Indy, которая поставляется вместе с Delphi 7? Вам действительно нужно перейти на современную версию Indy. Что касается версии, которую у вас есть, я обновил свой ответ. –

0

мне помог:

При отправке почты, происходит ошибка сервера:

'501 Syntactically invalid EHLO argument (s)' (error code 0x800CCC63).

Эта ошибка возникает, если имя компьютера (под управлением Windows) содержит недопустимые символы:
(`` {_} '', Russian letters or spaces).
Have a look on naming files

Это должно быть изменено с помощью:
Control Panel> Network> Authentication.

Также необходимо проверить имя, заданное с помощью:
Control Panel> Network> TCP

+0

Этот ответ в его письменной форме не отражает никакого решения, запрошенного ОП. Измените свой вопрос, отредактировав необходимую информацию, чтобы связать ее с вопросом или удалить свой ответ. – ZF007

Смежные вопросы