有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从Java到MailUri被截断。桌面和Windows/MS outlook

我正在尝试为我们的Java桌面应用程序创建一个自动错误报告工具。这样做的目的是让客户在应用程序崩溃时尽可能容易地向我们发送错误报告

使用桌面。邮件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();
    }

}

共 (1) 个答案

  1. # 1 楼答案

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

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

    1. 通过web服务器分发

      • 将要邮寄的数据上传到web服务器,而不是使用html表单文件上传技术。 基本上,您必须伪造一个POST请求,并将内容类型设置为“multipart/form data”。您的内容将需要一些包装器数据,以便在语法上符合此mime类型
      • 实际的传播可以通过窗户下的WinHttpRequest COM object或其他地方的curl command line program进行
      • 服务器端处理可以委托给合适的cgi处理程序,例如,可以生成一个(短)链接,从web服务器下载数据
      • 此链接可能是对上载请求的http响应的一部分,或者您以正确的格式在客户端生成该链接,以便在web服务器上不作更改地发布该链接
      • 专业人士:
        这个方案是可行的——我已经在企业项目中多次应用了它。数据传输可以通过https进行保护
      • 反对意见:
        需要一个web服务器来实现
    2. 使用附件发送邮件(有关详细信息see here):

      • 将邮件正文保存到桌面上的某个文件中
      • 生成引用附件(而不是身体的大部分)的mailto链接
      • 任何一个像样的邮件客户端都可以内联显示附件,如果它有一些基本的mime类型,比如“text/plain”。 在windows平台上,可以通过选择适当的文件扩展名('.txt')来设置
      • 专业人士:
        简单的
      • 反对意见:
        客户端平台上的文件系统访问; 未经测试(至少由我测试)

    祝你好运