【问题标题】:JCLMAPI Delphi Non-Modal Email popupJCLMAPI Delphi 非模式电子邮件弹出窗口
【发布时间】:2014-08-25 06:44:35
【问题描述】:

我目前在 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 应用程序并填写了所有传递的信息(收件人、主题、正文、附件)。不幸的是,它仍然以模态方式打开消息框。

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

关于如何以非模式方式打开默认 MAPI 客户端有什么想法吗?

谢谢!

【问题讨论】:

  • 请注意,使用 MAPI 发送电子邮件不一定是最佳解决方案。例如,安装 64 位 Outlook 时,32 位应用程序无法使用 MAPI。
  • @Andy MAPISendMail 在任何情况下都应该可以工作,即使是安装了 64 位 Outlook 的 32 位应用程序:msdn.microsoft.com/en-us/library/office/…
  • @AndreiGalatyn 该文章仅适用于 Windows 7,不适用于任何其他 64 位操作系统。
  • @Andy:在我们的 x32 应用程序中,我们使用 MAPI 发送电子邮件。它可以在带有 x64 Outlook 2013 的 Win 8 上运行,没有任何问题(fixmapi.exe 仍然在这里)。 Win7+x64 Office2013的组合有问题,但似乎是MS的错误。文章“在 32 位和 64 位平台上构建 MAPI 应用程序”很笼统,只有一种解释被标记为特定于 Win7(他们不知道如何在未来的版本中实现它)。如果您建议不要使用 MAPI,那么请善待并建议改用什么。
  • @Andy,AndreiGalatyn,感谢您的回复。我确实相信它也会起作用,也就是说,安迪,我也有兴趣听到另一种方法。

标签: delphi email outlook mapi


【解决方案1】:

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

换句话说,这是可能的,但很棘手。我建议您将其保留为模态形式,出于多种原因,它更安全。如果用户“还没有准备好发送邮件”,那么他将不会激活该功能(或取消它以返回程序)。

【讨论】:

  • 谢谢,我会记住这一点的。您确实提出了一个很好的观点,这似乎是很多工作。在我开始编写代码之前,您是否看到过为 Delphi 编写的类似内容?我真的很喜欢 JCL,因为一切都包装得很好。
  • 我决定只允许发送对话框以模态方式出现,正如你所建议的那样。问题是当我在 Windows 8 上运行它时,我得到一个一般的 MAPI 错误 (2),IFF Outlook 已经打开。如果 Outlook 已关闭,则会出现发送对话框,一切都会正常工作。这种奇怪的行为只发生在 Win8 中。有什么建议吗?
  • 这里的一些更正: 1. 对于 Windows 8+,您可以直接使用 MAPISendMailW。只有 Win7 和更早版本才需要 MAPISendMailHelper。 2. SDK自然只需要编译。不需要使用这些功能。 3.根据this,支持MAPI_DIALOG_MODELESS的Outlook第一个版本是2013年。
猜你喜欢
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 2014-08-11
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
相关资源
最近更新 更多