JCLMAPI Delphi非模态电子邮件弹出

问题描述:

我目前在XP上使用Delphi 7,但我想最终将代码迁移到Win8上的DXE。JCLMAPI Delphi非模态电子邮件弹出

我想发送电子邮件使用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应用程序中工作。直到他们准备好发送,例如,如果用户想要在发送电子邮件之前继续在德尔福应用程序中工作。这可能吗?

我注意到有在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客户端的任何想法?

谢谢!

+0

请注意,使用MAPI发送电子邮件不一定是最佳解决方案。例如,当安装64位Outlook时,32位应用程序无法使用MAPI。 –

+0

@Andy MAPISendMail应该可以在任何情况下工作,即使是安装了64位Outlook的32位应用程序:http://msdn.microsoft.com/en-us/library/office/dd941355(v=office.15).aspx –

+0

@AndreiGalatyn该文章仅适用于Windows 7,不适用于任何其他64位操作系统。 –

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

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

+0

谢谢,我会牢记这一点。你确实提出了一个很好的观点,这似乎是很多工作。在我潜入并开始编写代码之前,您是否看过类似为Delphi编写的代码?我非常喜欢JCL,因为一切都很好包装。 – sse

+0

我决定只是允许发送对话框模式,如你所建议的。麻烦的是当我在Windows 8上运行它时,我得到一个通用的MAPI错误(2),IFF Outlook已经打开。如果Outlook关闭,那么发送对话框将会出现,一切都会正常工作。这种奇怪的行为只发生在Win8中。有什么建议么? – sse

+0

这里的一些更正: 1.对于Windows 8 +,可以直接使用MAPISendMailW。 MAPISendMailHelper仅适用于Win7及更早版本。 2. SDK只是编译时必需的,当然。不需要使用这些功能。 3.根据[this](http://peach.ease.lsoft.com/scripts/wa-PEACH.exe?A2=MAPI-L;d2bf3060.1604),支持MAPI_DIALOG_MODELESS的第一个Outlook版本是2013 。 –