Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как проверить несколько файлов функцией File exests (FileЕxests) и отправить (http://forum.oszone.net/showthread.php?t=348622)

Eirstream 25-04-2021 19:53 2956377

Как проверить несколько файлов функцией File exests (FileЕxests) и отправить
 
Здравствуйте, подскажите, не могу понять, как мне лучше сделать.
В папке с exe файлом есть папка "Рапорта на выезд", в нее каждое утро кидаю файлы pdf с определенными именами (всего их 33, и к каждому имени может быть добавлена цифра от 1 до 4, пример: Андроповский2) - с этим проблем нет.
Мне нужно, чтобы программа сама проверяла есть ли файлы или нет, и если есть хотя бы один файл, то отправляла на определенный адрес, если есть оба, то отправлала оба. В этом основная суть.

Пример списка файлов в папке "Рапорта на выезд":
Александровский.pdf
Александровский2.pdf
Пятигорск.pdf
Ессентуки.pdf
Нефтекумск.pdf


Проблема в том, что если нет какого-либо из файлов (в строках ниже), то письмо не отправляется, выдает 'Не удалось отправить сообщение #'
Если оба файла есть Александровский.pdf и Александровский2.pdf, то отправляет без проблем.
Или можете кто-то посоветует реализовать отправку файлов по другому.
Самое главное, чтобы отправлял на определенные адреса - определенные файлы. Если есть хотя бы один файл, то отправлял, а если файлов нет вообще, то не отправлял, но продолжал отправку на другие адреса, других файлов.

Часть кода:
IF FileExists(Dir+'\Рапорта на выезд\Александровский.pdf') and
FileExists(Dir+'\Рапорта на выезд\Александровский2.pdf') then

Send(IdMessage1)
else
ShowMessage ('Не удалось отправить сообщение 1');
Disconnect()
....

Заранее благодарю за помощь и ответы.
Код программы ниже.

Код:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,IdAttachmentFile, StdCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
  IdSMTPBase, IdSMTP, IdMessage, ImgList, ExtCtrls, IdIOHandler,
  IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdServerIOHandler;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdSMTP1: TIdSMTP;
    IdMessage1: TIdMessage;
    IdMessage2: TIdMessage;
    IdMessage3: TIdMessage;
        Label1: TLabel;
        Label2: TLabel;
    Label3: TLabel;
      Image1: TImage;
    IdServerIOHandlerSSLOpenSSL1: TIdServerIOHandlerSSLOpenSSL;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;

    procedure Button1Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
dir : string;
filename : string;
  SSLOpen : TIdSSLIOHandlerSocketOpenSSL;
begin
dir:= GetCurrentDir;
With IdSMTP1 do Begin
  Host := 'smtp.yandex.ru';
  Port := 465;
  AuthType := satDefault;
  Username := 'МОЙ АДРЕС@yandex.ru';
  Password := 'МОЙ ПАРОЛЬ К АДРЕСУ';

  // для SSL
  SSLOpen := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  SSLOpen.Destination := Host+':'+IntToStr(Port);
  SSLOpen.Host := Host;
  SSLOpen.Port := Port;
  SSLOpen.DefaultPort := 0;
  SSLOpen.SSLOptions.Method := sslvSSLv23;
  SSLOpen.SSLOptions.Mode := sslmUnassigned;

  IOHandler := SSLOpen;
  UseTLS := utUseImplicitTLS;

  Connect() ;
      if Connected then
  //IdMessage1:= TIdMessage.Create(Application);
  IdMessage1.ContentType:='text/html; charset=windows-1251';
  IdMessage1.Body.Text:='Привет из Delphi';
  IdMessage1.Subject := 'Проверка почты';
  IdMessage1.From.Address := 'МОЙ АДРЕС@yandex.ru';
  IdMessage1.From.Name := 'МОЙ АДРЕС@yandex.ru';
  IdMessage1.Recipients.EMailAddresses :='АДРЕС1@yandex.ru';
 IdMessage1.ContentType := 'multipart/mixed';
TIdAttachmentFile.Create(IdMessage1.MessageParts, Dir+'\Рапорта на выезд\Андроповский.pdf') ;
TIdAttachmentFile.Create(IdMessage1.MessageParts, Dir+'\Рапорта на выезд\Андроповский2.pdf') ;
IF FileExists(Dir+'\Рапорта на выезд\Александровский.pdf') and
FileExists(Dir+'\Рапорта на выезд\Александровский2.pdf') then

//ShowMessage ('Сообщение отправлено')
Send(IdMessage1)
    else
  ShowMessage ('Не удалось отправить сообщение 1');
  Disconnect();
Connect() ;
      if Connected then
  //IdMessage1:= TIdMessage.Create(Application);
  IdMessage2.ContentType:='text/html; charset=windows-1251';
  IdMessage2.Body.Text:='Привет из Delphi';
  IdMessage2.Subject := 'Проверка почты';
  IdMessage2.From.Address := 'МОЙ АДРЕС@yandex.ru'; {<<Должно совпадать с SMTP.UserName}
  IdMessage2.From.Name := 'МОЙ АДРЕС@yandex.ru';
  IdMessage2.Recipients.EMailAddresses :='АДРЕС2@yandex.ru';
 IdMessage2.ContentType := 'multipart/mixed';
TIdAttachmentFile.Create(IdMessage2.MessageParts, Dir+'\Рапорта на выезд\Пятигорск.pdf') ;
TIdAttachmentFile.Create(IdMessage2.MessageParts, Dir+'\Рапорта на выезд\Пятигорск2.pdf') ;
IF FileExists(Dir+'\Рапорта на выезд\Пятигорск.pdf') and
FileExists(Dir+'\Рапорта на выезд\Пятигорск2.pdf') Then

//ShowMessage ('Сообщение отправлено')
Send(IdMessage2)
    else
  ShowMessage ('Не удалось отправить сообщение 2');
  Disconnect();
end;
end;
 end.


Iska 25-04-2021 23:02 2956386

Eirstream, создайте массив масок файлов на основе перечня:
Код:

Александровский
Пятигорск
Ессентуки
Нефтекумск

и пользуйте поиск по маске для каждого элемента массива масок: FindFirst - Функция. Справочник - Основы Delphi + FindNext - Функция. Справочник - Основы Delphi.

Eirstream 26-04-2021 13:50 2956426

Цитата:

Цитата Iska
создайте массив масок файлов на основе перечня:
Код:
Александровский
Пятигорск
Ессентуки
Нефтекумск

и пользуйте поиск по маске для каждого элемента массива масок: FindFirst - Функция. Справочник - Основы Delphi + FindNext - Функция. Справочник - Основы Delphi »

Спасибо за идею и совет, но у меня не сильно большой опыт в этом всем, можно сказать начинающий. Я так понял, что необходимо с помощью процедуры с функциями find... найти все файлы с расширением pdf в нужной мне папке. Записать те файлы, которые процедура нашла, а затем сделать условие, что если в списке есть такой файл, то добавить его и отправить письмо.
Попробовал сделать с функциями, но не пойму как вывести и список или включить его куда-либо.
Код:

procedure ScanFiles(Dir: string; Mask: string);
var
SR: TSearchRec;
ListBox1: TStrings;
Begin
dir:= GetCurrentDir;
Mask:= '*.pdf';
​ ​ if FindFirst(Dir+'\Рапорта на выезд\' + Mask, faAnyFile, SR) = 0 then
begin
​ ​ repeat
​ ​ Application.ProcessMessages;
​ ​ if (SR.Attr and faDirectory)<> faDirectory then
​ ​ ​ ​ ​ ​ ​ begin
​ ​ ​ ​ ​ ​ ListBox1.Add(Dir+'\Рапорта на выезд\' + SR.Name);
​ ​ ​ ​ ​ ​ ​ ​ end;
​ ​ until FindNext(SR) <> 0;
​ ​ ​ ​ ​ ​ ​ FindClose(SR);
end;
End;
end.

Не пойму как связать две процедуры. Или можно сделать список файлов, и если в папке есть эти файлы, то добавлять и отправлять, но пока не знаю как это сделать

При нажатии на кнопку, вот так получилось, а вот как дальше?
Скрытый текст


Eirstream 29-04-2021 21:45 2956715

Цитата:

Цитата Iska
Eirstream, создайте массив масок файлов на основе перечня:
Код:
Александровский
Пятигорск
Ессентуки
Нефтекумск

и пользуйте поиск по маске для каждого элемента массива масок: FindFirst - Функция. Справочник - Основы Delphi + FindNext - Функция. Справочник - Основы Delphi. »

А обязательно нужно выводить в список, и не пойму как сделать выборку из этого списка для отправки?


Время: 08:16.

Время: 08:16.
© OSzone.net 2001-