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

Joh*_*nyO 5 java windows email desktop

我正在尝试为我们的 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

col*_*sar 3

IE 中允许的 url 和 Windows 命令行的长度有长度限制(请参阅此处此处此处此处) - 我似乎遇到了其中之一(尽管我承认我没有严格检查)。
然而我认为这是一个合理的假设,即使你可以绕过上述限制,桌面应用程序之间的通用传输缓冲区的长度(除非你使用专用的API来远程控制目标应用程序)也会受到某种程度的限制而没有漏洞。

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

  1. 通过网络服务器分发。

    • 上传要邮寄到 Web 服务器的数据,而不是使用 html 表单文件上传技术。基本上,您必须伪造一个 POST 请求,将内容类型设置为“multipart/form-data”的有效负载。您的内容将需要一些包装数据以在语法上符合此 mime 类型。
    • 实际的传输可以通过Windows下的WinHttpRequest COM对象或其他地方的curl命令行程序来发起。
    • 服务器端处理可以委托给合适的 cgi 处理程序,例如。可能会生成一个(短)链接以从 Web 服务器下载数据。
    • 此链接可能是对上传请求的 http 响应的一部分,或者您以正确的格式在客户端生成它,以便将其发布到 Web 服务器上而不做任何更改。
    • 亲:
      这个方案是可行的——我已经在企业项目中多次应用过。数据传输可以通过 https 进行保护。
    • 缺点:
      需要网络服务器来实现
  2. 使用附件发送邮件(有关详细信息,请参阅此处):

    • 将消息正文保存到桌面上的某个文件中。
    • 生成引用附件(而不是正文的大部分内容)的 mailto-link
    • 如果附件具有一些基本的 mime 类型(如“文本/纯文本”),任何像样的邮件客户端都能够内嵌显示附件。在 Windows 平台上,您可以通过选择正确的文件扩展名(“.txt”)来设置它
    • 优点:
      简单
    • con:
      客户端平台上的文件系统访问;未经测试(至少对我来说)

祝你好运 !