2016-04-19 16 views
5

私は非常に特別な要件があります。私のWebアプリケーションでは、データベース値と電子メール本文からPDF請求書を生成する必要があります。私は簡単にこれを完璧に動作するSMTPを使用して送信することができます。asp.netアプリで電子メールに自動生成されたpdfを添付する

しかし、問題は、システムが常に完璧であることに頼ることができないということです。これは請求書です。したがって、SMTPを使用する代わりにデフォルトのメールクライアントを開く必要があります。今、私は次のコードを持っています

//Code to create the script for email 
string emailJS = ""; 
emailJS += "window.open('mailto:[email protected]?body=Test Mail" + "&attachment=" + emailAttachment + "');"; 
//Register the script for post back 
ClientScript.RegisterStartupScript(this.GetType(), "mailTo", emailJS, true); 

これは電子メールを完全に開きますが、添付ファイルは機能していません。パスは/Web/Temp/123.pdfとする。

私は以下のような通常のURLと同じパスを使用すると、新しいウィンドウでファイルを適切に開きます。

ClientScript.RegisterStartupScript(this.GetType(), "newWindow", "window.open('/Web/Temp/123.pdf');", true); 

ファイルは存在しますが、サーバー上に存在します。一方、Outlookはクライアントマシン上で開きます。だから、私はC:\Web\Temp\123.pdfのように完全に決定されたパスを使用することはできません。私が試してみると、フォルダ自体が存在しない可能性があるクライアントマシン上のファイルを見つけようとします。

私はここで何ができるのか把握しようとしています。別の方法があるなら、私は試してみるべきです。

P.S.いいえ、メールを直接送信することはできません。それは、私の将来の地獄の問題をさらに引き起こします。

編集: また、奇妙な問題が見つかりました。添付ファイルのファイルパスに二重引用符を追加すると、\が自動的に追加されます。 @"&attachment=""" + Server.MapPath(emailAttachment) + @"""');"は私に&attachment=\"C:\Web\Temp\123.pdf\"という出力を与えます。

私はその二重引用符をエスケープしようとしていて、何とかそのスラッシュを追加しています。私はこれがまったく別の問題だと知っていますが、新しい質問を作成するのではなく、ここで言及すべきだと思いました。

編集: 私はlocalhostで固定パスを試しました。だから、私は基本的にファイルが格納されている同じマシン上でアプリをテストしています。それでも、全くアタッチメントはありません。

string emailJS = ""; 

emailJS += @"window.open('mailto:[email protected]?body=Test Mail" + emailAttachment + @"&attachment="; 
emailJS += @"""D:\Dev\CSMS\CSMSWeb\Temp\635966781817446275.Pdf""');"; 
//emailJS += Server.MapPath(emailAttachment) + @"');"; 
//Register the script for post back 
ClientScript.RegisterStartupScript(this.GetType(), "mailTo", emailJS, true); 

パスが正しく設定されていることを確認してください。今、それはちょうどcommand line argument not validと言うエラーをスローします。

編集:

他に方法がありますか?私はサーバー側にファイルパスを持っています。たぶん私はクライアントマシン上のいくつかの既定のフォルダに自動的にファイルをダウンロードしそこから開くことができますか?それは可能ですか?

編集:もう1つのオプションを試しました。

emailJS += @"mailto:[email protected]?body=Test Mail" + @"&attachment="; 
emailJS += @"\\localhost\CSMSWeb\Temp\635966781817446275.Pdf"; 
//emailJS += Server.MapPath(emailAttachment) + @"');"; 
Process.Start(emailJS); 

Process.Startラインは機能しますが、何もしません。開始するプロセスはなく、エラーもありません。

編集: yay。私は最終的に、デフォルトのメールクライアントを開く代わりに、別のフォームを使用して件名と本文を表示することをユーザーに承認させました。しかし、私はまだこの問題を解決することを好むだろう。

+0

はあり意図あなたが取り組んでいるこのインターネットアプリケーションは?そうであれば、いくつかの制限を加えて行うことができます。それ以外の場合はできません。 – Andrei

+0

はい、イントラネットアプリケーションです。 – jitendragarg

答えて

2

ここでの問題は、mailtoが添付ファイルの直接ファイルパスのみをサポートしているということです。つまり、パスは、マシンまたはイントラネットパスをネットワーク内で使用するためにはローカルでなければなりません。

つまり、http://yourapp/Web/Temp/123.pdfのようなパスは機能せず、本質的に同じ/Web/Temp/123.pdfも機能しません。これらはパスではなく、添付ファイルとして使用する前にダウンロードしてローカルに保存しなければならないファイルへのリンクです - mailtoプロトコルはそれをサポートしていません。アプリケーションがイントラネットであることから

しかし、何を行うことができますすることを確認してくださいされ、ユーザーは、サーバー上のいくつかのネットワーク共有フォルダへのアクセス権を持っているし、ファイルへのネットワークパスとそれらを提供、それは\\theserver\files\123.pdf

+0

だから、この場合、自分のPCで '\\ localhost \ web \ temp \ 123.pdf'または' C:\ web \ temp.pdf'をデバッグしています。何が必要でしょうか? – jitendragarg

+0

なしまず、共有フォルダを作成する必要があります。このプロセスでは、ウィンドウにネットワークパスが表示されます。それがあなたが必要とするものです。再度、あなたの顧客がこのフォルダ内のファイルにアクセスするためのアクセス権を持っていることを確認してください。 – Andrei

+0

OK、テストのために、ここで私がしたことがあります。固定パス。ローカルマシン上でデバッグしている間も、それは失敗しました。問題の編集を確認し、問題を把握できるかどうか確認してください。多分、私はここに何か他のものを見逃しているでしょうつまり、この場合、サーバーはクライアントと同じなので、Outlookには直接アクセスできます。私は適切にファイルパスをエスケープするようにしました。それと同じ問題。 :/ – jitendragarg

関連する問題