的mailto URI Java.Desktop和Windows / MS Outlook之间截断

我试图创造我们的Java桌面应用程序的自动错误报告工具。 这个想法是让尽可能容易为客户向我们发送错误报告,每当我们的应用程序崩溃。

使用Desktop.mail API,我能够工艺,可以轻松编辑和我们的用户发送的消息,但我运行到系统的限制,在多种平台上(特别是Windows 7和微软的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(); } }

--------------解决方案-------------

有长度限制在WRT受理的,即URL和Windows命令行的长度(见这里,这里,这里和这里) - 我看来你碰到其中之一(虽然我承认,我还没有严格的检查)。
不过,我认为这是一个合理的假设,即使你能蠕虫你周围的表示方式限制了桌面应用之间的通用传输缓冲区的长度(除非使用专用的API,用于远程控制的目标应用程序)将没有一个漏洞在某种程度上限制。

因此,我建议以下策略之一:

  1. 通过Web服务器的分布。
    • 上传数据,而不是使用HTML表单文件上传技术邮寄到Web服务器。 基本上你必须建立一个POST请求与内容类型设置为“的multipart / form-data的”有效载荷。 您的内容将需要一些包装的数据与此MIME类型语法一致。
    • 实际传输可以通过Windows下的WinHttpRequest COM对象或从其他地方curl命令行程序来策动。
    • 可以服务器端处理委托给如合适的CGI处理程序。 可能会产生一个(短)链接,下载数据的FOM Web服务器。
    • 这个环节可能是HTTP响应上传请求的一部分,或者你生成它以正确的格式客户端发布它在Web服务器上不变。
    • 亲们:
      这个方案是可行的 - 我曾多次在企业项目应用它。 数据传输可通过HTTPS进行保护。
    • CON:
      需要Web服务器来实现
  2. 使用附件(一些细节见这里)发送邮件:
    • 您邮件的正文保存到桌面上的某些文件。
    • 生成一个mailto链接引用附件(而不是大部分你的身体)
    • 任何像样的邮件客户端就能显示附件内联,如果它有一些基本的MIME类型,如“text / plain的”。 在Windows平台上通过选择正确的文件扩展名('.​​TXT')设置
    • 亲们:
      简单
    • CON:
      文件在客户端平台上的系统访问; 未经测试(至少我所)

祝你好运 !

分类:java的 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.653 (s). 10 q(s)