2011-02-02 4 views
3

mailto:, simulated "Send To..." 및 SMTP를 Windows 2000 및 2003 환경에서 사용하는 다양한 전자 메일 통합 방법으로 잘 작동하는 일부 응용 프로그램은 이제 Exchange 2010 및 Outlook 2010 클라이언트가있는 새로운 Windows 2008 시스템으로 이동합니다.Delphi에서 Outlook 2010 메일을 작성하는 가장 쉬운 방법은 무엇입니까?

응용 프로그램에서 새 메일을 만들고 수신자와 제목을 설정하고 하나 이상의 첨부 파일을 추가 한 다음 기본 메일 클라이언트에서 열어서 보내기 전에 사용자가 편집 할 수 있도록하는 유스 케이스가 하나 있습니다.

새로운 환경에서 작동하는 솔루션을 알고 계십니까? 제 3 자 라이브러리를 사용해야합니까? 또는 Outlook.Application을 사용하여 작동하는 것으로 알려진 OLE 자동화 코드가 있습니까?

+0

를 열 수있는 가장 쉬운 방법은 당신이하지 않는 이유가 있나요 SMTP를 사용하여 메시지를 보내기 전에 사용자가 응용 프로그램에서 편집을 처리하도록 하시겠습니까? Outlook에서 메시지를 편집 할 때 제공하는 모든 멋진 기능이 필요하지 않다면, 아마도 많은 simpeler 솔루션이 될 것입니까? –

+0

예를 들어 주소록에서 전자 메일 주소를 추가하여 Outlook 메일 클라이언트의 편집 기능이 필요합니다. 우리는 아직 LDAP/AD 통합을 사용하지 않습니다. – mjn

답변

7

우리는에 jclMapi 단위에서 JclSimpleBringUpSendMailDialog를 사용 제다이 JCL 라이브러리.

나는 SMTP 나 MAPI를 사용할지, 그리고 모든 종류의 메일 서버 설정을 사용 할지를 지정하기 위해 사용자 옵션을 빌드 한 적이 있지만 Jedi 라이브러리 호출을 사용하면 훨씬 쉽습니다. 최종 사용자가 MAPI 클라이언트에서 모든 설정을 구성하는 데 문제가 있다면 왜 내/우리 소프트웨어에서 다시 설정해야할까요?

mailto : // 문제는 메일 클라이언트가 동일한/표준 방식으로 매개 변수를 처리하지 못하는 경우가 종종 있습니다. 사용자는 소프트웨어가 쓰레기라고 생각하지 않고 소프트웨어가 쓰레기라고 생각합니다. dodgy 메일 클라이언트.

그래서 MAPI 인터페이스 만 사용합니다. 쉬운.

+1

이것은 좋아 보입니다. 가장 좋아하는 해결책이 될 것입니다. 감사! +1 – mjn

+0

나는 현재 JCL 릴리스와 함께 시도하고 위에서 설명한 오류를 얻는다. – mjn

+0

흠. 던노. 일반 클라이언트 시나리오에서 잘 작동하며 2003 서버 원격 데스크톱 환경에서 정상적으로 작동합니다. 아무도 작동하지 않는다고 말한 적이 없지만 대량으로 사용되지는 않는다고 생각됩니다. 게시 한 오류 보고서에는 dhcpsvc.dll이라는 언급이 있습니다. 어쩌면 어떤 종류의 이름 확인 문제가 발생했을 수 있습니다. 제쳐두고 - 내 코드는 JCL 호출을 try ...로 포장했습니다. JCL은 일반적으로 자체 오류 대화 상자를 표시한다는 주석과 함께 아무것도하지 않습니다 (!). 따라서 예외 처리가 잘되어야합니다. 아마도 그것은 TS에 대한 사용 권한 문제 일 수 있습니다. – shunty

0

아마도 this can be useful for you.하지만 썬더 버드 사용자이기 때문에 테스트 할 수 없습니다.

+0

나는이 코드 스 니펫을 이미 가지고 있으며 Outlook 2010이 설치된 Windows 7 개발 시스템에서이 코드를 이미 시도했습니다. 나중에 게시 할 오류 메시지와 함께 실패했습니다.어쨌든 링크 덕분에 다른 사람들에게 도움이 될 수 있습니다. (그리고 Windows 2003 시스템에서도 시도해 보겠습니다.) – mjn

+0

흠, 적어도 하나의 예외가있을 경우 유용하지 않을 수 있습니다. –

+0

코드에서 볼 수 있듯이 메시지를 전송합니다. 먼저 메시지 편집기를 표시하는 방법이 필요하므로 사용자는 전송하기 전에 본문, 수신자 등을 먼저 수정할 수 있습니다. ... Save 메서드가 해결 방법이지만 사용자가 Outlook을 열고 수동으로 초안 폴더로 이동해야합니다. – mjn

0

나는이 예를 파헤쳤다. 그것은 2002 년 이후로 오래된 Outlook 버전을 사용하지만 아이디어는 여전히 같아야합니다. 그것은 새로 등록 된 사용자에게 자신의 아이디와 패스워드를 보내는 애플리케이션에서 사용되었습니다. (저를 시작하지 마십시오. 사이트에 대한 액세스를 제한하는 방법 이었지만 민감하지 않았습니다). 메시지는 열리지 않은 보낼 편지함에 저장되지만 OleServer 및 Outlook8을 통해 파고 들면 (숫자가 더 높아질 수 있음) 보낼 편지함에 바로 저장하는 대신 사용자의주의를 끌기 위해 메일을 열 수있는 방법을 찾아야합니다.

전체 Outlook 개체 모델

는 MSDN에서 찾을 수 있습니다 : http://msdn.microsoft.com/en-us/library/aa221870%28v=office.11%29.aspx

사무 자동화에 대한 자세한 내용은 또 다른 좋은 소스가 데보라 페이트의 페이지입니다 : http://www.djpate.freeserve.co.uk/Automation.htm

function TStapWerkt_data.GenerateMailsOutlook(SendDBF: boolean): boolean; 
var 
    Outlook: TOutlookApplication; 
    olNameSpace: NameSpace; 
    MailIt: TMailItem; 
    AttachedFile: OleVariant; 
    i: integer; 
    emailaddress: string; 
begin 
    Result := true; 
    Outlook := TOutlookApplication.Create(nil); 
    try 
    Outlook.ConnectKind := ckNewInstance; 
    try 
     Outlook.Connect; 
     try 
     olNameSpace := Outlook.GetNamespace('MAPI'); 
     olNameSpace.Logon('', '', False, False); 
     try 

      if SendDBF then begin 
      MailIt := TMailItem.Create(nil); 
      MailIt.ConnectTo(Outlook.CreateItem(olMailItem) as MailItem); 
      try 
       MailIt.Recipients.Add('[email protected]'); 
       MailIt.Subject := 'StapWerk.dbf'; 
       MailIt.Body := 'Stap'#13#10; 
       AttachedFile := IncludeTrailingBackslash(ExtractFilePath(
        Stap_db.Stap_Database.DatabaseName)) + 'stapwerk.dbf'; 
       MailIt.Attachments.Add(AttachedFile, EmptyParam, EmptyParam, EmptyParam); 
       MailIt.Save; 
      finally 
       MailIt.Free; 
      end; 
      end; 

      for i := 0 to FNewUsers.Count - 1 do begin 
      MailIt := TMailItem.Create(nil); 
      MailIt.ConnectTo(Outlook.CreateItem(olMailItem) as MailItem); 
      try 
       emailaddress := TStapper(FNewUsers.Items[i]).Email; 
       if emailaddress = '' then begin 
       emailaddress := C_MailUnknownAddress; 
       end; 
       MailIt.Recipients.Add(emailaddress); 
       MailIt.Subject := C_MailSubject; 
       MailIt.Body := Format(C_MailBody, 
        [TStapper(FNewUsers.Items[i]).UserId, 
        TStapper(FNewUsers.Items[i]).Password]); 
       MailIt.Save; 
      finally 
       MailIt.Free; 
      end; 
      end; 

     finally 
      olNameSpace.Logoff; 
     end; 
     finally 
     Outlook.Disconnect; 
     // We kunnen ondanks ckNewInstance quit niet gebruiken 
     // Outlook lijkt de connectkind te negeren en hoe dan ook te koppelen 
     // naar een bestaande instantie. En die gooi je dan dus ook dicht met quit. 
//  Outlook.quit; 
     end; 
    finally 
     Outlook.free; 
    end; 
    except 
    on E: Exception do begin 
     Result := false; 
    end; 
    end; 
end; 
1

내가 본 기기를 사용 -이 전 브라이언 긴 세 크레딧 ...

unit UArtMAPI; 


interface 



procedure ArtMAPISendMail(
      const Subject, MessageText, MailFromName, MailFromAddress, 
        MailToName, MailToAddress: String; 
      const AttachmentFileNames: array of String); 


implementation 



uses 
    SysUtils, 
    Windows, 
    UArtLibrary, 
    Dialogs, 
    Forms, 
    MAPI; 

procedure ArtMAPISendMail(
      const Subject, MessageText, MailFromName, MailFromAddress, 
        MailToName, MailToAddress: String; 
      const AttachmentFileNames: array of String); 
//Originally by Brian Long: The Delphi Magazine issue 60 - Delphi And Email 
var 
    MAPIError: DWord; 
    MapiMessage: TMapiMessage; 
    Originator, Recipient: TMapiRecipDesc; 
    Files, FilesTmp: PMapiFileDesc; 
    FilesCount: Integer; 
begin 
    FillChar(MapiMessage, Sizeof(TMapiMessage), 0); 

    MapiMessage.lpszSubject := PAnsiChar(AnsiString(Subject)); 
    MapiMessage.lpszNoteText := PAnsiChar(AnsiString(MessageText)); 

    FillChar(Originator, Sizeof(TMapiRecipDesc), 0); 

    Originator.lpszName := PAnsiChar(AnsiString(MailFromName)); 
    Originator.lpszAddress := PAnsiChar(AnsiString(MailFromAddress)); 
// MapiMessage.lpOriginator := @Originator; 
    MapiMessage.lpOriginator := nil; 


    MapiMessage.nRecipCount := 1; 
    FillChar(Recipient, Sizeof(TMapiRecipDesc), 0); 
    Recipient.ulRecipClass := MAPI_TO; 
    Recipient.lpszName := PAnsiChar(AnsiString(MailToName)); 
    Recipient.lpszAddress := PAnsiChar(AnsiString(MailToAddress)); 
    MapiMessage.lpRecips := @Recipient; 

    MapiMessage.nFileCount := High(AttachmentFileNames) - Low(AttachmentFileNames) + 1; 
    Files := AllocMem(SizeOf(TMapiFileDesc) * MapiMessage.nFileCount); 
    MapiMessage.lpFiles := Files; 
    FilesTmp := Files; 
    for FilesCount := Low(AttachmentFileNames) to High(AttachmentFileNames) do 
    begin 
    FilesTmp.nPosition := $FFFFFFFF; 
    FilesTmp.lpszPathName := PAnsiChar(AnsiString(AttachmentFileNames[FilesCount])); 
    Inc(FilesTmp) 
    end; 

    try 
    MAPIError := MapiSendMail(
     0, 
     Application.MainForm.Handle, 
     MapiMessage, 
     MAPI_LOGON_UI {or MAPI_NEW_SESSION}, 
     0); 
    finally 
    FreeMem(Files) 
    end; 

    case MAPIError of 
    MAPI_E_AMBIGUOUS_RECIPIENT: 
     Showmessage('A recipient matched more than one of the recipient descriptor structures and MAPI_DIALOG was not set. No message was sent.'); 
    MAPI_E_ATTACHMENT_NOT_FOUND: 
     Showmessage('The specified attachment was not found; no message was sent.'); 
    MAPI_E_ATTACHMENT_OPEN_FAILURE: 
     Showmessage('The specified attachment could not be opened; no message was sent.'); 
    MAPI_E_BAD_RECIPTYPE: 
     Showmessage('The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC. No message was sent.'); 
    MAPI_E_FAILURE: 
     Showmessage('One or more unspecified errors occurred; no message was sent.'); 
    MAPI_E_INSUFFICIENT_MEMORY: 
     Showmessage('There was insufficient memory to proceed. No message was sent.'); 
    MAPI_E_LOGIN_FAILURE: 
     Showmessage('There was no default logon, and the user failed to log on successfully when the logon dialog box was displayed. No message was sent.'); 
    MAPI_E_TEXT_TOO_LARGE: 
     Showmessage('The text in the message was too large to sent; the message was not sent.'); 
    MAPI_E_TOO_MANY_FILES: 
     Showmessage('There were too many file attachments; no message was sent.'); 
    MAPI_E_TOO_MANY_RECIPIENTS: 
     Showmessage('There were too many recipients; no message was sent.'); 
    MAPI_E_UNKNOWN_RECIPIENT: 
     Showmessage('A recipient did not appear in the address list; no message was sent.'); 
    MAPI_E_USER_ABORT: 
     Showmessage('The user canceled the process; no message was sent.'); 
    SUCCESS_SUCCESS: 
     Showmessage('MAPISendMail successfully sent the message.'); 
    else 
    Showmessage('MAPISendMail failed with an unknown error code.'); 
    end; 
end; 




end. 
+0

Outlook에서 보낸 메일 만 표시하거나 볼 수없는 코드에서 볼 수 있습니까? ... 그리고 UArtLibrary 단위는 무엇입니까? – mjn

-1

을 어쩌면이 이메일 창

System("mailto:[email protected]?Subject=Hello%20again&body=your%20textBody%20here") 
+0

다음과 같은 질문에 첨부 파일을 첨부하지 않습니다 : * "", 하나 이상의 첨부 파일 추가 ... "* – mjn

+0

가장 쉬운 방법으로 모든 문제를 해결할 수 없음 – rodolfoprado

관련 문제