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


Автор: dinja3 1.4.2013, 18:03
Добрый день, помогите пожалуйста решить проблему с рассылкой писем.

У меня на 1-ой форме есть ComboBox, а на 2-ой форме таблица из базы данных.

В таблице 2 столбца: Название группы, E-mail получателя.

Мне надо сделать так, что бы если в ComboBox-е выбираем или пишем "Лётчики" (группа), то он бы проверял данные из таблицы, если есть, то отправлять. Вот к примеру в таблице в группе "Лётчики" учатся 20 человек, значит он должен отправлять 20-и людям.

Я понимаю, что надо писать цикл, но у меня не получается.

Вот код для отправки одному человеку без цикла

Код

procedure TForm8.Button1Click(Sender: TObject);
var i:Integer;
begin
  IdSMTP1.Port:=25;
  IdSMTP1.Host:='smtp.mail.ru';
  IdSMTP1.Connect(5000);
  IdSMTP1.AuthenticationType:=atLogin;
  IdSMTP1.Username:='username';
  IdSMTP1.Password:='password';
  if IdSMTP1.Connected=true then
    begin
      ShowMessage('connected');
      IdMessage1.Clear;
      IdMessage1.Subject:=ComboBox1.Text;
      IdMessage1.Recipients.EMailAddresses:='[email protected]';
          end;
      IdMessage1.From.Address:='[email protected]';
      IdMessage1.Body.Text:=Memo1.Text;
      IdMessage1.From.Name:='Mail';
      IdSMTP1.Send(IdMessage1);
    end;
  IdSMTP1.Disconnect;
end;


Он успешно отправляет, то есть проблем нету.

А вот код с циклом который я пытался написать

Код

procedure TForm8.Button1Click(Sender: TObject);
var i:Integer;
begin
  IdSMTP1.Port:=25;
  IdSMTP1.Host:='smtp.mail.ru';
  IdSMTP1.Connect(5000);
  IdSMTP1.AuthenticationType:=atLogin;
  IdSMTP1.Username:='username';
  IdSMTP1.Password:='password';
  if IdSMTP1.Connected=true then
    begin
      ShowMessage('connected');
      IdMessage1.Clear;
      IdMessage1.Subject:=ComboBox1.Text;
        for i:=1 to Polu4atelj.Table1.RecordCount do
          begin
            Polu4atelj.Table1.RecNo:=i;
            if ComboBox2.Text=Polu4atelj.Table1.FieldValues['Grupa'] then
      IdMessage1.Recipients.EMailAddresses:=Polu4atelj.Table1.FieldValues['Email_name']; //то есть сюда должны попадать те значения кого совпали из ComboBox и таблицы
          end;
      IdMessage1.From.Address:='[email protected]';
      IdMessage1.Body.Text:=Memo1.Text;
      IdMessage1.From.Name:='Mail';
      IdSMTP1.Send(IdMessage1);
    end;
  IdSMTP1.Disconnect;
end;


Но вся проблема в том, что он отправляет только последнему у кого совпадает запись с ComboBox-ом. То есть он пробегает весь столбец и у кого последнего запись совпадает, тому он и отправляет.

Прошу подкорректировать код или написать другой, если этот не подходит. Я отмучился с этим циклом, у меня уже нет идей. Прошу помочь, кто в этом разбирается.

Автор: northener 1.4.2013, 18:19
Цитата(dinja3 @  1.4.2013,  18:03 Найти цитируемый пост)
IdSMTP1.Send(IdMessage1);

Эта строка должна быть внутри цикла, а не снаружи.

Автор: dinja3 1.4.2013, 18:44
Спасибо но проблема, ещё не решена, теперь он отправляет 20 раз на E-mail, который указан у последнего учащегося который совпадает с группой.

Код

procedure TForm8.Button1Click(Sender: TObject);
var i:Integer;
begin
  IdSMTP1.Port:=25;
  IdSMTP1.Host:='smtp.mail.ru';
  IdSMTP1.Connect(5000);
  IdSMTP1.AuthenticationType:=atLogin;
  IdSMTP1.Username:='username';
  IdSMTP1.Password:='password';
  if IdSMTP1.Connected=true then
    begin
      ShowMessage('connected');
      IdMessage1.Clear;
      IdMessage1.Subject:=ComboBox1.Text;
      IdMessage1.Recipients.EMailAddresses:=Polu4atelj.Table1.FieldValues['Email_name']; //то есть сюда должны попадать те значения кого совпали из ComboBox и таблицы
      IdMessage1.From.Address:='[email protected]';
      IdMessage1.Body.Text:=Memo1.Text;
      IdMessage1.From.Name:='Mail';
      for i:=1 to Polu4atelj.Table1.RecordCount do
          begin
            Polu4atelj.Table1.RecNo:=i;
            if ComboBox2.Text=Polu4atelj.Table1.FieldValues['Grupa'] then
            IdSMTP1.Send(IdMessage1);
          end;
    end;
  IdSMTP1.Disconnect;
end;

Автор: dinja3 1.4.2013, 21:28
Спасибо northener за подсказку, до меня хоть дошло как проблему решить

Проблему решил

Код

procedure TForm8.Button1Click(Sender: TObject);
var i:Integer;
begin
  IdSMTP1.Port:=25;
  IdSMTP1.Host:='smtp.mail.ru';
  IdSMTP1.Connect(5000);
  IdSMTP1.AuthenticationType:=atLogin;
  IdSMTP1.Username:='username';
  IdSMTP1.Password:='password';
  if IdSMTP1.Connected=true then
  for i:=0 to Polu4atelj.Table1.RecordCount -1 do
    begin
      IdMessage1.Clear;
      IdMessage1.Subject:=ComboBox1.Text;
      IdMessage1.Recipients.EMailAddresses:=Polu4atelj.Table1.FieldValues['Email_name'];
      IdMessage1.From.Address:='[email protected]';
      IdMessage1.Body.Text:=Memo1.Text;
      IdMessage1.From.Name:='Mail';
      Polu4atelj.Table1.RecNo:=i;
      if ComboBox2.Text=Polu4atelj.Table1.FieldValues['Grupa'] then
        IdSMTP1.Send(IdMessage1);
    end;
  IdSMTP1.Disconnect;
end;

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