2016-09-08 1 views
0

カップルの時間を検索した後、私は、このような簡単な作業では(あるいは、少なくともそれはそのようseemd)achiveすることは容易ではないことに気づきました。を開き、既定のメールクライアント - ウェブ(Asp.Net MVC)

ので、(私は追加添付ファイル付きの意味プレフィルド付き)、Webアプリケーションからのプレフィルドメールクライアントのウィンドウを開くためにpossiblityはありますか?私は、ASP.NET Mvcを使用していますが、私はthats重要なbczのコードは、クライアント上で実行する必要がありますね。

私はmailtoと& attachment = "C:¥file.txt"を試しましたが、これはうまくいきます。私はセキュリティ上の理由からbczできない可能性があると読んでいます。それはまったくわかりませんが、ポイントは、ユーザーがメールを送信する前にメールを見ることができるということです(メールを自動的に送信するよりも安全です)。

そして、私は、サーバー側が送信たくないが、bczその方法は、すべてのユーザーが自分の資格情報を提供する必要があり、それ以外にも、多分ユーザーは、彼がそれを送信する前に、メール内のSMTを変更したいです。

これは企業向けソフトウェアに関するもので、ユーザーがリンクをクリックすると、サーバー上にドキュメントを作成してクライアントにダウンロードします。今のところメールに添付して開きます新規に作成したメールは

おかげ よろしく

答えて

0

をあなたが言ったけれども:

コードは、クライアント上で実行する必要があります

は、サーバー上でそれを行うことは可能かつ有効である、あなたは投稿の要件を与えられました。あなたがサーバー上でそれをしてはならない理由が他にもあるなら、教えてください。あなたは、サーバー上の添付ファイルへのアクセス権を持っている場合は


は、あなたは、あなたのサーバー上のSystem.Net.Mail.MailMessageオブジェクトを生成し、添付ファイルを追加し、ユーザーへのダウンロードを経由してファイルを渡すことができます。 (少しトリッキーが、可能な解決策については下記を参照)、このの

唯一の欠点ではなく、即座にメールプログラムの開口部の、ユーザーが積極的にダウンロードしたメールファイルを開くために持っていること、です。

これは(あなたがを使用していると仮定して)あなたはバイト配列にはMailMessageを変換することができる方法である:

public static byte[] ToEml(this MailMessage message) 
{ 
    var assembly = typeof(SmtpClient).Assembly; 
    var mailWriterType = assembly.GetType("System.Net.Mail.MailWriter"); 

    using (var memoryStream = new MemoryStream()) 
    { 
     // Get reflection info for MailWriter contructor 
     var mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null); 

     // Construct MailWriter object with our FileStream 
     var mailWriter = mailWriterContructor.Invoke(new object[] { memoryStream }); 

     // Get reflection info for Send() method on MailMessage 
     var sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic); 

     // Call method passing in MailWriter 
     sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null); 

     // Finally get reflection info for Close() method on our MailWriter 
     var closeMethod = mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic); 

     // Call close method 
     closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null); 

     return memoryStream.ToArray(); 
    } 
} 

hereを発見)

、その後、このバイトを返すコントローラのアクションを構築ファイル結果としての-array:

var result = 
    new FileContentResult(messageBytes, "application/vnd.ms-outlook") 
    { 
     FileDownloadName = "WhateverDownloadNameYouNeed.eml" 
    }; 

Outlookを使用していない場合は、コンテンツタイプを変更する必要があります。

+0

それを開くためにダウンロードしたファイルをクリックすると、うーん...、一瞬、私はいただきました携帯電話で、それと住むことができると言うましょ? iPhone、AndroidでWebアプリケーションを使用したいのですが? MailToはデバイス上で正常に動作しますが、Outlookはありません... – rimes

+0

残念ながら私は私の解決策でそれを達成する可能性はありません。もちろん、Outlookに現在設定されているコンテンツタイプを、お使いのデバイスに応じて別のものに変更できます。しかし悲しいことに、私はその分野で経験のある人ではなく、モバイルデバイスがそのファイルをどのように処理するか、たとえば、Google Mailアプリケーションで.emlファイルを開く可能性がないかどうかはわかりません。 –

関連する問題