【发布时间】: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,感谢您的回复。我确实相信它也会起作用,也就是说,安迪,我也有兴趣听到另一种方法。