title: How to download a message, store it and recreate it in a different folder?
body: <p>I'm using Delphi 2006, Indy 10 (ver. 4957), IMAP4. </p>
  
  <p>I would like to download an e-mail message, store it and some weeks later I would like to recreate it in a different folder. (It is sort of archiving and restoring it, so simple moving between folders does not work as I will delete the original message.) I download the message, store it, then make a copy of it with <code>AppendMsg</code>. </p>
  
  <p>It works until that point when I check the target Temp2 folder, where most of the messages contain </p>
  
  <blockquote>
    <p>This is a multi-part message in MIME format</p>
  </blockquote>
  
  <pre><code>unit Mail_Test;
  
  interface
  
  uses
    Windows,
    Messages,
    SysUtils,
    Variants,
    Classes,
    Graphics,
    Controls,
    Forms,
    Dialogs,
    StdCtrls;
  
  type
    TForm1 = class( TForm )
      memLog: TMemo;
      btn1: TButton;
      procedure btn1Click( Sender: TObject );
    private
      procedure Log( LogMsg: string );
      { Private declarations }
    public
      { Public declarations }
    end;
  
  var
    Form1: TForm1;
  
  implementation
  
  uses
    IdIMAP4,
    IdMessage,
    IdExplicitTLSClientServerBase,
    IdSSLOpenSSL;
  
  {$R *.dfm}
  
  procedure TForm1.btn1Click( Sender: TObject );
  var
    IMAPClient: TIdIMAP4;
    UsersFolders: TStringList;
    OpenSSLHandler: TIdSSLIOHandlerSocketOpenSSL;
    res: Boolean;
    i: integer;
    inbox, currUID: string;
    cntMsg: integer;
    msg, msg2: TIdMessage;
    BodyTexts: TStringList;
    flags: TIdMessageFlagsSet;
    fileName_MailSource, TmpFolder: string;
  begin
  
    IMAPClient := TIdIMAP4.Create( nil );
    try
      OpenSSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create( nil );
      try
        IMAPClient.Host := 'imap.gmail.com';
        IMAPClient.Port := 993;
        IMAPClient.Username := '....@gmail.com';
        IMAPClient.Password := '....';
  
        if Pos( 'gmail.com', IMAPClient.Host ) &gt; 0 then begin
          OpenSSLHandler.SSLOptions.Method := sslvSSLv3;
          IMAPClient.IOHandler := OpenSSLHandler;
          IMAPClient.UseTLS := utUseImplicitTLS;
        end;
  
        try
          res := IMAPClient.Connect;
          if not res then begin
            Log( '  Unsuccessful connection.' );
            exit;
          end;
  
        except
          on e: Exception do begin
            Log( '   Unsuccessful connection.' );
            Log( '  (' + Trim( e.Message ) + ')' );
            exit;
          end;
        end;
  
        try
          UsersFolders := TStringList.Create;
          try
            res := IMAPClient.ListMailBoxes( UsersFolders );
            if not res then begin
              Log( '  ListMailBoxes error.' );
              exit
            end;
          except
            on e: Exception do begin
              Log( '  ListMailBoxes error.' );
              Log( '  (' + Trim( e.Message ) + ')' );
              exit;
            end;
  
          end;
  
          Log( 'User folders: ' + IntToStr( UsersFolders.Count ) );
          for i := 0 to UsersFolders.Count - 1 do begin
            Log( '  [' + inttostr( i + 1 ) + '/' + inttostr( UsersFolders.Count ) + '] Folder: "' + UsersFolders[ i ] + '"' );
          end;
  
          IMAPClient.RetrieveOnSelect := rsDisabled;
          inbox := 'INBOX';
          Log( 'Opening folder "' + inbox + '"...' );
          res := IMAPClient.SelectMailBox( inbox );
          cntMsg := IMAPClient.MailBox.TotalMsgs;
          Log( 'E-mails to read: ' + IntToStr( cntMsg ) );
  
      //    res := IMAPClient.RetrieveAllEnvelopes( AMsgList );
  
          msg := TIdMessage.Create( nil );
          msg2 := TIdMessage.Create( nil );
          BodyTexts := TStringList.Create;
          TmpFolder := 'c:\';
          res := IMAPClient.CreateMailBox( 'Temp2' )
          try
  
            for I := 0 to cntMsg - 1 do begin
  
              Log( '  [' + inttostr( i + 1 ) + '/' + inttostr( cntMsg ) + '] E-mail...' );
  
              IMAPClient.GetUID( i + 1, currUID );
  
              Log( '(Downloading message...)' );
              IMAPClient.UIDRetrieve( currUID, msg );
  
              fileName_MailSource := TmpFolder + 'Log_Mail_' + currUID + '.eml';
              msg.SaveToFile( fileName_MailSource, false );
  
              // In the final version I will delete the original message 
              // so I have to recreate it from the archived file
  
              msg2.LoadFromFile( fileName_MailSource );
  
              res := IMAPClient.AppendMsg( 'Temp2', msg2, msg2.Headers, [] );
            end;
          finally
            FreeAndNil( msg );
            FreeAndNil( msg2 );
            FreeAndNil( BodyTexts )
          end;
  
        finally
          IMAPClient.Disconnect;
        end;
      finally
        OpenSSLHandler.Free;
      end;
    finally
      IMAPClient.Free;
    end;
  end;
  
  procedure TForm1.Log( LogMsg: string );
  begin
    memLog.Lines.Add( LogMsg );
    Application.ProcessMessages;
  end;
  
  end.
  </code></pre>