Нужно достать из аутлука в текстовый файл некоторые данные, а именно: кому,от кого, время отправления, первая строка письма
Т.е программа должна это делать. Как из него вытащить информацию?
procedure TForm1.Button1Click(Sender: TObject);Получает информацию обо всех входящих письмах, включая и текст письма. На форме - TMemo + TButton + TOutlookApplication (вкладка Servers), проверено в D2007 + WinXP + Office XP
var
ns:_NameSpace;
fld:MAPIFolder;
im:Variant;
i:Integer;
begin
OutlookApplication1.Connect;
ns := OutlookApplication1.GetNamespace('MAPI');
ns.Logon(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
fld:=ns.GetDefaultFolder(olFolderInbox);
for i:=1 to fld.Items.Count do
begin
im := fld.Items.Item(i);
Memo1.Lines.Add(Format('Письмо №%d', [i]));
Memo1.Lines.Add('Отправитель: ' + im.SenderName);
Memo1.Lines.Add('Кому: ' + im.To);
Memo1.Lines.Add('Текст письма: ' + im.Body);
end;
ns.Logoff;
OutlookApplication1.Disconnect;
OutlookApplication1.Quit;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ns:_NameSpace;
fld:MAPIFolder;
im:Variant;
i:Integer;
f:textfile;
begin
assignfile(f,'output.txt');
rewrite(f);
OutlookApplication1.Connect;
ns := OutlookApplication1.GetNamespace('MAPI');
ns.Logon(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
fld:=ns.GetDefaultFolder(olFolderInbox);
for i:=1 to fld.Items.Count do
begin
im := fld.Items.Item(i);
writeln(f,Format('Письмо №%d', [i]));
writeln(f,'Отправитель: ' + im.SenderName);
writeln(f,'Кому: ' + im.To);
writeln(f,'Первая строка письма: ' + copy(im.Body,1,pos(#13,im.body));
closefile(f);
end;
ns.Logoff;
OutlookApplication1.Disconnect;
OutlookApplication1.Quit;
end;
try, но если тебе надо еще и реальный e-mail, с которого выслано сообщение, то тут будет "биг бада бум", этого ты через Automation Object не получишь, надо будет заморачиваться с интерфейсами. Это только сегодня поздно вечером или завтра, раньше у меня не получится...
OutlookApp := GetActiveOleObject('Outlook.Application');
except
ShowMessage('Нет запущенной копии MS Outlook'); Exit;
end;
for iCount := 1 to OutLookApp.ActiveExplorer.Selection.Count do
begin
//
mailItem := OutLookApp.ActiveExplorer.Selection.Item[iCount];
s := Format('От %s : "%s", Время отсылки:',
[mailItem.SenderName, mailItem.Body, mailItem.SentOn]);
ShowMessage(s);
end;
procedure TForm1.OutlookClick(Sender: TObject);В файл запишешь уже сам, наверное...
var
i: Integer;
myOutlookApp: TOutlookApplication;
mailItem, objReply: OutlookXP.MailItem;
objRecips: OutlookXP.Recipients;
iCount: Integer;
s, s_addr, firstLine: string;
sL: TStringList;
begin
// пытаемся подключиться к существующей копии Outlook-а
// Если не получится - сообщим, что Outlook не запущен, и все...
myOutlookApp := TOutlookApplication.Create(nil);
myOutlookApp.ConnectKind := ckRunningInstance;
try
myOutlookApp.Connect;
except
ShowMessage('Нет запущенной копии MS Outlook');
myOutlookApp.Free; Exit;
end;
// Хм... Все-таки, запущен. Проходим по всем выбранным письмам
// (их может быть больше одного), и собираем необходимые данные.
// Для того, чтобы получить адрес - пойдем на хитрость: создадим
// письмо - ответ (Reply), Outlook в список получателей занесет того,
// от кого письмо пришло, считаем это значение, и... не будем ничего
// отправлять...
for iCount := 1 to myOutlookApp.ActiveExplorer.Selection.Count do
begin
mailItem := myOutlookApp.ActiveExplorer.Selection.Item(iCount) as _MailItem;
objReply := mailItem.Reply;
objRecips := objReply.Recipients;
s_addr := '';
for i := 1 to objRecips.Count do
begin
s_addr := s_addr + objRecips.Item(i).Address;
end;
// Конечно, выделить первую строку из mailItem.Body можно и по-другому,
// но мы ж не ищем легких путей...
sL := TStringList.Create;
try
sL.DelimitedText := StringReplace(mailItem.Body, ' ', '&prob;', [rfReplaceAll]);
firstLine := StringReplace(sL.Strings[0], '&prob;', ' ', [rfReplaceAll]);
finally
sL.Free;
end;
s := Format('From/To %s <%s> : "%s", sent: %s',
[mailItem.SenderName, s_addr, firstLine, DateToStr(mailItem.SentOn)]);
ShowMessage(s);
end;
// Все, закончили. Чтоб не было утечки памяти, отключаемся и удаляем объект
// (не волнуйся, та копия MS Outlook, что была запущена, продолжает работать)
myOutlookApp.Disconnect;
myOutlookApp.Free;
end;
s_addr := '';
for i := 1 to mailItem.Recipients.Count do
begin
s_addr := s_addr + mailItem.Recipients.Item(i).Address;
end;
var currFolderName: String;
...
currFolderName := myOutlookApp.ActiveExplorer.CurrentFolder.Name;
if currFolderName = 'Inbox' then // Вот тут может быть другое значение, если русскоязычная версия
begin
objReply := mailItem.Reply;
objRecips := objReply.Recipients;
s_addr := '';
for i := 1 to objRecips.Count do
begin
s_addr := s_addr + objRecips.Item(i).Address;
end;
end
else
begin
s_addr := '';
for i := 1 to mailItem.Recipients.Count do
begin
s_addr := s_addr + mailItem.Recipients.Item(i).Address;
end;
end;
procedure TForm1.OutlookClick(Sender: TObject);Больше править не буду, в конце концов, совесть-то имей! Задание было чье вообще? Ты хоть MSDN на странице Outlook Objects соизволил открыть, или это мне надо больше, чем тебе? Уверяю, МНЕ оно на фиг не надо, я как с MSO не работал, так и не буду. Надо будет что-нибудь исправить - MSDN в зубы и вперед, грызть гранит науки. Я потерял к твоим вопросам интерес.
var
i: Integer;
myOutlookApp: TOutlookApplication;
mailItem, objReply: OutlookXP.MailItem;
objRecips: OutlookXP.Recipients;
iCount: Integer;
s, s_addr, firstLine: string;
sL: TStringList;
FromTo, currFolderName: string;
begin
myOutlookApp := TOutlookApplication.Create(nil);
myOutlookApp.ConnectKind := ckRunningInstance;
try
myOutlookApp.Connect;
except
ShowMessage('Нет запущенной копии MS Outlook');
myOutlookApp.Free; Exit;
end;
for iCount := 1 to myOutlookApp.ActiveExplorer.Selection.Count do
begin
mailItem := myOutlookApp.ActiveExplorer.Selection.Item(iCount) as _MailItem;
currFolderName := myOutlookApp.ActiveExplorer.CurrentFolder.Name;
s_addr := '';
if currFolderName = 'Inbox' then
begin
FromTo := 'From';
objReply := mailItem.Reply;
objRecips := objReply.Recipients;
for i := 1 to objRecips.Count do
with objRecips.Item(i) do
begin
s_addr := s_addr + Format('%s <%s> ', [Name, Address]);
end;
end
else
begin
FromTo := 'To';
for i := 1 to mailItem.Recipients.Count do
with mailItem.Recipients.Item(i) do
begin
s_addr := s_addr + Format('%s <%s> ', [Name, Address]);
end;
end;
sL := TStringList.Create;
try
sL.DelimitedText := StringReplace(mailItem.Body, ' ', '&prob;', [rfReplaceAll]);
firstLine := StringReplace(sL.Strings[0], '&prob;', ' ', [rfReplaceAll]);
finally
sL.Free;
end;
s := Format('%s %s : "%s", sent: %s',
[FromTo, s_addr, firstLine, DateToStr(mailItem.SentOn)]);
ShowMessage(s);
end;
myOutlookApp.Disconnect;
myOutlookApp.Free;
end;