Search code examples
delphigmailindy

Get email headers from GMail's "Sent items" folder


My program sends emails to contacts via GMail. Normally this works very well but we have noticed that sometimes an email which my program "thinks" it has sent doesn't actually arrive at Gmail, let alone arrive at the contacts. I thought that I might be able to add to the program a check which accesses the Gmail "sent items" folder to see whether each email has indeed been sent.

I have some code using the TIdPOP3 component but this downloads headers from the Inbox, not from sent items. My question is, how can I access the headers in the sent items folder?

Following is the code that I am using. It's only test code so there aren't any try/finally blocks, etc.

 with pop do
  begin
   host:= 'pop.gmail.com';
   username:= '[email protected]';
   password:= .....;
   Port:= 995;
   Connect;
   if connected then 
    with i:= checkmessages downto 1 do
     begin
      msg.clear;   // msg is of type TIdMessage
      if retrieve (i, msg)
       then listbox1.items.add (msg.subject)
     end;
   disconnect
  end;

Solution

  • To get the info related to the Sent Items you can use the Gmail imap_extensions and the TIdIMAP4 component.

    Try this sample

    {$APPTYPE CONSOLE}
    
    
    uses
      Classes,
      SysUtils,
      IdIMAP4,
      IdSSLOpenSSL,
      IdMessageCollection,
      IdExplicitTLSClientServerBase;
    
    procedure GetSentItems;
    var
      LIdIMAP4: TIdIMAP4;
      LIdSSLIOHandlerSocketOpenSSL : TIdSSLIOHandlerSocketOpenSSL;
      AMailBoxList: TStrings;
      AMsgList: TIdMessageCollection;
      i: integer;
    begin
      LIdIMAP4 := TIdIMAP4.Create(nil);
      try
        LIdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
        try
          LIdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv3;
          LIdIMAP4.IOHandler := LIdSSLIOHandlerSocketOpenSSL;
          LIdIMAP4.Host := 'imap.gmail.com';
          LIdIMAP4.Port := 993;
          LIdIMAP4.UseTLS := utUseImplicitTLS;
          LIdIMAP4.Username := 'user';
          LIdIMAP4.Password := 'password';
          LIdIMAP4.Connect;
          try
            //list the mail boxes 
            AMailBoxList:=TStringList.Create;
            try
            if LIdIMAP4.ListSubscribedMailBoxes(AMailBoxList) then
             Writeln(AMailBoxList.Text);
            finally
              AMailBoxList.Free;
            end;
    
            AMsgList:=TIdMessageCollection.Create(TIdMessageItem);
            try
            if LIdIMAP4.SelectMailBox('[Gmail]/Enviados') then //This folder name is localizated in english use [Gmail]/Sent Mail
              if LIdIMAP4.MailBox.TotalMsgs>0 then
                if LIdIMAP4.UIDRetrieveAllEnvelopes(AMsgList) then
                 for i := 0 to AMsgList.Count-1 do
                 begin
                   //do your work here
                   Writeln(AMsgList[i].Subject); //list the subject of the sent items
                 end;
            finally
              AMsgList.Free;
            end;
          finally
            LIdIMAP4.Disconnect;
          end;
        finally
          LIdSSLIOHandlerSocketOpenSSL.Free;
        end;
      finally
        LIdIMAP4.Free;
      end;
    end;
    
    
    
    begin
      try
       GetSentItems;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
      readln;
    end.