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)
IE 中允许的 url 和 Windows 命令行的长度有长度限制(请参阅此处、此处、此处和此处) - 我似乎遇到了其中之一(尽管我承认我没有严格检查)。
然而我认为这是一个合理的假设,即使你可以绕过上述限制,桌面应用程序之间的通用传输缓冲区的长度(除非你使用专用的API来远程控制目标应用程序)也会受到某种程度的限制而没有漏洞。
因此我建议采用以下策略之一:
通过网络服务器分发。
使用附件发送邮件(有关详细信息,请参阅此处):
祝你好运 !