从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 楼答案
ie中允许的URL和windows命令行的长度都有长度限制(请参见here、here、here和here)-我似乎遇到了其中一个(尽管我承认我没有严格检查)
然而,我认为这是一个合理的假设,即即使你可以绕过上述限制,桌面应用程序之间通用传输缓冲区的长度(除非你使用专用api远程控制目标应用程序)也会受到某种程度的限制,没有漏洞
因此,我建议采取以下策略之一:
通过web服务器分发
这个方案是可行的——我已经在企业项目中多次应用了它。数据传输可以通过https进行保护李>
需要一个web服务器来实现
使用附件发送邮件(有关详细信息see here):
简单的
客户端平台上的文件系统访问; 未经测试(至少由我测试)
祝你好运