質問

マネージド コード内からの MAPI 関数の使用は正式にはサポートされていません。どうやら、MAPI は独自のメモリ管理を使用しており、マネージド コード内でクラッシュしたり焼き付けられたりします (「 ここ そして ここ)

デフォルトの電子メール クライアントを起動したいだけです 件名、本文、 かつ 1 つ以上の添付ファイル.

それで私は調べてきました MAPISendDocuments そしてそれはうまくいくようです。しかし、その関数を製品コードで実際に使用する勇気がまだ出ていません。

この機能をよく使った人はいますか?何か怖い話はありますか?

PS.いいえ、添付ファイルのコマンド ライン引数を指定して Outlook.exe をシェル実行することはありません。

PPS。アタッチメントサポートは、 要件 , 、つまり、Mailto:解決策は私には向いていません。

役に立ちましたか?

解決

コマンド ライン パラメーターを受け取る (または StandardInput にパイプする) 必要なことを実行する別のヘルパー EXE を用意し、それをメイン アプリから呼び出します。これにより、MAPI 要素がメイン アプリのプロセス領域の外に保持されます。OK、まだ MAPI と .NET を混合していますが、そのプロセスは非常に短期間です。MAPI と CLR により、実行時間が長いプロセスで問題が発生し始めることが想定されています。

ドミトリー・ストレブレチェンコの素晴らしいものを使用しています。 償還データオブジェクト このライブラリを使用すると、JScript でそのような「シム」コードを記述し、それを呼び出すことができます。これにより、CLR と MAPI の世界が別のプロセスに保持されますが、サポートされている方法になります。

@Chris Fournier 再。アンマネージ DLL を作成しています。問題は MAPI とマネージ コードの混合にあるため、これは機能しません 同じプロセスで.

他のヒント

MAPISendDocuments は非推奨となっており、削除される可能性があります。代わりに MAPISendMail を使用する必要があります。見る シンプルなMAPI

呼び出しプロセス。 メールアドレス:プロトコル (以下に示すように) では基本的な機能が提供されますが、添付ファイルは提供されません。

Process.Start("mailto:name@domain.com?subject=TestCode&Body=Test Text");

この方法は添付ファイル パスを使用して実行できますが、このオプションは 98 などの古いバージョンの Outlook でのみ機能します。これは潜在的なセキュリティリスクによるものだと思います。

誰かが Outlook.exe を使用すると、Outlook 2003 (設定によっては 2007) ではセキュリティ警告が表示されます。

MAPI を使用して必要な操作を実行するアンマネージ DLL を作成し、マネージ コードからその DLL を呼び出すことができる必要があります。私なら、直接の MAPI ラッパーを作成するつもりはありませんが、アンマネージ DLL に含まれる MAPI に必要な機能をすべて実行するものを作成します。これはおそらく、マネージ コードから MAPI を使用する最も安全な方法です。

を使用することもできます 見通しの償還, 、マネージド コードからサポートされます。単純な MAPISendDocuments の置き換えがあるかどうかはすぐにはわかりませんが、質問がある場合は Dmitry が役に立ちます。

「衝突と火傷」に関しては、MS サポート担当者からの別の引用です。 ここ

大抵はうまくいくようなものです。書いているうちにうまくいきます。そうすれば、テスト中に動作するようになります。顧客が評価している間も機能します。その後、顧客がそれをデプロイするとすぐに、BAM!そのとき、問題が発生し始めると判断されます。マイクロソフトは、最初からそれをやらないようにと言っているので、それを手助けするつもりはありません。:)

MAPISendMail 関数といくつかの内部クラスを使用してこれを行い、他の MAPI 関連構造の一部をラップしました。これが唯一の用途である限り、さまざまなアンマネージ データ型、メモリの割り当て/割り当て解除、および GC に非常に細心の注意を払う必要があるため、簡単ではありませんが、安全に実行することは可能です。まだサポートされていませんが、私はこれを実稼働コードで使用しています (まだ出荷されていませんが)。

このことについてMatt Stehleに尋ねたところ、次のような答えが返ってきた。

これを行うためのこれより良い方法は本当に知りません。ここで発生した問題は、おそらくサポートされているシナリオ(つまり、VB6 またはアンマネージ C++)。特に .NET から呼び出されるこの関数によって問題が発生するシナリオに遭遇した場合は、.NET を使用しないこと以外に推奨事項はありません。

これを使用することは必ずしも祝福ではありませんが、実際にマネージド コードからこれを行うための他のオプションがあるとも言えません。

次のコードは MAPI 自体を使用しませんが、任意の添付ファイルを含む [メール作成] ウィンドウを開きます。

(実際には、まったくテストされていませんが、機能したと思われるアプリケーションで調べました)

using Microsoft.Office;
using Microsoft.Office.Core;

...

Outlook.Application outlook = new Outlook.Application();
Outlook.MailItem mail = (Outlook.MailItem) outlook.CreateItem(Outlook.OlItemType.olMailItem);

mail.BodyFormat = Outlook.OlBodyFormat.olFormatRichText;
mail.HTMLBody = "stuff";
mail.Subject = "more stuff";
string file = File.ReadAllBytes(...);
mail.Attachments.Add(file, Outlook.OlAttachmentType.olByValue, 1, file)

mail.Display(false);

MAPI の経験がある人であれば、アンマネージ コードから必要なことを正確に実行するコードを作成する時間が短縮されるでしょう (以下を読んでください)。プレーン C++)、この投稿を入力して応答を読むよりも (悪気はありません)。

必要な機能が限られているのは幸運です。必要なのは、コマンドラインで必要なパラメータを取得し、適切な MAPI 呼び出しを発行するための単純な C++ ユーティリティだけです。次に、他のプロセスを実行するのと同じように、マネージ コードからこのユーティリティをすべて実行します。

HTH

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top