Search code examples
delphiemailcomoutlookdelphi-xe5

Outlook send mail via COM with user settings


I have a working application that can access Outlook via COM and send, save or show emails I create inside this app.

What I want is all the settings of the account in Outlook getting applied on my mail too, so this means which mail-type (text, html or rich), custom fonts, signatures, and so on.

here a SSCCE (the the rest of the code is just some logging, and the form only contains the most neccessary controls):

...
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;

How can I get the MailItem to use all formatting-options from the chosen account?


Solution

  • I've found the solution now. I'v set the body the wrong way, thats why it didn't work.

    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;