2014-06-30 3 views
2

COM을 통해 Outlook에 액세스하고이 응용 프로그램 내에서 생성 한 전자 메일을 보내거나 저장하거나 표시 할 수있는 작동하는 응용 프로그램이 있습니다.Outlook에서 사용자 설정을 사용하여 COM을 통해 메일 보내기

내가 원하는 것은 Outlook에서 계정의 모든 설정을 내 메일에도 적용하기 때문에 메일 유형 (텍스트, HTML 또는 리치), 사용자 지정 글꼴, 서명 등을 의미합니다. 여기

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가에서 모든 서식-옵션을 사용하여 얻을 수 있습니다 선택한 계정?

답변

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 -method를 사용하는 것입니다. 분명히 사용자는이 목적을 위해 템플릿을 만들어야하지만 너무 힘들지 않은 일회성 액션입니다.

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

또한, 선택한 폴더는 "초안"서명이 동안에는는 MailItem 수동으로 메일 대화 상자 (mail.display(False))에서 사용자에 의해 전송되는 한, mailbody에 부착하기됩니다. mail.send() 또는 mail.save()을 통해 직접 처리 한 경우에는 발생하지 않습니다.