2012-02-24 26 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

有長度限制WRT在IE和Windows命令行的長度可容許的URL(見herehereherehere) - 我看來你碰到的其中之一(雖然我承認我有沒有嚴格檢查)。
然而,我認爲這是一個似是而非的假設,即使您可以繞過上述限制,桌面應用程序之間的通用傳輸緩衝區的長度(除非您使用專用api來遠程控制目標應用程序)將受到某種限制一個漏洞。

因此我建議以下策略之一:通過Web服務器

  1. 分佈。

    • 將要郵寄的數據上傳到Web服務器,而不是使用HTML表單文件上傳技術。 基本上,你必須僞造一個POST請求,其內容類型設置爲'multipart/form-data'。你的內容將需要一些包裝數據來符合這種MIME類型的語法。
    • 實際的傳輸可以通過windows下的WinHttpRequest COM object或其他地方的curl command line program來激發。
    • 服務器端處理可以委託給合適的cgi處理程序,例如。可能會產生一個(短)鏈接來下載Web服務器的數據。
    • 此鏈接可能是上傳請求的http響應的一部分,或者您以正確的格式在客戶端生成該鏈接,以便未經更改地將其發佈到Web服務器上。
    • 親:
      這個方案是可行的 - 我已經多次在企業項目中應用它。數據傳輸可以通過https保護。
    • CON:
      需要一個web服務器來實現
  2. 使用附件(一些細節see here)發送郵件:

    • 您郵件的正文保存對一些文件桌面。
    • 生成一個引用附件(而不是你身體的大部分)的mailto-link
    • 任何體面的郵件客戶端將能夠顯示附件內聯,如果它有一些基本的MIME類型,如「文本/平原」。 在Windows平臺上通過選擇適當的文件擴展名(「名爲.txt」)設置
    • 親:
      簡單
    • CON:客戶端平臺上
      文件系統訪問; 未經測試(至少我)

好運!

+0

感謝您的想法。過去幾天我一直在調查選項2。看來附件選項不是mailto URI規範的正式部分,雖然一些較老的電子郵件客戶端(outlook 98/2003)確實支持這個元素,但大多數現代郵件客戶端(Outlook 2010)都不支持,所以它並不是真的可行選項了。 – JohnnyO 2012-03-01 21:35:42

+0

有趣。第二個想到的限制可能是明智的,自動附加文件使得它太容易打破安全...感謝信息。 – collapsar 2012-03-01 22:16:22