Outlook对象模型 - 检测是否已发送电子邮件 [英] Outlook Object Model - Detecting if email has been sent
问题描述
我在我的测试中有以下代码Delphi 2006 BDS应用程序:
I have the following code in my test Delphi 2006 BDS application:
procedure TForm1.Button1Click(Sender: TObject);
const
olMailItem = 0;
var
Outlook: OleVariant;
vMailItem: variant;
begin
Outlook := CreateOleObject('Outlook.Application');
vMailItem := Outlook.CreateItem(olMailItem);
try
vMailItem.Recipients.add('anemailaddress@gmail.com');
vMailItem.Display(True); -- outlook mail message is displayed modally
except
end;
VarClear(Outlook);
end;
我需要能够检测用户是否从outlook屏幕中发送电子邮件。我尝试下面的代码:
I need to be able to detect whether the user sent the email from within the outlook screen. I tried the following code:
if vMailItem.Sent then
...
但收到错误消息项已移动或删除。我假设这是因为邮件项目已移动到已发送的项目文件夹。检测用户是否发送电子邮件的最佳方法是什么?此外,如果用户发送了电子邮件,那么我还需要能够查看电子邮件正文。
But received the error message 'The item has been moved or deleted'. I presume this is because the mail item has moved to the sent items folder. What is the best way to detect if the user sent the email? Also, if the user did send the email then I would also need to be able to view the email body.
提前感谢。
推荐答案
您似乎必须使用 发送事件
。这将是一个很容易,如果你使用早期绑定,把一个'outlook [*]。pas'文件在RAD工作室的'.. \OCX\Servers'文件夹中的'uses'子句,然后:
It would seem you have to use the Send Event
of the mail item. This would be a lot easier if you were using early binding, put one of the 'outlook[*].pas' files in the '..\OCX\Servers' folder of RAD studio in the 'uses' clause, then:
uses
..., outlook2000;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
OutlookApplication: TOutlookApplication;
procedure OnMailSend(Sender: TObject; var Cancel: WordBool);
public
end;
[...]
procedure TForm1.FormCreate(Sender: TObject);
begin
OutlookApplication := TOutlookApplication.Create(Self);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MailItem: _MailItem;
Mail: TMailItem;
begin
MailItem := OutlookApplication.CreateItem(olMailItem) as _MailItem;
Mail := TMailItem.Create(nil);
try
Mail.ConnectTo(MailItem);
Mail.OnSend := OnMailSend;
MailItem.Recipients.Add('username@example.com');
MailItem.Display(True);
finally
Mail.Free;
end;
end;
procedure TForm1.OnMailSend(Sender: TObject; var Cancel: WordBool);
begin
ShowMessage((Sender as TMailItem).Body);
end;
使用后期绑定,您必须导入的包装器所做的工作。最简单的例子可能是这样的:
With late binding, you'd have to do some of the work which the imported wrapper does. The simplest example could be something like this:
type
TForm1 = class(TForm, IDispatch)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FCookie: Integer;
FMailItem: OleVariant;
procedure MailSent;
protected
function QueryInterface(const IID: TGUID; out Obj): HResult; override;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
stdcall;
public
end;
[...]
uses
comobj;
const
DIID_ItemEvents: TGUID = '{0006303A-0000-0000-C000-000000000046}';
SendItemDispID = 61445;
function TForm1.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if IsEqualIID(IID, DIID_ItemEvents) and GetInterface(IDispatch, Obj) then
Result := S_OK
else
Result := inherited QueryInterface(IID, Obj);
end;
function TForm1.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
begin
Result := S_OK;
if DispID = SendItemDispID then
MailSent;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
olMailItem = 0;
var
Outlook: OleVariant;
CPContainer: IConnectionPointContainer;
ConnectionPoint: IConnectionPoint;
begin
Outlook := CreateOleObject('Outlook.Application');
FMailItem := Outlook.CreateItem(olMailItem);
FMailItem.Recipients.add('username@example.com');
if Supports(FMailItem, IConnectionPointContainer, CPContainer) then begin
CPContainer.FindConnectionPoint(DIID_ItemEvents, ConnectionPoint);
if Assigned(ConnectionPoint) then
ConnectionPoint.Advise(Self, FCookie);
CPContainer := nil;
end;
FMailItem.Display(True);
if Assigned(ConnectionPoint) then begin
ConnectionPoint.Unadvise(FCookie);
ConnectionPoint := nil;
end;
VarClear(FMailItem);
VarClear(Outlook);
end;
procedure TForm1.MailSent;
begin
ShowMessage(FMailItem.Body);
end;
这篇关于Outlook对象模型 - 检测是否已发送电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!