2011-02-02 64 views
3

mailto:,simulated "Send To..."、およびSMTPをWindows 2000および2003環境で使用するさまざまな電子メール統合方法でうまく動作するアプリケーションの一部は、Exchange 2010およびOutlook 2010クライアントを備えた新しいWindows 2008システムに移行します。DelphiからOutlook 2010のメールを作成する最も簡単な方法は?

アプリケーションが新しいメールを作成し、受信者と件名を設定し、添付ファイルを1つ追加してからデフォルトのメールクライアントで開き、送信する前にユーザーが編集できるようにするケースが1つあります。

新しい環境で動作するソリューションをご存知ですか?サードパーティライブラリを使用する必要がありますか?または、Outlook.Applicationを使用して動作することが知られているOLEオートメーションコードがありますか?

+0

を開くための最も簡単な方法ですが、あなたがいない理由はありますSMTPを使用してメッセージを送信する前に、アプリケーションがユーザーによる編集を処理できるようにしたいですか?あなたがメッセージを編集するときにOutlookが提供するすべての魅力的なものが必要な場合を除き、おそらくは非常にsimpelerのソリューションでしょうか? –

+0

たとえば、アドレス帳から電子メールアドレスを追加するなど、Outlookメールクライアントの編集機能が必要です。私たちはまだLDAP/ADの統合を使用していません。 – mjn

答えて

7

Jedi JCLライブラリー。

私は以前に、SMTPまたはMAPIを使用するかどうかを指定するためのユーザーオプションを組み込んだアプリケーションを用意していましたが、あらゆる種類のメールサーバー設定がありましたが、Jediライブラリ呼び出しにより、エンドユーザーがMAPIクライアントですべての設定を行う手間を抱えてしまった場合、なぜ私/私たちのソフトウェアでそれらをすべて設定したいのですか?

mailto://の問題は、設定が不十分であるか、メールクライアントが同じ/標準的な方法でパラメータを処理しないということです。ユーザーはソフトウェアのゴミがなくても、 dodgyメールクライアント。

したがって、MAPIインターフェイスを使用します。簡単です。

+1

これはすばらしく、私のお気に入りの解決策になります。ありがとう! +1 – mjn

+0

私は現在のJCLリリースでそれを試して、上記のエラーを取得します。 – mjn

+0

Hmm。ダニー。通常のクライアントシナリオではうまく動作し、2003年のサーバーのリモートデスクトップに勝つことができます。誰もそれが動作しないと報告しているが、私はそれが大量に使用されていないと思う。あなたが投稿したエラーレポートにdhcpsvc.dllという言葉があります。たぶん名前解決に問題があります。例外として、私のコードでは、jcl呼び出しがtry ...にラップされていますが、JCLは通常、それ自身のエラーダイアログを表示しているとのコメントとともに何もしません(!)。だから、例外は処理されるべきだと思われる。たぶんそれはTS上のアクセス許可の問題です。 – shunty

0

多分this can be useful for you.しかし、私はthunderbirdユーザーだからテストできません。

+0

私はこのコードスニペットを既に持っていて、Outlook 2010をインストールしたWindows 7開発システムでこのコードを既に試していました。後で投稿するエラーメッセージで失敗しました。とにかくリンクのおかげで、他の人に役立つかもしれません(Windows 2003システムでも試してみます) – mjn

+0

この場合、少なくとも1つの例外がある場合は役に立ちません。 –

+0

コードからわかるように、メッセージを送信します。メッセージエディタを最初に表示する方法が必要です。送信する前に、本文、受信者などを最初に変更できるようにしてください。 ... Saveメソッドは回避策ですが、ユーザーはOutlookを開いて手動で下書きフォルダに移動する必要があります。 – mjn

0

私はこの例を掘り下げました。それは2002年からのものなので、より古いバージョンのOutlookを使用しますが、アイデアは同じでなければなりません。新しく登録したユーザーに自分のユーザーIDとパスワードを送信するためにアプリケーションで使用されました(私にはそれを開始しないでください。サイトへのアクセスを制限する方法でした。メッセージは開かれていない送信トレイに保存されますが、OleServerとOutlook8を掘り下げてみると、メールがすぐに送信トレイに保存されるのではなく、ユーザーの注目を集めるための方法を見つける必要があります。

全体Outlookオブジェクトモデルは、MSDNで見つけることができます:オフィスオートメーションの詳細についてはhttp://msdn.microsoft.com/en-us/library/aa221870%28v=office.11%29.aspx

もう一つの良いソースデボラパテのページです:私たちは、中jclMapiユニットからJclSimpleBringUpSendMailDialogを使用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から送信されたメールのみを表示するか、Outlookの下書きメールを表示するかはわかりません。 ...そしてUArtLibraryユニットは何のためですか? – mjn

-1

多分これは、電子メールウィンドウ

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

これは、質問に必要な添付ファイルを添付しません:* "、1つ以上の添付ファイルを追加します..." * – mjn

+0

最も簡単な方法ですべての問題を解決することはできません – rodolfoprado

関連する問題