2014-07-04 8 views
1

我目前在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位操作系統。 –

回答

3

您可以使用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 。 –