【问题标题】:Outlook send mail via COM with user settingsOutlook 通过 COM 使用用户设置发送邮件
【发布时间】:2014-08-21 02:14:56
【问题描述】:

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

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

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

...
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 使用所选帐户的所有格式选项?

【问题讨论】:

    标签: delphi email com outlook delphi-xe5


    【解决方案1】:

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

    诀窍是使用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)) 中手动发送了 mailItem,所选文件夹“草稿”会导致签名附加到邮件正文。通过mail.send()mail.save() 直接处理时不会发生这种情况。

    【讨论】:

      【解决方案2】:

      我现在找到了解决方案。我把身体设置错了,这就是为什么它不起作用。

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-01
        • 2015-11-13
        • 1970-01-01
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        • 1970-01-01
        • 2015-04-24
        相关资源
        最近更新 更多