//id = id письма
//export_dir - каталог экспорта
//возврат - result 0,1,... 0 - ничего не делать, предполагается. что скрипт все сам сделал.
//1 - стандартно, скрипт или ничего не сказал или не отработал.


const UseAddressBookControl = false; // использовать ли контроль адресной книгой, то есть удалять ли письма, если они от неизвестного адресата
      UseDateAsSubdir = true; // создавать ли подкаталог в виде даты

      CreateNewFileNameIfExists = true; // создавать ли новое имя, если уже существует старое


      AutoUnpackCommand = '' ;//"c:\program files\7-zip\7z.exe" x -y "%s" -o"%s"'; // указать команду распаковки (если не указывать, то пропускаем). Файл распаковки указывается как %s, например:  '7z.exe -e %s'. Второй знак %s будет использоваться (если он указан, под имя экспортного каталога)
      ExecState = esNormal; // статус выполнения процесса autounpackcommand (удобно для отладки). Варианты - esHidden,EsMaximized, EsMinimized,esNormal
      ArchiveTypes = 'RAR;ZIP;7Z'; // типы архивов, которые будут распаковываться, через запятую или точку с запятой


      UseFarmnetOrders = true; // включить специальную автоматизацию импорта заявок из фармнета. отличие от стандартного метода тем, что в каталоге "Фармнет" создаются дополнительные подкаталоги согласно теме письма
      FarmnetAddress = 'nomail@farmnet.ru'; // адрес фармнета. в адресную книгу вносить его не нужно.
      FarmnetName = 'Фармнет';
      FarmnetTag = '(FarmNet Order system)'; // Эта метка должна стоять для всех заказов. иначе это что-то другое и тогда не юзать.


      UseInfoASOrders = true; // включить специальную автоматизацию импорта заявок из ИнфоАналитСистемы. отличие от стандартного метода тем, что в каталоге "ИНФОАС" создаются дополнительные подкаталоги согласно имени заказчика
      InfoASAddress = 'orders@infoas.biz'; // адрес системы, откуда поступают заказы. в адресную книгу вносить его не нужно.
      InfoASName = 'ИнфоАС';
      InfoASTag = 'Заказ №'; // Эта метка должна стоять в теме для всех заказов. иначе это что-то другое и тогда не юзать.

var
    Result :integer; // предопределенная переменная.
    ID :double; // предопределенная переменная. ID письма.
    Export_dir :string; // каталог экспорта

    CurrUseDateAsSubdir :boolean = UseDateAsSubdir;

var //Message :Variant;
    Message :TMailMessage;


    //AddressBook :Variant;
    i :integer;

    Dir :string;
    List :tstringlist;
    S :string;
    S1 :string;
    S2 :string;
    SenderName :string;

    FarmnetTagPos :integer;
    INFOASTagPos :integer;

    List1 :TSTringLIst;
    fname :string;
begin

  //ID := 910;


  result := 0;
  List := Tstringlist.create;
  Message := TMailMessage.create; // CreateOleObject('MailProcessor.MPMailMessage');
  //if useaddressbookcontrol then AddressBook := CreateOleObject('MailProcessor.AddressBook');
  try


    Message.ID := ID;

    FarmnetTagPos := pos(FarmnetTag,Message.Subject);
    InfoASTagPos :=  pos(INFOASTAG,Message.subject);

    if useFarmnetOrders and ( Message.SenderAddress = FarmnetAddress) and (FarmnetTagPos>0)
    then begin
      SenderName := FarmnetName;
    end
    else if useInfoASOrders and ( Message.SenderAddress = InfoASAddress) and (InfoASTagPos>0)
    then begin
      SenderName := INFOASName;
    end
    else
    if useaddressbookcontrol
    then begin
      SenderName := asstring(DBQueryValue('select name from addressbook where mail = :mail',[Message.SenderAddress]));

      (*
      if not Addressbook.srv.connected
      then begin
        CreateHIntE('ERROR, не подключено, обратитесь в службу техподдержки');
      end;
      AddressBook.Active := true;

      AddressBook.Setkey('MAIL',Message.SenderAddress);
      *)
    end
    else SenderName := '';


    if not useaddressbookcontrol or (SenderName<>'')
    then begin
       if Message.AttachmentCount>0
       then begin

         Dir := Includetrailingpathdelimiter(Export_Dir);

         if SenderName >'' then Dir := Dir + SenderName
         else if Message.SenderName>'' then Dir := Dir + Message.SenderName
         else Dir := Dir + Message.SenderAddress;

         Dir := IncludeTrailingpathdelimiter(Dir);

         if UseFarmnetOrders
            and (Message.SenderAddress = FarmnetAddress)
            and (FarmnetTagPos>0)
         then begin
            s1 := Message.Subject;
            delete(s1,FarmnetTagPos,1000);

            Dir := includetrailingpathdelimiter(dir + trim(correctfilename( S1)));

         end
         else if UseINFOASOrders
                and (Message.SenderAddress = INFOASAddress)
                and (InfoASTagPos>0)
                and (message.AttachmentCount=1)
         then begin
            //createhinti('1');
            fname := gettempdir + Message.Attachmentnames;
            deletefile(fname);

            Message.SaveAttachment(Message.AttachmentNames,gettempdir);
            list.loadfromfile(fname);
            deletefile(fname);
            if list.count>1
            then begin

              s1 := list[0]; //Заказчик : ООО "Пациент" (Филиал: Пациент )
              delete(s1,1,11);

              Dir := includetrailingpathdelimiter(dir + trim(correctfilename( S1)));

            end;
         end;

         if CurrUseDateAsSubDir
         then
           Dir := includetrailingpathdelimiter(Dir + formatdatetime('yyyy-mm-dd',date));

         //showmessage(dir);
         ForceDirectories(Dir);
         //if directoryexists(Dir) then Showmessage(Dir+ ' : Exists') else ShowMessage(Dir+ ' :  not exists');
         //showmessage('1');

         StringtoList(Message.AttachmentNames,List);

         for i := 0 to List.count-1 do begin
           s := list[i];
           if CreateNewFileNameIfExists and fileexists(Dir+S)
           then begin
             S1 := extractfilename(GetUniqueFileName(Dir,S));
           end
           else begin
             s1:= S;
           end;

          // CreateHInt(Dir+S);
           Message.SaveAttachment(S,gettempdir);
           //Showmessage(GetTempDir+S);
           //ShowMessage(Dir+S1);

           if not CreateNewFileNameIfExists and fileexists(Dir+S)
           then begin
             DeleteFile(Dir+S1); //movefile - не затрет сам
           end;

           MoveFile(GetTempDir + S,Dir+S1);

           try
             if (autounpackcommand>'') and (ArchiveTypes >'')
             then begin
               List1 := Tstringlist.create;
               try
                 stringtoList(ansiuppercase(ArchiveTypes),List1,';,');

                 S2 := Ansiuppercase(ExtractFileExt(S1));
                 if pos('.',S2)=1 then delete(s2,1,1);

                 if List1.indexof( S2)>=0
                 then begin
                   //createhinti(format( AutoUnpackCommand,[Dir+S1,Dir]));
                   FileExecuteWait(format( AutoUnpackCommand,[Dir+S1,Dir]), ExecState);
                 end;
               finally
                 List1.free;
               end;
             end;
           except
             CreateHIntE(ExceptMessage,'Ошибка при распаковке файла');
           end
         end;

         CreateHintI('Поступила почта от '+Message.Sender+'. Вложения сохранены в '+dir);
         Message.IsProcessed := true;
       end
       else begin
         CreateHIntW('Письмо от '+Message.SenderName+' не содержит вложений, помечено как "обработанное"');
         Message.IsProcessed := true;
       end;
    end
    else begin
      CreateHintW('Письмо от неизвестного адресата, удаляем');
      Message.delete;
    end;
  finally
    //AddressBook := nil;
    //Message := nil;
    Message.free;
    List.free;
  end;
end.
