JCLMAPI Delphi非模态电子邮件弹出窗口

时间:2014-07-04 01:46:26

标签: delphi email outlook mapi

我目前在XP上使用Delphi 7,但我想最终将代码迁移到Win8上的DXE。

我正在尝试使用JCL发送电子邮件,使用JCLMAPI是特定的。我尝试使用JCLMAPI单元中的JclSimpleSendMail例程。这是电话的接口。

function JclSimpleSendMail(const Recipient, Name, Subject, Body: AnsiString;   const Attachment: TFileName; ShowDialog: Boolean; ParentWND: THandle;   const ProfileName: AnsiString; const Password: AnsiString): Boolean;

问题是它以模态方式弹出默认的MAPI客户端消息框(在我的案例中是Outlook 2010)。我希望它只是打开电子邮件消息窗口,但允许用户继续在Delphi应用程序中工作。直到他们准备好发送,例如,如果用户想要在发送电子邮件之前继续在Delphi应用程序中工作。这可能吗?

我注意到TJCLEmail中有一个ParentHWND属性,我尝试将其设置为零(我知道这是一个范围),但我希望删除父句柄可能会改变模态行为(没有运气!)

function TForm1.SimpleSendHelper2(const ARecipient, AName, ASubject, ABody: AnsiString; const AAttachment: TFileName;
  AShowDialog: Boolean; AParentWND: THandle; const AProfileName, APassword, AAddressType: AnsiString): Boolean;
var
  AJclEmail: TJclEmail;
begin
  AJclEmail := TJclEmail.Create;
  try
    **AJCLEmail.ParentWnd := 0;  //TRIED FORCING THE ATTACHED HANDLE TO ZERO**
    *//if AParentWND <> 0 then  
    //      AJclEmail.ParentWnd := AParentWND;*
    if ARecipient <> '' then
      AJclEmail.Recipients.Add(ARecipient, AName, rkTO, AAddressType);
    AJclEmail.Subject := ASubject;
    AJclEmail.Body := ABody;
    if AAttachment <> '' then
      AJclEmail.Attachments.Add(AnsiString(AAttachment));
    if AProfileName <> '' then
      AJclEmail.LogOn(AProfileName, APassword);
    Result := AJclEmail.Send(AShowDialog);
  finally
    AJclEmail.Free;
  end;
end;

这也成功打开了默认MAPI应用程序并填写了所有传递的信息(TO,Subject,Body,Attachment)。不幸的是,它仍然以模态方式打开消息框。

最后,我还尝试了http://www.delphifaq.com/faq/delphi/network/f236.shtml处的代码。此代码只是直接使用MAPI(没有JCL)。不幸的是,它还会以模态方式弹出消息框。

关于如何以非模态方式打开默认MAPI客户端的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以使用分配了MAPI_DIALOG_MODELESS标志的Windows API函数MAPISendMailW。 但是,您必须为Win8及更高版本使用MAPISendMailHelper函数,对Windows 7及更早版本使用MAPISendMailW。对于Windows 7,此类功能仅适用于某些(最新)版本的Office,并且仅安装了W indows SDK for Windows 8(根据MSDN)。如果使用了另一个电子邮件客户端(不是MS Outlook),则无法保证其正常运行。

换句话说,它是可能的,但它很棘手。我建议你把它保存在模态形式中,由于很多原因它更安全。如果用户“还没准备好发送电子邮件”,那么他就不会激活这样的功能(或取消它以返回程序)。