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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.61085 の関連記事表示

<< 0 >>
■61085  【C#】MAPIを用いてメーラーを起動
□投稿者/ KAMIMURA -(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();
    }
    //********************************************************************

親記事 /過去ログ102より / 関連記事表示
削除チェック/

■61088  Re[1]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ ロートルプログラマ -(2011/08/01(Mon) 20:31:09)
記事No.61085 のレス /過去ログ102より / 関連記事表示
削除チェック/

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

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

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

    お忙しいところご教授頂いたにもかかわらず、こちらの説明不足で
    お手間をかけてしまい、申し訳ございません。
記事No.61085 のレス /過去ログ102より / 関連記事表示
削除チェック/

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

    添付がない場合はどうですか?
記事No.61085 のレス /過去ログ102より / 関連記事表示
削除チェック/

■61093  Re[2]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ 逆運の覇者 -(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();
    }
記事No.61085 のレス /過去ログ102より / 関連記事表示
削除チェック/

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

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

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

    また、逆運の覇者様よりご教授頂きました「MessageBox.ShowDialog(e.ToString())」につきまして、
    コードへ追記し確認をいたしましたが、先にお伝えさせて頂いたエラーメッセージと同じ内容と
    なっておりました。
記事No.61085 のレス /過去ログ102より / 関連記事表示
削除チェック/

■61103  Re[1]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ 魔界の仮面弁士 -(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 にまとめた方が良い気がします。
記事No.61085 のレス /過去ログ102より / 関連記事表示
削除チェック/

■61140  Re[2]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ KAMIMURA -(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句を書く際はご指摘頂いた書き方にて記述をいたします。
     > 逆運の覇者様
      ご指摘ありがとうございました。

記事No.61085 のレス /過去ログ102より / 関連記事表示
削除チェック/

■61148  Re[3]: 【C#】MAPIを用いてメーラーを起動
□投稿者/ 魔界の仮面弁士 -(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 を実行できるようにもできるかも知れませんが、
    もし呼び出せたとしても、それは思い描いていた動作とは異なると思いますよ。
記事No.61085 のレス /過去ログ102より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -