Delphi Outlook使用用户设置通过COM发送邮件

Delphi Outlook使用用户设置通过COM发送邮件,delphi,email,com,outlook,delphi-xe5,Delphi,Email,Com,Outlook,Delphi Xe5,我有一个工作应用程序,可以通过COM访问Outlook,并发送、保存或显示我在此应用程序中创建的电子邮件 我想要的是Outlook中帐户的所有设置也应用于我的邮件,因此这意味着哪种邮件类型(文本、html或rich)、自定义字体、签名等等 这里是一个SSCCE(代码的其余部分只是一些日志记录,表单只包含最必要的控件): 如何让MailItem使用所选帐户中的所有格式选项?我仍然没有找到真正的解决方案,但这里有一个解决方法 诀窍是使用CreateItemFromTemplate-方法,其中模板包含

我有一个工作应用程序,可以通过COM访问Outlook,并发送、保存或显示我在此应用程序中创建的电子邮件

我想要的是Outlook中帐户的所有设置也应用于我的邮件,因此这意味着哪种邮件类型(文本、html或rich)、自定义字体、签名等等

这里是一个SSCCE(代码的其余部分只是一些日志记录,表单只包含最必要的控件):


如何让MailItem使用所选帐户中的所有格式选项?

我仍然没有找到真正的解决方案,但这里有一个解决方法

诀窍是使用
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;
...

此外,只要用户在邮件对话框中手动发送邮件项目,选定的文件夹“草稿”就会导致签名附加到邮件正文(
mail.display(False)
)。如果直接通过
mail.send()
mail.save()
进行处理,则不会发生这种情况。我现在找到了解决方案。我把身体放错方向了,这就是它不起作用的原因

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;
过程CreateMail(aMailInfo.TMailInfo)
变量
...
督察:督察;
编辑:Olevant;
开始
FMailItem:=FOutlook.CreateItem(olMailItem)作为_MailItem;
...
insp:=FMailItem.GetInspector;
如果(insp.EditorType=olEditorWord),则开始
编辑:=insp.WordEditor;
editor.Characters.item(1).InsertBefore(mailText);
结束,否则开始
如果FMailItem.BodyFormat=olFormatHTML,则开始
regex:=TRegEx.Create(cReplaceNewline);
FMailItem.HTMLBody:=regex.Replace(mailText,
); 结束其他 FMailItem.Body:=邮件文本; 结束; ... 结束;
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;