簡體   English   中英

mailto URI在Java.Desktop和Windows / MS Outlook之間被截斷

[英]mailto URI truncated between Java.Desktop and Windows/MS outlook

我正在嘗試為我們的Java桌面應用程序創建一個自動錯誤報告工具。 這樣做的目的是讓客戶在我們的應用程序崩潰時盡可能輕松地向我們發送錯誤報告。

使用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:foo@example.com?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();
    }

}

在ie以及Windows命令行的長度(請參見此處此處此處此處 )的長度中都有可允許的url的長度限制-我似乎遇到了其中一種(盡管我承認我沒有嚴格檢查過)。
但是,我認為這是一個合理的假設,即使您可以繞過上述限制而在台式機應用程序之間通用傳輸緩沖區的長度(除非您使用專用的api來遠程控制目標應用程序)的長度也會受到某種限制而不會出現漏洞。

因此,我建議采用以下策略之一:

  1. 通過Web服務器分發。

    • 而是使用html表單文件上傳技術將要郵寄的數據上傳到Web服務器。 基本上,您必須偽造一個POST請求,將內容類型設置為“ multipart / form-data”的有效負載。 您的內容將需要一些包裝器數據,以使該語法在語法上符合該類型。
    • 實際的傳輸可以通過Windows下的WinHttpRequest COM對象或其他任何地方的curl命令行程序來實現。
    • 服務器端處理可以委托給適當的cgi處理程序,例如。 可能會產生一個(簡短的)鏈接,以從Web服務器下載數據。
    • 此鏈接可能是對上傳請求的http響應的一部分,或者您以正確的格式在客戶端生成了該鏈接,以將其發布到Web服務器上而未更改。
    • 優點:
      這個方案是可行的-我已經在企業項目中反復應用了它。 可以通過https保護數據傳輸。
    • 缺點:
      需要Web服務器來實施
  2. 使用附件發送郵件(有關詳細信息, 請參見此處 ):

    • 將郵件正文保存到桌面上的某些文件中。
    • 生成引用附件的郵件鏈接(而不是您的大部分內容)
    • 如果任何體面的郵件客戶端具有一些基本的MIME類型(例如“文本/純文本”),則可以內聯顯示附件。 在Windows平台上,您可以通過選擇適當的文件擴展名('.txt')進行設置
    • 優點:
      簡單
    • 缺點:
      客戶端平台上的文件系統訪問; 未經測試(至少由我測試)

祝好運 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM