2016-05-10 16 views
4

我們的應用程序中有以下功能,可在Outlook中打開新郵件,以便用戶可以通過Outlook發送電子郵件。Outlook切換到office後無法使用新郵件

program SO_37131815; 
{$APPTYPE CONSOLE} 

uses 
    Classes, ActiveX, ComObj, Variants, SysUtils; 

procedure OutlookMail(ToAddress, Subject: string); 
var 
    OutlookProgram: OLEVariant; 
    MailItem: Variant; 
begin 
    try 
    OutlookProgram := GetActiveOleObject('Outlook.Application'); 
    except 
    OutlookProgram := CreateOleObject('Outlook.Application'); 
    end; 

    MailItem := OutlookProgram.CreateItem(0); 

    if ToAddress = '' then begin 
    ToAddress := ' '; 
    end; 
    MailItem.Recipients.Add(ToAddress); 
    MailItem.Subject := Subject; 

    try 
    MailItem.Display(False); //.Display(Modal) 
    except 
    //don't worry... 
    end; 

    OutlookProgram := Unassigned; 
end; 

begin 
    CoInitialize(nil); 
    OutlookMail('', 'blah'); 
end. 

it's all greek to me

這工作得很好了多年......因爲前兩天當客戶端切換到Office365。 當從Outlook創建新消息時它工作正常,當它從我們的應用程序創建時,它不能發送消息。

在Outlook 2010中,錯誤消息是: 「無法完成操作,一個或多個參數值無效。」

在展望2016年的錯誤消息是: 「對不起,出了問題你可能想再試一次。」outlook 2016 error

我也注意到,當我們的應用程序創建新消息時,它不能保存到草稿,並且會引發相同的錯誤。

該過程打開新的消息窗口,但是當按下發送郵件時,Outlook無法發送它。 我能做些什麼來解決這個問題?我需要在Display被調用之前設置一些屬性嗎?

更新:感謝David的堅持,我縮小了範圍。 ToAddress參數爲空(或空格)時,Outlook會產生錯誤。 因此,添加下面的代碼似乎解決了這個問題。

if Trim(ToAddress) <> '' then begin 
    MailItem.Recipients.Add(ToAddress); 
end; 

有沒有人有更好的主意?

+0

你能生產出[MCVE] –

+1

任何與Outlook(設置與office365工作)可以複製粘貼到按鈕的程序並調用它。我不明白還有什麼要做。 – georstef

+0

如果我們有一個完整的程序,這將是較少的工作。我們必須確保我們指定了必要的使用條款。我們可以粘貼一個完整的控制檯應用程序對我們來說會少一些工作,並且我們確信我們正在運行與您相同的代碼。想必你自己有Office 365?你有沒有做過任何調試?哪一行代碼導致錯誤? –

回答

4

ToAddress參數爲空時,不應將空格(或空字符串)參數傳遞給MailItem.Recipients.Add方法。

因此,解決辦法是避免以上:

if Trim(ToAddress) <> '' then 
    MailItem.Recipients.Add(ToAddress); 
相關問題