12

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

やりたいことは、件名、本文、および 1 つ以上の添付ファイルを含む既定の電子メール クライアントを起動することだけです。

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

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

PS。いいえ、添付ファイルのコマンド ライン引数を指定して Outlook.exe を shellExecute しません。

PPS。添付ファイルのサポートは必須であるため、 Mailto : ソリューションは私には適していません。

4

8 に答える 8

8

コマンドライン パラメータを取得する (またはその StandardInput にパイプする) 別のヘルパー EXE を用意して、必要なことを実行し、それをメイン アプリから呼び出します。これにより、MAPI がメイン アプリのプロセス空間の外に保持されます。OK、あなたはまだ MAPI と .NET を混在させていますが、そのプロセスは非常に短命です。これは、MAPI と CLR が実行時間の長いプロセスで問題を引き起こし始めることを前提としています。

Dmitry Streblechenko の優れたRedemption Data Objectsライブラリを使用して、JScript でこのような「shim」コードを記述し、それを呼び出すことができます。これにより、CLR と MAPI の世界が別々のプロセスに保持されますが、サポートされている方法で行われます。

@Chris Fournier re。アンマネージ DLL の作成。問題は MAPI とマネージ コードが同じプロセスに混在しているためです。

于 2008-09-01T20:26:46.720 に答える
2

Mailto: プロトコルで process.Start を呼び出すと (以下に示すように)、基本的な機能は提供されますが、添付ファイルは提供されません。

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

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

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

于 2008-08-07T11:16:11.987 に答える
1

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

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

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

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

于 2008-08-31T00:43:06.763 に答える
1

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

于 2008-08-20T20:01:35.723 に答える
1

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

「クラッシュと火傷」については、MS サポート担当者からの別の引用を次に示します。

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

于 2008-08-27T15:26:23.767 に答える
0

次のコードは 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);
于 2010-12-10T11:58:19.327 に答える
-2

MAPI の経験がある人にとっては、この投稿を入力して応答を読むよりも、アンマネージ コード (プレーン C++ を読んでください) から正確に実行するためにコードをクランクアウトするのにかかる時間は短くなります (不快感はありません)。

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

HTH

于 2009-04-04T05:46:25.163 に答える