2015-07-05 45 views
0

我使用下面的代碼來發送使用Outlook 2010郵件得到正確的返回值,但該行不從Outlook

Result := MailItem.Sent; 

返回一個錯誤

該項目已經被移動或刪除

我該如何解決這個問題,這個函數給了我一個可用的返回值?

function olSendMail(aFrom, aSubject, aBody, aTo, aCC, aBcc: string; aMailFiles: TStringList; aReceipt: boolean = False; aPreview: boolean = True): boolean; 
var 
    Outlook: OleVariant; 
    MailItem: OleVariant; 
    i: integer; 
    MailInspector: variant; 
const 
    olMailItem = $00000000; 
begin 
    try 
    try 
     Outlook := GetActiveOleObject('Outlook.Application'); 
    except 
     Outlook := CreateOleObject('Outlook.Application'); 
    end; 
    MailItem := Outlook.CreateItem(olMailItem); 
    if olAccountValid(aFrom) then 
     MailItem.SendUsingAccount := Outlook.Session.Accounts.Item(aFrom); 
    MailItem.To := aTo; 
    MailItem.Cc := aCc; 
    MailItem.Bcc := aBcc; 
    MailItem.Subject := aSubject; 
    MailItem.Body := aBody; 
    for i := 0 to aMailFiles.Count - 1 do 
     MailItem.Attachments.Add(aMailFiles.Strings[i]); 
    MailItem.ReadReceiptRequested := aReceipt; 
    MailItem.OriginatorDeliveryReportRequested := aReceipt; 

    if aPreview = True then 
     begin 
     MailInspector := MailItem.GetInspector; 
     MailInspector.Display(True); 
     end 
    else 
     MailItem.Send; 
    Result := MailItem.Sent; 
    except 
    on E:Exception do 
     begin 
     Logfile.Error('U_Mailing.Outlook.SendMailOutlook: ' + E.Message); 
     Result := False; 
     end; 
    end; 
end; 

回答

1

調用發送後,只允許操作釋放你參考的MailItem對象 - 它現在屬於後臺處理程序,並將於異步發送,然後移動到發送郵件文件夾。只有在那一刻(現在將是一個不同的消息),Sent屬性將爲true,並且所有與發件人相關的屬性將被填充。

+0

行 - 所以你說的是,這是不可能的,檢查郵件是否發送正確使用這種方法。在'我的世界'中有一點奇怪,因爲MAPI方式可以讓你選擇檢查SUCCESS_SUCCESS - 但它是微軟,所以任何事情都是可能的。 – OZ8HP

+0

這是正確的。在低級別上,調用IMessage :: SubmitMessage可以返回S_OK,但這僅僅意味着消息具有收件人,並且它們都已解析。可能會發生這種情況,網絡電纜被拔出或者您的SMTP密碼不正確。由於該操作是異步的,因此您只能獲得一個NDR。 –