C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 【C#】MAPIを用いてメーラーを起動


(過去ログ 102 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■61085 / inTopicNo.1)  【C#】MAPIを用いてメーラーを起動
  
□投稿者/ KAMIMURA (1回)-(2011/08/01(Mon) 16:56:31)

分類:[ASP.NET (C#)] 

2011/08/01(Mon) 16:57:42 編集(投稿者)
いつもお世話になっています。
大変お手数ですが、ご教授頂けます様、よろしくお願いいたします。

[環境]
 C#(ASP.NET)
 .NET Framework 2.0
 Visual Studio 2005

[要件説明]
 画面上のボタンを押下するとデフォルト設定されているメーラーが
 起動(指定したメールアドレスが付与され、ファイルが添付された状態で起動)する
 機能を検討しております。
 通常のメーラー起動機能では、ファイル添付できないため、
 MAPIを使用を前提に検討いたしました。
 使用するメーラーは「Microsoft Office Outlook」または
 「Outlook Express」となります。

[質問内容]
 コードを作成し実行したところ、「MapiMs.Send(true);」にてcatchへ移動し、
 以下のエラーメッセージが出力されてしまいます。
 どのようにすればエラーが発生せず、メーラーが起動するのか、ご教授頂きたい。


---エラーメッセージ---------------------------------------------------
System.Runtime.InteropServices.COMException (0x800A7D02): 予期せぬエラーが発生しました。
   場所 MSMAPI.MAPIMessagesClass.Send(Object vDialog)
----------------------------------------------------------------------


以下、作成したコードとなります。

//********************************************************************
//ソース以外の変更内容
//1.参照追加
// 「参照の追加」より、「Microsoft MAPI Controls 6.0」を追加
//********************************************************************
//ボタン押下時の処理

MSMAPI.MAPISession MapiSs = new MSMAPI.MAPISession();
MSMAPI.MAPIMessages MapiMs = new MSMAPI.MAPIMessages();

MapiSs.DownLoadMail = false;
MapiSs.SignOn();

MapiMs.SessionID = MapiSs.SessionID;        //SessionとMessagesを関連付け
MapiMs.Compose();                           //メッセージを作成
MapiMs.RecipType = 1;
MapiMs.RecipDisplayName = "テスト宛名";     //あて先
MapiMs.RecipAddress = "test_address";       //メールアドレス
MapiMs.MsgSubject = "テスト件名";           //件名
MapiMs.MsgNoteText = "テスト本文";          //本文
MapiMs.AttachmentPathName = "C:\TEST.txt";  //添付ファイル

try
{
    MapiMs.Send(true);
    MapiSs.SignOff();
}
catch
{
    MapiSs.SignOff();
}
//********************************************************************


引用返信 編集キー/
■61088 / inTopicNo.2)  Re[1]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ ロートルプログラマ (4回)-(2011/08/01(Mon) 20:31:09)
.net(大嫌い)の場合のそのものズバリがMSにあるみたいですが。
http://msdn.microsoft.com/ja-jp/library/cc440879.aspx

引用返信 編集キー/
■61092 / inTopicNo.3)  Re[1]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ クエウエ (1回)-(2011/08/01(Mon) 22:31:26)
No61085 (KAMIMURA さん) に返信

添付がない場合はどうですか?
引用返信 編集キー/
■61093 / inTopicNo.4)  Re[2]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ 逆運の覇者 (44回)-(2011/08/01(Mon) 23:12:05)
"C:\TEST.txt" が "C:\\TEST.txt" または @"C:\TEST.txt"のミススペルで、
ファイルが見つからなかったから…では?
catch (Exception e)
{
    MessageBox.ShowDialog(e.ToString());
}
とすれば、より詳細なエラーメッセージが得られますが
COMオブジェクトでは望めませんね。


余談ですが、こう書いたほうがスマートですよ。

try
{
    MapiMs.Send(true);
}
catch
{
}
finally
{
    MapiSs.SignOff();
}

引用返信 編集キー/
■61096 / inTopicNo.5)  Re[2]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ KAMIMURA (2回)-(2011/08/02(Tue) 09:11:32)
No61088 (ロートルプログラマ さん) に返信
> .net(大嫌い)の場合のそのものズバリがMSにあるみたいですが。
> http://msdn.microsoft.com/ja-jp/library/cc440879.aspx

早速のご教授を頂き、誠にありがとうございます。
お教え頂いたWebページを拝見いたしましたが、
サーバ側からの送信ではなく、クライアントPCの
デフォルトメーラからのメール送信を想定しております。

そのため、SmtpMailクラスのメール送信機能では
クライアントメーラから送信ではなくなってしまうため、
当該機能は使用を考えておりません。

お忙しいところご教授頂いたにもかかわらず、こちらの説明不足で
お手間をかけてしまい、申し訳ございません。

引用返信 編集キー/
■61098 / inTopicNo.6)  Re[3]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ KAMIMURA (3回)-(2011/08/02(Tue) 09:55:10)
No61092 (クエウエ さん) に返信
No61093(逆運の覇者 さん)に返信

早速のご確認を頂き、誠にありがとうございます。

添付ファイルにつきましては、コード記述の有無や添付の有無に関らずエラーとなります。

また、逆運の覇者様よりご教授頂きました「MessageBox.ShowDialog(e.ToString())」につきまして、
コードへ追記し確認をいたしましたが、先にお伝えさせて頂いたエラーメッセージと同じ内容と
なっておりました。
引用返信 編集キー/
■61103 / inTopicNo.7)  Re[1]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ 魔界の仮面弁士 (2282回)-(2011/08/02(Tue) 12:42:20)
掲示板の利用ルールにも記載されていますように、半角カナは使用しないようお願いいたします。

No61085 (KAMIMURA さん) に返信
> 使用するメーラーは「Microsoft Office Outlook」または
> 「Outlook Express」となります。
「Microsoft Windows Mail」や 「Microsoft Internet Mail and News」は対象外なのですね。
(まぁ、MSIMN + C# の組み合わせは流石に無いと思いますが、Windows Mail はありそうな気が)


> C#(ASP.NET)
MAPI って、ASP.NET から利用できましたっけ?

現在の MAPI は、ユーザー応答を必要とするタイプの COM API として実装されているため、
サーバー動作の無人アプリや、Web Client からは利用できないと思っていたのですが…。
(もちろん、Windows Client として実装する場合は良いでしょうけれど)

どうしても Web Client として実装したいなら、IE の object タグに C# 製 DLL を
埋め込んで実行させるという手はありますが、セキュリティ上の問題が残りますね。


> MAPIを使用を前提に検討いたしました。
Windows Client から実行した場合においては、当方環境(Outlook 2007)で
提示された C# コードでエラーなく動作しました。

ということで、先に環境側の確認をしておいてください。

 (1) Windows Client から呼び出した場合もエラーになるのか?

 (2) 非.NET な環境から利用した場合にも同様のエラーになるのか?

 (3) Outlook VBA あるいは Excel VBA などから Outlook (≠Express) の
  Send メソッド経由でメールを送出することはできるのか?
  http://www.ken3.org/cgi-bin/group/vba_outlook.asp


> // 「参照の追加」より、「Microsoft MAPI Controls 6.0」を追加

MSMAPI はデザインタイムライセンスが要求されるコンポーネントですが、
その点はクリア済みでしょうか。(VS6 開発環境あるいは VB6Controls.reg 等)

なお、MSMAPI32.OCX を使えない場合は、mapi32.dll を直接利用する手もあります。
http://www.pinvoke.net/default.aspx/mapi32.MAPISendMail


> System.Runtime.InteropServices.COMException (0x800A7D02):
VB6 環境で「Err.Raise &H800A7D02」を実行したところ、実行時エラー 32002 に変換されました。
800A7D02 だけではなく、32002 という番号でも情報を探してみてください。

こちらの方でも、ヘルプファイル(mapi98.chm)の「MAPI コントロールのエラー定数」を
見てみたのですが、そこに書かれているのは、
  mapFailure 32002 予期せぬエラーが発生しました。
という程度で、それ以上の情報は無さそうです。


同様に、オンライン版 MSDN Library も参照してみました。
既に日本語版が閉鎖されているため、英語版ページから辿って行きます。
http://msdn.microsoft.com/en-us/library/aa228170%28VS.60%29.aspx
こちらは、日本語版よりも少し詳しく書かれてはいましたが、
  mapFailure 32002 Unspecified failure has occurred
  An unspecified error occurred during the current action.
  For example, the action was unable to delete or address mail correctly.
という程度なので、残念ながら解決には至りそうな情報は見当たりませんでした。


>  MapiMs.Send(true);
true 指定という事は、Outlook 等の送信画面が表示され、そこで「送信」ボタンを
手動で押す必要がありますが、それは構わないのですよね。

# false を指定した場合も、最近の環境 (Outlook 2002 以降?) では
# ユーザー操作は必要になりますけれどね。


> try
> {
>  MapiMs.Send(true);
>  MapiSs.SignOff();
> }
> catch
> {
>  MapiSs.SignOff();
> }
逆運の覇者さんも書かれていますが、try 句と catch 句の両方で MapiSs.SignOff(); を
呼んでいるのであれば、それらは finally にまとめた方が良い気がします。
引用返信 編集キー/
■61140 / inTopicNo.8)  Re[2]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ KAMIMURA (4回)-(2011/08/03(Wed) 14:36:09)
No61103 (魔界の仮面弁士 さん) に返信

返信が大変遅くなってしまい、申し訳ございません。

ご教授頂き、誠にありがとうございます。

> 掲示板の利用ルールにも記載されていますように、半角カナは使用しないようお願いいたします。
 申し訳ございません。以後、厳重に注意いたします。

> 「Microsoft Windows Mail」や 「Microsoft Internet Mail and News」は対象外なのですね。
 ご認識頂いたとおり、対象外となります。

>> C#(ASP.NET)
> MAPI って、ASP.NET から利用できましたっけ?
 藁にも縋る思いでネットを探し、たどり着いたのがMAPIであったため、
 それがASP.NETで使用できるのかの調査が抜けておりました。

> Windows Client から実行した場合においては、当方環境(Outlook 2007)で
> 提示された C# コードでエラーなく動作しました。
 お忙しい中にもかかわらず調査頂き、誠にありがとうございます。
 当方「Windows Client」ではなく、「Web Client」にて実装いたします。
 そのため、Windows Clientでの調査等は行っておりませんでした。
 ご指摘頂いた環境側の確認を実施いたします。

> MSMAPI はデザインタイムライセンスが要求されるコンポーネントですが、
> その点はクリア済みでしょうか。(VS6 開発環境あるいは VB6Controls.reg 等)
 クリア済みとなります。

>> MapiMs.Send(true);
> true 指定という事は、Outlook 等の送信画面が表示され、そこで「送信」ボタンを
> 手動で押す必要がありますが、それは構わないのですよね。
 構いません。逆に、自動で送信されてしまう方が困ってしまいます。

> 逆運の覇者さんも書かれていますが、try 句と catch 句の両方で MapiSs.SignOff(); を
> 呼んでいるのであれば、それらは finally にまとめた方が良い気がします。
 ご指摘ありがとうございます。以後、try句を書く際はご指摘頂いた書き方にて記述をいたします。
 > 逆運の覇者様
  ご指摘ありがとうございました。


引用返信 編集キー/
■61148 / inTopicNo.9)  Re[3]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ 魔界の仮面弁士 (2287回)-(2011/08/03(Wed) 17:30:12)
2011/08/03(Wed) 17:34:16 編集(投稿者)

No61140 (KAMIMURA さん) に返信
>>> どのようにすればエラーが発生せず、メーラーが起動するのか、ご教授頂きたい。

当方では、MSMAPI32.OCX + Outlook でのファイル添付動作は試したことが
ありますが、Outlook Express との組み合わせは未検証です。

もしも MSMAPI32.OCX で問題無いようであれば、
 (1) MAPI を呼び出すための「EXE」を用意する。
 (2) それを ClickOnce 配置でサーバーに置く。
 (3) ASP.NET からは、.applicationファイルへのURLに
  リンクを貼り、そこに添付ファイル情報等を渡す。
 (4) 起動された EXE は、URL の引数からメール情報を受け取り、
  MAPI 経由でメール送信を行う。
という手があるかと思います。
http://www.atmarkit.co.jp/fdotnet/dotnettips/514clickoncmdarg/clickoncmdarg.html

ただし ClickOnce の場合、配置マニフェストの確認のために、
起動完了までに数秒程度の時間を要する事があります。


>>> 通常のメーラー起動機能では、ファイル添付できないため、
ASP.NET からは mailto のリンクを置くことで処理したいのなら、
 (1) mailto を受け取るだけのアプリを自作し、それを「既定のメーラー」にする。
 (2) そのアプリは、受け取ったパラメータを「デフォルトの MAPI サーバー」に
  対して送出するように実装する。
とするというのはどうでしょうか。実現可能かどうかは調べていませんけれども。



>> MAPI って、ASP.NET から利用できましたっけ?
> 藁にも縋る思いでネットを探し、たどり着いたのがMAPIであったため、
少なくとも MSMAPI32.OCX は、ユーザーとの対話が必要なコンポーネントだと思います。
mapi32.dll の API を直接呼び出した場合はどうだか分かりませんけれど。

Internet Explorer 上で、C# の DLL をクライアント実行させる方法も
無いわけではありませんが、その場合、各クライアントでセキュリティ設定の
変更を行ってもらう必要があるので、現実的では無さそうです。
http://d.hatena.ne.jp/language_and_engineering/20100705/p1


> それがASP.NETで使用できるのかの調査が抜けておりました。
ASP.NET の場合、C# で記述された部分というのは、「サーバー上」で
実行されることになるわけですが、その点は把握されていますでしょうか。
(クライアント上で実行されるコードは、基本的に JavaScript 等が使われます)

すなわち、今回の C# コードを実行した場合、利用される MAPI 設定とうのは
実行したコンピューター上のもの(すなわち、サーバー側の設定)ということになります。
添付ファイルもサーバー上のパスが使われるわけですが、ここまでの認識は相違ないですか?


それともう一点。

先の回答でも確認しましたが、MAPIMessages.Send の呼び出しが行われると、その段階で
> Outlook 等の送信画面が表示され、そこで「送信」ボタンを手動で押す必要がありますが
という動作になります。(この点は認識済みなのですよね)

ということは、今回のコードで送信ダイアログが表示されるとすれば、それは
ブラウザ上(Webクライアント)ではなく Web サーバー上ということになりますが、
それは理解されていますでしょうか。


>  当方「Windows Client」ではなく、「Web Client」にて実装いたします。
>  そのため、Windows Clientでの調査等は行っておりませんでした。

Web サーバーと Web クライアントは、通常は別のコンピューターです。
(開発時は、共にローカル上で実行する事もあるかも知れませんが)

これでは、利用者が「送信」ボタンを押すことはできないはずっです。
まさか、ユーザー側がサーバーに赴いて「送信」ボタンを押してもらうという
わけにも行きませんし、第一、サーバー上の各サービスは無人実行されるため、
そもそもサーバー上ではデスクトップ画面が表示されていない可能性があります。

通常の設定では、無人実行されるサービスはユーザー対話を行えませんので、
そのために Send メソッドが失敗していたのだと思います。
設定次第では Send を実行できるようにもできるかも知れませんが、
もし呼び出せたとしても、それは思い描いていた動作とは異なると思いますよ。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -