Войти

Показать полную графическую версию : Как проверить несколько файлов функцией File exests (FileЕxests) и отправить


Eirstream
25-04-2021, 19:53
Здравствуйте, подскажите, не могу понять, как мне лучше сделать.
В папке с 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
Eirstream, создайте массив масок файлов на основе перечня:
Александровский
Пятигорск
Ессентуки
Нефтекумск


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

Eirstream
26-04-2021, 13:50
создайте массив масок файлов на основе перечня:
Код:
Александровский
Пятигорск
Ессентуки
Нефтекумск

и пользуйте поиск по маске для каждого элемента массива масок: 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.


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

При нажатии на кнопку, вот так получилось, а вот как дальше?
https://a.radikal.ru/a05/2104/ac/e7f50d5354e4t.jpg (https://radikal.ru/big/2qbme8l9l9icv)

Eirstream
29-04-2021, 21:45
Eirstream, создайте массив масок файлов на основе перечня:
Код:
Александровский
Пятигорск
Ессентуки
Нефтекумск

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




© OSzone.net 2001-2012