На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Проблемы с почтовым клиентом (TIdSMTP, TIdPOP3)
    В моей программе реализован почтовый клиент, использующий классы TIdSMTP и TIdPOP3. Среда разработки--Delphi 7.

    Вот код:

    отправка сообщений:

    ExpandedWrap disabled
      mMessege.Clear;
      mSMTP.AuthenticationType := atLogin;
      mSMTP.Username := 'user';
      mSMTP.Password := 'password';
      mSMTP.Host := '192.1.2.3';
      mSMTP.Port := 25;
      mMessege.CharSet := 'windows-1251';
      mMessege.ContentType := 'text/plain';
      mMessege.Subject := 'My Text';
      mMessege.Body.Add('My Text');
      mMessege.From.Address := 'myaddress@myserver.ru';
      mMessege.Recipients.EMailAddresses := 'myaddress@myserver.ru';
      myfilename := 'mytextfile.txt';
      fe := FileExists(myfilename);
      if (fe=true) then begin
      TIdAttachment.Create(mMessege.MessageParts, myfilename);
      end;
      //mMessege.IsEncoded := true;
      try
      mSMTP.Connect;
      mSMTP.Send(mMessege);
      except
      ShowMessage('Ошибка соединения с сервером!');
      end;
      mSMTP.Disconnect;
      mMessege.Clear;
      Exit;



    приём сообщений:

    ExpandedWrap disabled
      iMess := mPop.CheckMessages;
       
      If iMess = 0 then begin
      WriteToLog('на сервере отсутствуют сообщения!');
      RxTrayIcon1.Hint := 'на сервере отсутствуют сообщения!';
      iTimer :=IniTool.ReadInteger('Time', 'Timer', 15)*60;
      Timer1.Enabled := True;
      RxTimerPOP.Enabled := True;
      Exit;
      end;{end If iMess = 0}
       
      WriteToLog('На сервере ' + IntToStr(iMess) + 'новых сообщений!');
       
      For ii := 1 to iMess do begin
      mMessege.Clear;
       
      strFileName.Clear;
      strFormatNam.Clear;
      strTableName.Clear;
      strDataWrite.Clear;
      strAutorName.Clear;
       
      sForShablon:='';
      mPOP.RetrieveHeader(ii, mMessege);
      ctenc := mMessege.ContentTransferEncoding;
      if (ctenc='') then begin
      // если есть кодировка в сообщении
      mMessege.Clear;
      mMessege.NoDecode := true;
      mPOP.Retrieve(ii, mMessege);
      end
      else begin
      // если нет кодировки в сообщении
      mMessege.Clear;
      mPOP.Retrieve(ii, mMessege);
      end;
       
      FMimeMsg := TMimeMess.Create;
      FMimeMsg.Clear;
      FMimeMsg.Lines.SetText(mMessege.Body.GetText);
      FMimeMsg.DecodeMessage;
      FMimePart := FMimeMsg.MessagePart;
      for i := 0 to FMimePart.GetSubPartCount — 1 do begin
      FMimePart2 := FMimePart.GetSubPart(i);
      if FMimePart2.FileName <> '' then begin
      FMimePart2.DecodePart;
      FMimePart2.DecodedLines.SaveToFile(MainPath +'\Buffer\' + FMimePart2.FileName) ;
      end;
      end;
      FMimeMsg.Clear;
      for i:=0 to (mMessege.MessageParts.Count-1) do begin
      if (mMessege.MessageParts.Items[i].ClassType=TIdAttachment) then begin
      filename := MainPath + '\Buffer\'+ (mMessege.MessageParts.Items[i] as TIdAttachment).FileName;
      CopyFile(PChar(mMessege.MessageParts.Items[i].StoredPathName),PChar(filename),true);
      end;
      end;



    Сообщение нормально отправляется на сервер.
    Но при приёме сообщения с сервера почему-то не считывается аттач (вложение) -- файл mytextfile.txt . То есть почему-то не проходит ни часть кода FMimeMsg--там FMimePart.GetSubPartCount равно нулю, ни часть кода с mMessege.MessageParts -- там также mMessege.MessegeParts.Count также равно нулю.
    В чём причина этого? Что надо сделать так, чтобы аттач вытаскивался (в первую очередь меня интересует вариант с mMessege.MessegeParts, но также интересует и вариант с FMimeMsg.MessagePart )?
      ExpandedWrap disabled
        unit Unit1;
         
        interface
         
        uses
          Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
          Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
          IdTCPClient, IdMessageClient, IdPOP3, IdMessage,EncdDecd;
         
        type
          TForm1 = class(TForm)
            IdPOP31: TIdPOP3;
            Button1: TButton;
            Edit1: TEdit;
            Edit2: TEdit;
            Edit3: TEdit;
            IdMessage1: TIdMessage;
            procedure Button1Click(Sender: TObject);
          private
            { Private declarations }
          public
            { Public declarations }
          end;
         
        var
          Form1: TForm1;
         
        implementation
         
        {$R *.dfm}
         
        procedure TForm1.Button1Click(Sender: TObject);
        var
          i:integer;
          mescount:integer;
          s:string;
        begin
           CreateDir('c:\email');
           showmessage('Создана директория c:\email');
           idPOP31.Username:=edit1.Text;
           idPOP31.Password:=edit2.text;
           idPOP31.Host:=edit3.text;
           idPOP31.Connect();
           mescount:=idPOP31.CheckMessages;
           idPOP31.Retrieve(mescount,idMessage1);
           showmessage('в ящике - '+inttostr(mescount)+' писем');
              for i :=0 to idMessage1.MessageParts.Count-1 do
                begin
                  if (IdMessage1.MessageParts.Items[i] is TIdAttachment) then
                    begin
                      s:= TIdAttachment(IdMessage1.MessageParts[i]).FileName;
                      delete(s,1,pos('UTF-8',s)+7);  //делал под конкретную кодировку аля c mail.ru на mail.ru
                       delete(s,length(s)-1,2);      //делал под конкретную кодировку аля c mail.ru на mail.ru
                      s:=DecodeString(s);            //делал под конкретную кодировку аля c mail.ru на mail.ru
                      showmessage('получен файл '+s);
                      TIdAttachment(IdMessage1.MessageParts.Items[i]).SaveToFile('c:\email\'+s);
                    end;
                end;
         idpop31.disconnect;
        end;
         
        end.

      пример работает, но нужно допиливать
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0.0731 ]   [ 15 queries used ]   [ Generated: 24.10.26, 03:03 GMT ]