program EMLExtract;

{$APPTYPE CONSOLE}

//===============================================================
//
//   Программа для получения и извлечения вложений из писем
//   Используются:
//    1. Компонент TSakMsg из библиотеки SakMail.
//             Сайт мертв, взять на http://www.torry.net
//    2. Компонент TPop3Send из библиотеки Synapse
//             http://www.ararat.cz/synapse/
//
//---------------------------------------------------------------
//
//        Copyrigth (c) 2010 Андрей Кручинин
//            http://www.akruchinin.ru
//
//===============================================================

uses
  POP3Send,
  Classes,
  SakMsg,
  SysUtils;

var
  POP3 : TPOP3Send;
  Msg : TSakMsg;
  i, j, k, ext_count, del_count : integer;
  MailList : TStringList;
  POPServer : string;
  POPUser : string;
  POPPass : string;
  FromEML : string;
  ExtFile : string;
  ExtractTo : string;

begin
  if ParamCount<>6 then
   begin
     writeln('EMLExtract.exe <POP Server> <POP User> <POP Password> <From EMail Address> <Extension File> <Extract To>');
     writeln('   Please wait 5 seconds');
     sleep(5000);
     exit;
   end;

  POPServer:=PAramStr(1);
  POPUser:=ParamStr(2);
  POPPass:=ParamStr(3);
  FromEML:=ParamStr(4);
  ExtFile:=ParamStr(5);
  ExtractTo:=ParamStr(6);

  POP3:=TPop3Send.Create;
  Msg:=TSakMsg.Create(nil);

  if not DirectoryExists(ExtractTo) then
   begin
     WriteLn('Directory ' + ExtractTo + ' not exist');
     exit;
   end;

  Pop3.UserName:=POPUser;
  Pop3.Password:=POPPass;
  Pop3.TargetHost:=POPServer;
  if Pop3.Login then
   try
     if Pop3.List(0) then
      begin
        del_count:=0;
        MailList:=TStringList.Create;
        MailList.Text:=POP3.FullResult.Text;
        WriteLn('In box ' + IntToStr(MailList.Count) + ' message(s).');
        for I := 1 to MailList.Count do
         //Сначала получим только заголовок чтобы проверить адрес отправителя
         if POP3.Top(i, 0) then
          begin
            Msg.Free;
            Msg:=TSakMsg.Create(nil);
            Msg.RawMail.Text:=POP3.FullResult.Text;
            Msg.ParseMsg;

            ext_count:=0;
            if pos(FromEML, Msg.From)>0 then
             begin
               //Типа адрес совпал - получим все письмо
               if POP3.Retr(i) then
                begin
                 Msg.Free;
                 Msg:=TSakMsg.Create(nil);
                 Msg.RawMail.Text:=POP3.FullResult.Text;
                 Msg.ParseMsg;

                 //Пройдемся по списку вложений и поизем нужное нам расширение
                 for j := 0 to Msg.AttachedFiles.Count - 1 do
                   //Если расширение найдено - извлечем в папку
                   if AnsiUpperCase(ExtractFileExt(Msg.AttachedFiles.Items[j].FileName))=AnsiUpperCase(ExtFile) then
                    begin
                      Msg.AttachedFiles.Items[j].SaveToFile(
                         IncludeTrailingPathDelimiter(ExtractTo) + Msg.AttachedFiles.Items[j].FileName);
                      inc(ext_count);
                    end;
                end;
             end;

            //Если письмо было обработано - его надо удалить. 
            if ext_count>0 then
             begin
              POP3.Dele(i);
              inc(del_count);
             end;

          end;
      end;
   finally
     POP3.Logout;
     WriteLn('Deleted ' + IntToStr(del_count) + ' message(s)');
   end
  else
    Writeln('Not loginet to ' + POPServer);

  sleep(5000);
end.
