java - mailto URI 在 Java.Desktop 和 Windows/MS outlook 之间被截断

标签 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();
    }

}

最佳答案

ie 中允许的 url 和 windows 命令行的长度有长度限制(参见 herehereherehere )——我似乎遇到了其中之一(虽然我承认我没有严格检查)。
但是我认为这是一个合理的假设,即使您可以绕过上述限制,桌面应用程序之间的通用传输缓冲区的长度(除非您使用专用的 api 来远程控制目标应用程序)也会以某种方式受到限制而没有漏洞.

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

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

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

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

祝你好运!

关于java - mailto URI 在 Java.Desktop 和 Windows/MS outlook 之间被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9435835/

相关文章:

java - 对象标识在java中意味着什么?

c# - 在锁定的 Windows 10 机器上的后台进程中将文本放入剪贴板

java - 我如何给此列表中的每个人加薪

java - Camel onException() 未触发

python - 检查 Windows 应用程序的 "liveness"?

android - 使用 HOGDescriptor(适用于 Android 的 OpenCV)对图像进行梯度和角度可视化

c# - 如何决定 Office 365 上的退回电子邮件?

email - 将 UAML 字段的多个值解析为列表并在 GOLANG 中对其进行迭代

linux - 发送邮件不起作用

java - 如何检查一个字符是大写还是小写?