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:= 'someone@gmail.com';
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;
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.