Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

Пожалуйста, помогите организовать цикл!   Найти похожие ветки 

 
Pretender ©   (2006-04-11 11:51) [0]

Доброго времнени суток всем! Я хочу написать программу, которая формировала бы письма с вложениями и ложила их в активный ящик. Количество файлов задается вручную, из формы. У меня возникла проблема с формированием цикла. Вот часть кода:

procedure TForm1.Button1Click(Sender: TObject);
var i,n: integer;
   F1: TextFile;
   St1: String;
begin
n:=StrToInt(Edit1.Text);
  AssignFile(F1,"sm.ini");
 Reset(F1);
 Readln(F1,st1);
for i:=n downto 1 do

 IdMessage1.Recipients.EMailAddresses:=st1;
 IdMessage1.CharSet:="Windows-1251";
 IdMessage1.ContentType:="text/plain";
 idMessage1.Subject:="Пополение (часть " + IntTostr(i) + " из " + IntTostr(n) + ")" ;
        for i:=n downto 1 do Memo1.Lines.Insert(0,"Сформирован файл пополения № " + IntTostr(i));

end;

Вот как сделать, чтобы последовательно формировалось сообщение от 1 до n (n вводится вручную). Т.е. сначала создается объкт - само сообщение, затем последовательно заполняется адрес (из ini-файла), тема (тоже генерируется соответствующие цифры в теме), присоединяется файл и письмо ложится в активный ящик (не отправляется, просто ложится), а затем формируется новое сообщение т.д. до n. Как это реализовать? Я уже совсем запутался... :(


 
tsa   (2006-04-11 11:52) [1]

Спамеры обнаглели!


 
Вот так   (2006-04-11 12:08) [2]

for i:=n downto 1 do begin

IdMessage1.Recipients.EMailAddresses:=st1;
IdMessage1.CharSet:="Windows-1251";
IdMessage1.ContentType:="text/plain";
idMessage1.Subject:="Пополение (часть " + IntTostr(i) + " из " + IntTostr(n) + ")" ;
       for i:=n downto 1 do Memo1.Lines.Insert(0,"Сформирован файл пополения № " + IntTostr(i));
end;


 
tsa   (2006-04-11 12:10) [3]


>  [2] Вот так   (11.04.06 12:08)

А ещё можно поливать пивом из пульверизатора тополя


 
Pretender ©   (2006-04-11 13:13) [4]


> Спамеры обнаглели!

Уважемый, я с Вами не знаком, поэтому скажу просто: не гоните! Я симтемный администратор и эта программа не для организации массовых рассылок, а для отправки пополнения нашим клиентам.


> for i:=n downto 1 do begin
>
> IdMessage1.Recipients.EMailAddresses:=st1;
> IdMessage1.CharSet:="Windows-1251";
> IdMessage1.ContentType:="text/plain";
> idMessage1.Subject:="Пополение (часть " + IntTostr(i) +
> " из " + IntTostr(n) + ")" ;
>        for i:=n downto 1 do Memo1.Lines.Insert(0,"Сформирован
> файл пополения № " + IntTostr(i));
> end;

Вот спасибо, на работу приду - попробую.


 
Pretender ©   (2006-04-11 14:22) [5]

Гм. Это поборол... А в ящик активный не кладётся... Куда посмотреть?


 
Anatoly Podgoretsky ©   (2006-04-11 14:37) [6]

Пригласите программиста, а не системного администратора.


 
Pretender ©   (2006-04-11 14:39) [7]

Да я сам разобраться хочу...


 
Anatoly Podgoretsky ©   (2006-04-11 14:46) [8]

Это долго


 
Сергей М. ©   (2006-04-11 14:48) [9]


> в ящик активный не кладётся


Что есть "активный ящик" и где в своем коде ты в него пытаешься что-то "накласть" ?


 
Pretender ©   (2006-04-11 14:54) [10]

Активный ящик - у меня TheBat висит в трее, в нем ящик с каталогом "Исходящие", в этот каталог письмо и должно попасть.


 
Сергей М. ©   (2006-04-11 15:01) [11]


> Pretender ©   (11.04.06 14:54) [10]


Не в ту сторону копаешь.

IdSMTP знать не знает ни про какие TheBat и знать не обязан.


 
Pretender ©   (2006-04-11 15:07) [12]

А каким образом сформированное сообщение попадёт в каталог "Исходящие"? Вот, допустим, консольная версия архиватора rar при задании сооответствующего параметра в командной строке, архивированные файлы пихает прямо в "Исходящие". Как это можно реализовать?
А в коде естественно ничего нет, я пока не знаю как это делать :)


 
Сергей М. ©   (2006-04-11 15:26) [13]


> А каким образом сформированное сообщение попадёт в каталог
> "Исходящие"?
> консольная версия архиватора rar при задании сооответствующего параметра в > командной строке, архивированные файлы пихает прямо в "Исходящие"


Средствами MapiSendMail().

Это ф-ция фигурирует в составе MS MAPI, к коему IdSMTP не имеет ни малейшего отношения - компонент этот работает с SMTP-сервисом напрямую, минуя любой из прочих SMTP-клиентов, установленных в системе.

Говорят же тебе - найми программиста, не парься)


 
Pretender ©   (2006-04-11 16:07) [14]


> найми программиста

Не, я не работодатель, чтоб людей нанимать, это так, чисто для себя. Что ж, спасибо за помосщь, буду сам разбираться.


 
tsa   (2006-04-11 16:16) [15]

Это не правильный системный администратор.


 
Pretender ©   (2006-04-12 12:46) [16]

rocedure TForm1.Button1Click(Sender: TObject);

var i,n,k: integer;
   F: TextFile;
   St1,St2: String;
   mail: TStringList;
begin
 ShellExecute(Application.MainForm.Handle,nil,Pchar("rar.exe"),"e -y *.rar",nil,SW_ShowNormal);
 if StrToInt(Edit1.Text)>1 then
 ShellExecute(Application.MainForm.Handle,nil,Pchar("rar.exe"),"m -y -m5 -v1000 -ag0M0A popoln *.ans",nil,SW_ShowNormal) else
 ShellExecute(Application.MainForm.Handle,nil,Pchar("rar.exe"),"m -y -m5 -ag0M0A popoln *.ans",nil,SW_ShowNormal);
 n:=StrToInt(Edit1.Text);
 AssignFile(F,"sm.ini");
 Reset(F);
 Readln(F,st1);
 Readln(F,st2);

 for i:=1 to n do begin
   mail := TStringList.Create;
 try
   mail.values["to"] := st1;

   mail.values["subject"] := "Пополнение (часть " + IntTostr(i) + " из " + IntTostr(n) + ")";
   mail.values["body"] := "Test";
   mail.values["attachment0"] := st2 + "\Test.txt";
   sendEMail(Application.Handle, mail);

 finally

   mail.Free;

   for k:=n downto 1 do Memo1.Lines.Insert(0,"Сформировано письмо № " + IntTostr(k));

 end;

  CloseFile(F);
end;

Теперь проблема в том, что первый раз параметры st1 и st2 берутся из файла нормамально, а если (не закрывая проекта) нажать ещё раз кнопку Button1, то приложение вылетает с эксепшеном "Project Project1.exe raised exception class EInOutError with message "I/O error 103"" на строчке CloseFile(F). Как это корректно реализовать?


 
Старик   (2006-04-12 12:57) [17]

Ну... рассылку клиентам организовать... тут два варианта:
1. Твоя прога сама напрямую на мыло высылает сформированные письма. Это, имхо, лучший вариант. Пример на отслыку почты есть в демках делфи.
2. С другой стороны, если тебе нужно, чтобы твои сформированные письма появлялись именно в Бате и именно в его ящике... я вижу только один способ - редактировать соответствующий файл у Бата - он свои почтовые архивы хранит у себя в директории. Вот один из тех файликов и надо редактировать. А потом не забыть перегрузить Бата.


 
Pretender ©   (2006-04-12 14:02) [18]

Старик

Да я практически всё сделал, только непонятно, почему при первом нажатии инишка читается, а при втором и т.д. уже нет - вот в чём вопрос.


 
Anatoly Podgoretsky ©   (2006-04-12 14:10) [19]

Pretender ©   (12.04.06 14:02) [18]
С инишками так не работают
AssignFile(F1,"sm.ini");
Reset(F1);


 
Pretender ©   (2006-04-12 14:34) [20]

Anatoly Podgoretsky

Делал я так, тоже самое. Верней эксепшн возникает на CloseFile(F1), если CloseFile(F1) не ставить, письма второй раз не генерятся.


 
Kolan ©   (2006-04-12 14:35) [21]

С инишками так не работают
AssignFile(F1,"sm.ini");
Reset(F1);


Есть класс TIniFile...


 
Pretender ©   (2006-04-12 15:34) [22]

Вот что я сделал:

В процедуре Button1Click добавил

var Cfg: TIniFile;

begin

 Cfg:=TIniFile.Create("sm.ini");
 st1:=Cfg.ReadString("Config","Addr","");
 st2:=Cfg.ReadString("Config","Path","");
.....

Инишка выглядит так
[Config]
Addr=user@xyz.com
Path=C:\1

Так вот, эти значения в переменные st1, st2 не заносятся... А почему?


 
Pretender ©   (2006-04-13 08:24) [23]

Всё просто оказалось, нужно вписать ExtractFilePath(Application.Exename) и всё работает. Да... господа профи, хорошо же вы новичкам помогаете, ничего не скажешь. :)


 
balepa ©   (2006-04-13 08:26) [24]

Да, они такие


 
Pretender ©   (2006-04-13 09:58) [25]

Нет, без обид только. Просто я сравниваю как сисадмины помогают начинающим - если вопрос задан по существу, тебе на него ответят. А тут почему-то нет. Хотя... С сабжем помогли, а всё остальное - это уже другая песня :)


 
Anatoly Podgoretsky ©   (2006-04-13 10:37) [26]

Pretender ©   (13.04.06 09:58) [25]
Программисты такие же, если вопрос задан по существу, тебе на него ответят.


 
Pretender ©   (2006-04-13 11:51) [27]

Ок. Тогда вопрос по существу :):

как с помощью FindFirst, FindNext и FindClose организовать поиск архивов по маске popoln*.part*.rar и по завершении поиска занести их количество в переменную n?


 
Anatoly Podgoretsky ©   (2006-04-13 11:58) [28]

Pretender ©   (13.04.06 11:51) [27]
Это есть в справке


 
Pretender ©   (2006-04-13 12:57) [29]

Вот что я сделал пока:

 if FindFirst(st2, faArchive, SR) = 0 then
    n := 0;
    begin
       repeat
       if (sr.Attr and faArchive) = sr.Attr then
       begin
       n := n + 1;
       label3.Caption:= sr.Name;
       end;
       until FindNext(SR) <> 0;
     FindClose(SR);
    end;

Но почему-то в label3.Caption имя файла не заносится...


 
Anatoly Podgoretsky ©   (2006-04-13 13:04) [30]

Точку останова поставь.
Код не понятный, что ты хочешь сделать?


 
Плохиш ©   (2006-04-13 13:11) [31]


> Pretender ©   (13.04.06 12:57) [29]

if (sr.Attr and faArchive) = faArchive then


 
Anatoly Podgoretsky ©   (2006-04-13 13:23) [32]

Плохиш ©   (13.04.06 13:11) [31]
Но это же противоположный результат, чем в коде


 
Плохиш ©   (2006-04-13 13:26) [33]


> Anatoly Podgoretsky ©   (13.04.06 13:23) [32]

А я телепатор из ремонта в n-й раз получил, проверяю ;-)


 
Pretender ©   (2006-04-13 13:32) [34]


> А я телепатор из ремонта в n-й раз получил, проверяю

:)))

Anatoly Podgoretsky

Пытаюсь найти архивный файл и при нахождении оного прибавить n на единицу, а в Label3 занести имя файла (хоть какого-нибудь, наверно это будет последний файл) - если я правильно понял пример. Что значит точка останова - брейкпойнт? Дело в том, что и в справке и в книге, в которой я смотрю пример использования, примеры сделаны ацтойно (не исключаю и свою глупую голову)...


 
Pretender ©   (2006-04-13 14:09) [35]

Да, st2 содержит путь к папке, в которой эти архивы лежат (берется из ини файла).


 
Anatoly Podgoretsky ©   (2006-04-13 14:21) [36]

Pretender ©   (13.04.06 13:32) [34]
1. Тогда согласно телепатору от Плохиша.
2. N := N + 1
3. Label3.Caption := sr.Name;
4. это в отладчике, нажимаешь F5 программа остановится в этой точке
5. примеры сделаны нормально, но если не устраивают, то ко мне на сайт, там самая правильная версия по данному вопросу.


 
Pretender ©   (2006-04-13 14:42) [37]

Это DirScan или File Size Analyzer? П. 2-3 к чему? Сделал

if (sr.Attr and faArchive) = faArchive then

в n занеслось 1, в labelCaption занеслось пустое место, т.е. ничего.


 
Anatoly Podgoretsky ©   (2006-04-13 14:54) [38]

Ни то ни другое, это программы -  очень старые не оптимальные, на сайте есть FAQ из ФИДО, вот его смотреть, при том найдешь ответы и на другие вопросы. Кроме это могут быть полезны две статьи
1. Двоичная математика, работа с битовой логикой
2. Работа с файлами Паскаля


Пункт 2 и 3 к тому, что ты про них спросил.


 
Плохиш ©   (2006-04-13 15:00) [39]


> в n занеслось 1, в labelCaption занеслось пустое место,
> т.е. ничего.

Даю 98%, что туда занеслась точка.


 
Pretender ©   (2006-04-13 15:13) [40]


> Даю 98%, что туда занеслась точка.

Нет, просто пустое место.

Anatoly Podgoretsky

Пошёл искать.



Страницы: 1 2 вся ветка

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.037 c
3-1141306264
Dosfalcon
2006-03-02 16:31
2006.04.30
Извлечение системного номера записи DBF


9-1128942318
SPACE
2005-10-10 15:05
2006.04.30
Народ никак немогу сделать скриншот из игрушки


2-1144760457
ANB
2006-04-11 17:00
2006.04.30
Как в Ворде заменить кусочек параграфа ?


2-1144998437
nastyok::
2006-04-14 11:07
2006.04.30
Table1.FindKey


8-1133471494
zxc
2005-12-02 00:11
2006.04.30
есть ли функции получения спектра wav