mailto URI在Java.Desktop和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命令行的长度(见
here,
here,
here
here) – 我似乎遇到其中一个(虽然我承认我没有严格检查).

但是我认为这是一个似是而非的假设,即使你可以绕过上述限制蠕虫,桌面应用程序之间的通用传输缓冲区的长度(除非你使用专用的api来远程控制目标应用程序)将受到某种程度的限制而没有漏洞.

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

>通过Web服务器分发.

>使用html表单文件上载技术将要邮寄的数据上传到Web服务器.
基本上你必须伪造一个POST请求一个内容类型设置为’multipart / form-data’的有效负载.你的内容需要一些包装数据,以符合这种mime类型的语法.
>实际的传输可以通过windows下的WinHttpRequest COM object或其他地方的curl command line program进行.
>服务器端处理可以委托给合适的cgi处理程序,例如.可能会产生一个(短)链接来下载Web服务器的数据.
>此链接可能是对上传请求的http响应的一部分,或者您以正确的格式生成客户端,以便在未更改的Web服务器上发布它.
>亲:
这个方案是可行的 – 我已经多次在企业项目中应用它.可以通过https保护数据传输.
> con:
需要Web服务器来实现

>使用附件发送邮件(有关详细信息see here):

>将邮件正文保存到桌面上的某个文件中.
>生成引用附件(而不是身体的大部分)的mailto-link
>任何体面的邮件客户端都能够显示内联附件,如果它有一些基本的mime类型,如’text / plain’.
在Windows平台上,您可以通过选择正确的文件扩展名(‘.txt’)来设置它
>亲:
简单
> con:
客户端平台上的文件系统访问;
未经测试(至少由我)

祝好运 !

点赞