我的程序通过GMail向联系人发送电子邮件。通常情况下这很有效,但我们注意到有时我的程序“认为”它发送的电子邮件实际上并没有到达Gmail,更不用说到达联系人了。我想我可以在程序中添加一个检查,该检查可以访问Gmail“已发送邮件”文件夹,以查看是否确实已发送过每封电子邮件。
我有一些使用TIdPOP3组件的代码,但这会从收件箱中下载标头,而不是从已发送的项目中下载。我的问题是,如何访问已发送项目文件夹中的标题?
以下是我正在使用的代码。它只是测试代码,因此没有任何try / finally块等。
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;
答案 0 :(得分:3)
要获取与已发送邮件相关的信息,您可以使用Gmail imap_extensions
和TIdIMAP4
组件。
试试这个样本
{$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.