2014-06-30 31 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()直接处理时,不会发生这种情况。

相关问题