Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > TIDSMTP, ошибка, SSL, не отправляет письмо


Автор: boobie 13.9.2017, 09:46
Добрый день!
Все делаю по рецепту, кидаю на форму компоненты IdSMTP, IdMessage, IdSSLIOHandlerSocket, IdSocksInfo.

DLL-ки для SSL-шифрования качаю отсюда: http://indy.fulgan.com/SSL/
Закидываю их в папку с моим exe-шником.
Пробовал openssl-1.0.2l-i386-win32.zip и openssl-1.0.2l-x64_86-win64.zip  и более ранние 0.9... 

Вот листинг:
Код

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdIOHandler,
IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,
IdCustomTransparentProxy, IdSocks, IdMessage, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
IdSMTPBase, IdSMTP;

type
TForm1 = class(TForm)
IdSMTP1: TIdSMTP;
IdMessage1: TIdMessage;
IdSocksInfo1: TIdSocksInfo;
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin


IdSMTP1.CreateIOHandler(nil);
idMessage1.Create(nil);
IdSMTP1.AuthType := satDefault;
IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions. Method := sslvTLSv1;
IdSSLIOHandlerSocketOpenSSL1. SSLOptions.Mode:= sslmUnassigned;
IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
IdSMTP1.UseTLS := utUseImplicitTLS;
IdMessage1.From.Address:= 'ОТ КОГО@gmail.com';
IdMessage1.ContentType := 'text/plain; charset=WINDOWS-1251;';
IdMessage1.Subject:='Demo Email (ПРОВЕРКА)';
IdMessage1.Body.Text:='Почта SSL';
IdMessage1.Recipients. EMailAddresses:='КОМУ@mail.ru';
IdSMTP1.Host:='smtp.gmail.com';
IdSMTP1.Port:=587;
IdSMTP1.Username:='ОТ КОГО@gmail.com';
IdSMTP1.Password:='ПАРОЛЬ';
IdSMTP1.Connect;
IdSMTP1.Send(IdMessage1);
IdSMTP1.Disconnect;


end;
end.


При нажатии на кнопку вылетает ошибка:
Error connecting with SSL.
error: 1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number.

На С# все работает из коробки, без лишних ДЛЛ-ок.
Как на дельфях отправить письмо используя SSL?

Автор: Snowy 13.9.2017, 11:11
SSL3, а ты выставляешь sslvTLSv1
Установи метод в sslvSSLv3

Автор: boobie 13.9.2017, 11:20
Так, ошибся...
Поменял на sslvSSLv3, ошибка та же.
P.S. Indy 10.6.2, Delphi 10.2...
В дизайнере никакие сво-ва у компонентов не менял, библиотеки к проекту не линковал (а надо?)...

Автор: Snowy 14.9.2017, 11:22
Нет, библиотеки линковать не нужно. Достаточно просто положить в папку с проектом. Они подхватываются автоматически.
Посмотри вот этот вариант:
http://forum.vingrad.ru/forum/topic-100619.html

Автор: boobie 18.9.2017, 08:08
Спасибо!
Нашел работающий вариант:
Код

function tForm1.SendEMail(const ASubject, ABody: String;
  const AFileAttach: String = ''): Boolean;
var
  IdSMTP: TidSMTP;
  IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
  IdMessage: TIdMessage;
  IdtTextPart: TIdText;
  IdAttachment: TIdAttachmentFile;
begin
  IdSMTP := TidSMTP.Create(nil);
  IdSMTP.AuthType := satDefault;
  IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create;
  IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;
  IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;
  IdSMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;
  IdSMTP.UseTLS := utUseImplicitTLS;
  IdMessage := TIdMessage.Create(nil);
  IdAttachment := nil;
  if (AFileAttach <> '') and FileExists(AFileAttach) then
    IdAttachment := TIdAttachmentFile.Create(IdMessage.MessageParts,
      AFileAttach);
  IdtTextPart := TIdText.Create(IdMessage.MessageParts, nil);
  try
    IdSMTP.Host := 'smtp.gmail.com';
    IdSMTP.Port := 465;
    IdSMTP.ConnectTimeout := 5000;
    IdSMTP.Username := 'отправитель@gmail.com';
    IdSMTP.Password := 'пароль';
 
    IdMessage.From.Name := 'получатель';
    IdMessage.From.Address := 'отправитель@gmail.com';
    IdMessage.Recipients.EMailAddresses := 'получатель@yandex.ru';
    IdMessage.Subject := ASubject;
    IdtTextPart.ContentType := 'text/plain';
    IdtTextPart.CharSet := 'Windows-1251';
    IdtTextPart.Body.Text := ABody;
 
    IdSMTP.Connect;
    if IdSMTP.Connected then
      try
        IdSMTP.Send(IdMessage);
      except
        on E: Exception do
         caption:='SendEMail.Send';
      end;
    IdSMTP.Disconnect(true);
  except
    on E: Exception do
         caption:='SendEMail.Send2';
  end;
  IdtTextPart.Free;
  if Assigned(IdAttachment) then
    IdAttachment.Free;
  IdMessage.Free;
  IdSSLIOHandlerSocketOpenSSL.Free;
  IdSMTP.Free;
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)