提问人:jamesh 提问时间:9/17/2008 最后编辑:jamesh 更新时间:10/25/2010 访问量:8699
如何使用指定的客户端从 Java 以编程方式发送电子邮件附件
How do I send an email attachment using the designated client, programmatically from Java
问:
我想鼓励我们的 RCP 应用程序用户将问题详细信息发送给我们的支持部门。为此,我在标准错误对话框中添加了一个“联系支持”小部件。
我已经设法使用 URI 标头通过 Java 6 的 JDIC 调用发送堆栈跟踪:Desktop.getDesktop().mail(java.net.URI)。
这将启动用户的邮件客户端,准备让他们添加评论,然后点击发送。
我喜欢启动电子邮件客户端,因为这是用户习惯的,它告诉支持很多关于用户的信息(sigs、联系方式等),而且我真的不想随 Java Mail 一起发布。
我想做的是将日志文件和堆栈跟踪附加为一个文件,这样就没有最大长度要求,用户会看到一个漂亮的干净的电子邮件,并且支持部门有更多的信息可以使用。
我可以用我正在采取的方法做到这一点吗?还是有更好的方法?
编辑: 我处于OSGi上下文中,因此捆绑JDIC是必要的。如果可能的话,我希望尽可能少地发布依赖项,并且为多个平台捆绑 JDIC 听起来并不有趣,尤其是对于这么小的功能。
JavaMail 可能是合适的,但事实上,这将在我们的企业客户的桌面上。配置的设置/发现必须是透明的、自动的和可靠的。关于 JavaMail,配置似乎只是手动的。是这样吗?
我最喜欢的答案是使用 for *.eml 文件。不幸的是,Outlook Express(而不是 Outlook)会打开 eml 文件。我不知道这是通常的还是默认的,将 Windows 配置为打开这样的 EML 文件。这很常见吗?或者是否有另一种基于文本的格式,a)易于生成,b)默认情况下在用户已经使用的同一电子邮件客户端中打开?Desktop.open()
答:
使用该方法,您可以使用 URI 设置主题行和正文文本,例如
mailto:m[email protected]?SUBJECT=Support mail&BODY=This is a support mail
但是,主题和正文的长度会有一些限制
我想不出使用这种方法或类似方法附加文件(不将 javamail 添加到您的应用程序)
您可以保存一个临时.eml文件,然后 Desktop.getDesktop().open(emlFile)
编辑:正如您指出的那样,不幸的是,这将打开 Outlook Express 而不是 Outlook。
但是,如果您安装了 Windows Live Mail,它将使用它。
评论
JDIC 可能并不总是在用户的平台上可用。一个很好的方法是使用 javamail API。您可以发送由多个部分组成的电子邮件,如 SUN 在本教程中所述:
如果您使用的是 JDK 6(您确实应该这样做),那么桌面 API 现在是 JRE 的一部分。有关详细信息,请参阅 http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/desktop_api/。
作为处理同一问题的完全不同的方式,我们使用带有 XML-RPC 接口的错误跟踪器,我们的(RCP 也是,顺便说一句)应用程序使用自定义提交对话框进行对话。这意味着我们可以发送日志文件来帮助诊断问题,而无需用户查找它们。
我敢肯定大多数错误跟踪器都有这样的东西。我们使用 Jira,它运行良好(显然,他们刚刚发布了一个免费的个人版本,可以轻松尝试)。
import java.awt.Desktop;
import java.io.File;
import java.net.URI;
public class TestMail {
public static void main(String[] args) {
try {
Runtime.getRuntime().exec(
new String[] {"rundll32", "url.dll,FileProtocolHandler",
"mailto:[email protected]?subject=someSubject&[email protected]&[email protected]&body=someBodyText&Attach=c:\\test\\test.doc"}, null
);
} catch (Exception e) {
e.printStackTrace();
}
}
}
评论