2012-02-24 4 views
4

Javaデスクトップアプリケーションの自動エラー報告ツールを作成しようとしています。クライアントのアプリケーションがクラッシュするたびに、エラー報告をできるだけ簡単に送信することを目的としています。mailto URIがJava.DesktopとWindows/MS Outlookの間で切り捨てられました

Desktop.mail APIを使用して、私は簡単に編集してユーザーから送信できるメッセージを作成することができますが、いくつかのプラットフォーム(特にWindows 7およびMS Outlook使用しています)

以下のサンプルコードを実行すると、表示される電子メールメッセージに含まれるスタックトレースが切り捨てられます。私はこれが、基本的なシステムのコマンドラインまたはURIの最大長と関係していると考えています。

この制限の対象ではないエラーレポートから電子メールを作成する方法はありますか?

import java.awt.Desktop; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.net.URI; 
import java.net.URLEncoder; 

public class Scratchpad { 

    public static void main(String[] args) throws Exception { 
     try { 
      generateLongStackTrace(); 
     } catch (Error e) { 
      URI uri = createMailURI(e); 
      // this will correctly pop up the system email client, but it will truncate the message 
      // after about 2K of data (this seems system dependent) 
      Desktop.getDesktop().mail(uri); 
     } 
    } 

    // Will eventually generate a really long stack overflow error 
    public static void generateLongStackTrace() throws Exception { 
     generateLongStackTrace(); 
    } 

    public static URI createMailURI(Error e) throws Exception { 
     StringBuilder builder = new StringBuilder(); 
     builder.append("mailto:[email protected]?body="); 
     // encodes the stack trace in a mailto URI friendly form 
     String encodedStackTrace = URLEncoder.encode(dumpToString(e), "utf-8").replace("+", "%20"); 
     builder.append(encodedStackTrace); 
     return new URI(builder.toString()); 
    } 

    // Dumps the offending stack trace into a string object. 
    public static String dumpToString(Error e) { 
     StringWriter sWriter = new StringWriter(); 
     PrintWriter writer = new PrintWriter(sWriter); 
     e.printStackTrace(writer); 
     writer.flush(); 
     return sWriter.toString(); 
    } 

} 

答えて

2

は、長さの制限がIEとWindowsのコマンドラインの長さの許容URLをWRTがある(herehereherehereを参照してください) - 私は私が持っていることを認めるけれども、あなたが(これらのいずれかに実行するようです厳密にチェックされていない)。
しかし、私はあなたが上記の制限の周りにあなたの方法を迂回する可能性がある場合でも、(ターゲットアプリケーションをリモート制御するために専用のAPIを使用しない限り)デスクトップアプリケーション間の汎用送信バッファの長さは、抜け穴。 Webサーバ経由

  1. 分布:

    したがって、私は、次のいずれかをお勧めしたいです。

    • htmlフォームファイルアップロードテクニックを使用する代わりに、Webサーバーにメールを送信するデータをアップロードします。 基本的に、コンテンツタイプが 'multipart/form-data'に設定されたペイロードをPOSTリクエストで偽造する必要があります。あなたのコンテンツには、このMIMEタイプと構文的に一致するラッパーデータが必要です。
    • 実際の送信は、WinHttpRequest COM objectウィンドウまたはcurl command line programの他の場所から実行することができます。
    • サーバー側の処理は、適切なcgiハンドラに委譲することができます。 Webサーバーのデータをダウンロードする(短い)リンクが生成されることがあります。
    • このリンクは、アップロード要求に対するhttp応答の一部である場合もあれば、変更されていないWebサーバーに公開するための適切な形式でクライアント側を生成する場合もあります。
    • プロ:
      このスキームは実行可能です - 私はエンタープライズプロジェクトで繰り返し適用しました。 httpsを通じてデータ伝送を確保することができます。
    • 詐欺:
  2. を実装するために、Webサーバーが必要です(いくつかの詳細see here用)添付ファイルを使用してメールを送信:

    • 上のいくつかのファイルにあなたのメッセージの本文を保存デスクトップ。
    • 添付ファイルを参照するmailto-linkを生成する(本体の大部分ではなく)
    • 「text/plain」のような基本的なMIMEタイプがあれば、まともなメールクライアントは添付ファイルを表示できます。 ;クライアント・プラットフォーム上
      ファイルシステムアクセス:
      シンプル
    • 詐欺:プロ
    • あなたが適切なファイル拡張子(「.TXT」)を選択することによって、それを設定し、Windowsプラットフォーム上の

(少なくとも私による)テストされていない幸運!

+0

アイデアありがとう。私は最後の数日でオプション2を調査しています。 Attachmentオプションはmailto URI仕様の正式な部分ではなく、一部の古い電子メールクライアント(outlook 98/2003)がこの要素をサポートしていましたが、現代のもの(Outlook 2010)はそうではありません。もうオプションはありません。 – JohnnyO

+0

興味深い。 2番目の考えでは、おそらく賢明です。自動的にファイルを添付すると、セキュリティを破ることが容易になります。 – collapsar

関連する問題