2014-06-30 52 views
2

我有一個可以通過COM訪問Outlook併發送,保存或顯示在此應用程序內創建的電子郵件的工作應用程序。Outlook使用用戶設置通過COM發送郵件

我想要的是Outlook中帳戶的所有設置也會應用於我的郵件,因此這意味着哪種郵件類型(文本,html或豐富),自定義字體,簽名等等。

這裏SSCCE(該代碼剩下的只是一些記錄和表格只包含最neccessary控制):

... 
strict private 
    FOutlook: _Application; 
... 

procedure TMainForm.ShowMailDlg(aModal: Boolean); 
var 
    mail: _MailItem; 
begin 
    Connect(); 
    mail := FOutlook.CreateItem(olMailItem) as _MailItem; 
    mail.Recipients.Add(Trim(EdTo.Text)); 
    mail.CC := Trim(EdCc.Text); 
    mail.Subject := Trim(EdSubject.Text); 
    mail.Body := EmailText.Lines.Text; 
    mail.SendUsingAccount := GetAccountForEmailAddress(Trim(EdFrom.Text)); 
    //mail.Attachments.Add('Path1', olByValue, 1, 'Caption1'); 
    //mail.Attachments.Add('Path2', olByValue, 2, 'Caption2'); 
    mail.Display(aModal); 
end; 

procedure TMainForm.Connect; 
begin 
    FOutlook := CreateOleObject('Outlook.Application') as _Application; 
end; 

function TMainForm.GetAccountForEmailAddress(const aSmtp: string): _Account; 
var 
    accounts: _Accounts; 
    account: _Account; 
    i: Integer; 
begin 
    accounts := FOutlook.Session.Accounts; 
    for i := 1 to accounts.Count do begin 
    account := accounts.Item(i); 
    if LowerCase(account.SmtpAddress) = LowerCase(aSmtp) then begin 
     Result := account; 
     Exit; 
    end; 
    end; 
    raise Exception.Create('No Account with SMTP address ' + aSmtp + ' found!'); 
end; 

我怎樣才能獲得的MailItem使用所有格式選項從選擇的帳戶?

回答

0

我現在找到了解決方案。我會以錯誤的方式設置身體,這就是爲什麼它不起作用。

procedure CreateMail(aMailInfo.TMailInfo) 
var 
    ... 
    insp: _Inspector; 
    editor: OleVariant; 
begin 
    FMailItem := FOutlook.CreateItem(olMailItem) as _MailItem; 
    ... 
    insp := FMailItem.GetInspector; 
    if (insp.EditorType = olEditorWord) then begin 
    editor := insp.WordEditor; 
    editor.Characters.item(1).InsertBefore(mailText); 
    end else begin 
    if FMailItem.BodyFormat = olFormatHTML then begin 
     regex := TRegEx.Create(cReplaceNewline); 
     FMailItem.HTMLBody := regex.Replace(mailText, '<br />'); 
    end else 
     FMailItem.Body := mailText; 
    end; 
    ... 
end; 
0

我還沒有找到真正的解決方案,但這裏是一個解決方法。

訣竅是使用CreateItemFromTemplate-方法,其中您的模板包含所有設置。顯然,用戶需要爲此創建一個模板,但這是一次性操作,不會太難。

procedure TMainForm.DoMailAction(aAction: TMailAction); 
var 
    mail: _MailItem; 
    folder: OleVariant; 
begin 
    Connect(); 
    folder := FOutlook.Session.GetDefaultFolder(olFolderDrafts); 
    mail := FOutlook.CreateItemFromTemplate('C:\\Users\\fkoch\\default.oft', folder) as _MailItem; 
... 

此外,所選擇的文件夾「草稿」使簽名得到附接到mailbody,只要是的MailItem由用戶手動在郵件的對話框(mail.display(False))發送。當通過mail.send()mail.save()直接處理時,不會發生這種情況。

相關問題