Отправка письма с вложением — Delphi XE

Облазив множество сайтов и форумов в поисках новой процедуры для отправки письма с вложением с помощью Delphi XE 5 (ведь старый способ реализованный в Delphi 7 оказался неработоспособным в Delphi XE 5) я наткнулся наконец-то на нужную мне модернизированную процедуру. И вот здесь решил я её выложить, вдруг кому-нибудь понадобится.

Кидаем на форму три компонента: IdHTTP, IdMessage, IdSSLIOHandlerSocketOpenSSL

В Uses прописываем: idAttachment,IdAttachmentFile

uses idAttachment,IdAttachmentFile;
procedure TForm1.Button2Click(Sender: TObject);
var
attach:TidAttachment;
attach2:TidAttachment;
msg:TIdMessage;
FileDir:string;
att:TIdAttachmentFile;
IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
IdMessage1 := TIdMessage.Create;
IdMessage1.From.Address:=’mail1@yandex.ru’; // адрес первого ящика
IdMessage1.Recipients.EMailAddresses:=’mail2@yandex.ru’; // адрес второго ящика на который прейдет письмо
IdMessage1.Subject:= UTF8Encode(‘234’);
idmessage1.Subject:=AnsiString(‘Привет!’);// тема письма
IdMessage1.Date:= now;

{настройка компонентов перед отправкой}
IdSMTP1:= TIdSMTP.Create(nil);

IdSMTP1.Host:=’smtp.yandex.ru’;
IdSMTP1.Port:=465; // обычно при использование ssl 495, 587 или стандартный 25
IdSMTP1.Username:=’mail1@yandex.ru’;// адрес первого ящика
IdSMTP1.Password:=’111111′; //пароль от первого ящика с которого шлём письмо
IdSMTP1.AuthType:=satDefault;

{это необходимо использовать для SSL}
IdSSLIOHandlerSocketOpenSSL:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IdSSLIOHandlerSocketOpenSSL.Destination := IdSMTP1.Host+’:’+IntToStr(IdSMTP1.Port);
IdSSLIOHandlerSocketOpenSSL.Host := IdSMTP1.Host;
IdSSLIOHandlerSocketOpenSSL.Port := IdSMTP1.Port;
IdSSLIOHandlerSocketOpenSSL.DefaultPort := 0;
IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;
//IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv2;

IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;

IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL;
IdSMTP1.UseTLS := utUseImplicitTLS;

FileDir:=ExtractFilePath(Application.ExeName)+’file.txt’;
if FileExists(FileDir) then begin
try
IdMessage1.IsEncoded:=true;
att:=TIdAttachmentfile.Create(IdMessage1.MessageParts,FileDir);

{отправляем письмо}
IdSMTP1.Connect();
if idsmtp1.Connected then
showmessage(‘Письмо успешно отправлено!’);
IdSMTP1.Send(IdMessage1);
Application.ProcessMessages;
IdSMTP1.Disconnect;
idMessage1.Free;
IdSSLIOHandlerSocketOpenSSL.Free;
idSMTP1.Free;
except

end;
end;
end;

Да для работы компонента IdSSLIOHandlerSocketOpenSSL вам возможно понадобятся две динамические библиотеки, которые можно скачать перейдя по этой ссылке.





Отправка письма с вложением — Delphi XE: 12 комментариев

  1. МОЛОДЦОМ (IdSSLIOHandlerSocketOpenSSL…)
    «проблема» SSL (ДЛЯ XE 2016 года) —
    решилась «вашими» трудами — уже хотел бросить это дело..
    .
    2. Выскакивала Ошибка (Syntactically invalid EHLO argument(s)).
    но другие «молодцы» (MQL4 форум.htm) «нашли решение».
    …Имя Компьютера ОБЯЗАТЕЛЬНО должно быть На Английском Языке.
    (Мой Компьютер/ПраваяКнопка/ИзменитьИмяПК).
    3.

  2. Привет !!! Ваш код не работает если отправляешь с windous 8.
    Если отправляешь с ХР то работает, а так выходит ошибка

    1. Мадияр, у меня нет под рукой Windows 8, но я думаю, что вы где-то допустили ошибку. Вот рабочий исходник отправки письма с файлом http://wisekaa.org/loaded/mail.rar протестирован в Windows 7 и Windows 10.

  3. sergey, у меня тоже Delphi XE 6, Windows 7 и всё прекрасно работает.
    скачайте файл из комментария, который находится
    выше.

    1. Сергей, проблема (я думаю) не в библиотеке indy, а вашем компе.
      Я протестировал свой исходник на ноутбуке с Windows 10, всё работает.
      «socterror # 10060 — не удается подключиться к удаленному серверу».
      До работающего сервера (smtp.yandex.ru) запросы от программы не доходят, значит нужно копаться в фаерволе или антивирусе, а может и стоит просканировать вашу Ось dr web cureit.

    1. На форму кидаем: ListBox, ещё одну кнопку — Button и компонент OpenDialog

      procedure TForm1.Button2Click(Sender: TObject);
      begin
      if (OpenDialog1.Execute) then
      begin
      ListBox1.Items.Add(OpenDialog1.FileName);
      OpenDialog1.FileName:='';
      end;
      end;

      procedure TForm1.send;

      var
      attach: TidAttachment;
      attach2: TidAttachment;
      msg: TIdMessage;
      Pas: integer;
      Pas2, Pas3, FileDir: string;
      dwConnectionTypes: DWORD;
      att: TIdAttachmentFile;
      IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
      i : Integer;
      begin

      IdMessage1 := TIdMessage.Create;
      IdMessage1.From.Address := 'mail@yandex.ru'; // с которого шлём письмо
      IdMessage1.Recipients.EMailAddresses := 'mail2222@yandex.ru'; // в котором будем получать письмо
      IdMessage1.Subject := UTF8Encode('234');
      IdMessage1.Subject := AnsiString('Привет.'); // тема письма
      IdMessage1.Date := now;

      { настройка компонентов перед отправкой }
      IdSMTP1 := TIdSMTP.Create(nil);

      IdSMTP1.Host := 'smtp.yandex.ru';
      IdSMTP1.Port := 465;
      // обычно при использование ssl 495, 587 или стандартный 25
      IdSMTP1.Username := 'mail@yandex.ru';
      IdSMTP1.Password := '123456789'; // пароль от mail@yandex.ru
      IdSMTP1.AuthType := satDefault;

      { это необходимо использовать для SSL }
      IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
      IdSSLIOHandlerSocketOpenSSL.Destination := IdSMTP1.Host + ':' +
      IntToStr(IdSMTP1.Port);
      IdSSLIOHandlerSocketOpenSSL.Host := IdSMTP1.Host;
      IdSSLIOHandlerSocketOpenSSL.Port := IdSMTP1.Port;
      IdSSLIOHandlerSocketOpenSSL.DefaultPort := 0;
      IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;

      IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;

      IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL;
      IdSMTP1.UseTLS := utUseImplicitTLS;

      begin
      try
      IdMessage1.IsEncoded := true;
      if ListBox1.Items.Count > 0 then
      for i:=0 to ListBox1.Items.Count-1 do
      att:=TIdAttachmentFile.Create(IdMessage1.MessageParts,ListBox1.Items.Strings[i]);

      { отправляем письмо }
      IdSMTP1.Connect();
      if IdSMTP1.Connected then
      showmessage('Письмо успешно отправлено!');
      IdSMTP1.send(IdMessage1);
      Application.ProcessMessages;
      IdSMTP1.Disconnect;
      IdMessage1.Free;
      IdSSLIOHandlerSocketOpenSSL.Free;
      IdSMTP1.Free;

      except

      end;
      end;
      end;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*