如何使用指定的客户端以编程方式从Java发送电子邮件附件

时间:2008-09-17 10:33:40

标签: java uri email-integration

我想鼓励我们的RCP应用程序用户将问题详细信息发送给我们的支持部门。为此,我在标准错误对话框中添加了“联系支持”小部件。

我设法使用URI标头使用Java 6的JDIC调用发送堆栈跟踪:Desktop.getDesktop().mail(java.net.URI)。这将启动用户的邮件客户端,准备好添加他们的评论,然后点击发送。

我喜欢启动电子邮件客户端,因为它是用户习惯的,它告诉支持很多用户(sigs,联系人详细信息等),我真的不想要to ship with Java Mail。< / p>

我想做的是将日志文件和堆栈跟踪作为文件附加,因此没有最大长度要求,并且用户看到一个干净整洁的电子邮件,并且支持部门有更多信息与之合作。

我可以用我采取的方法做到这一点吗?或者有更好的方法吗?

修改: 我在OSGi上下文中,因此捆绑JDIC是必要的。如果可能的话,我希望尽可能少地发送依赖项,并且为多个平台捆绑JDIC听起来并不好玩,特别是对于这么小的功能。

JavaMail可能是合适的,但事实上这将在我们公司客户的桌面上。 设置/发现配置必须透明,自动且可靠。关于JavaMail,配置似乎只是手动的。是这种情况吗?

我最喜欢的答案是使用Desktop.open()作为* .eml文件。不幸的是, Outlook Express(而非Outlook)会打开eml文件。我不知道这是通常的还是默认配置Windows来打开像这样的EML文件。这通常吗?或者是否有另一种基于文本的格式a)易于生成,b)默认情况下在用户已经使用的同一电子邮件客户端中打开?

6 个答案:

答案 0 :(得分:3)

您可以保存临时.eml文件,Desktop.getDesktop()。open(emlFile)
编辑:正如您所指出的,不幸的是,这将打开outlook express而不是outlook 但是,如果您安装了Windows Live Mail,它将使用它。

答案 1 :(得分:1)

如果你正在使用JDK 6(你真的应该),那么Desktop API现在是JRE的一部分。有关详细信息,请参阅http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/desktop_api/

答案 2 :(得分:1)

作为处理同一问题的一种完全不同的方式,我们使用带有XML-RPC接口的错误跟踪器,我们的(RCP也是顺便说一句)应用程序使用自定义提交对话框与之对话。这意味着我们可以发送日志文件来帮助诊断问题,而无需用户查找。

我确信大多数错误跟踪器都有这样的东西可用。我们使用Jira,它工作得很好(显然,他们刚刚发布了一个免费的个人版本,可以很容易地尝试)。

答案 3 :(得分:0)

使用该方法,您可以使用类似

的URI设置主题行和正文文本
mailto:me@here.com?SUBJECT=Support mail&BODY=This is a support mail

但是,主题和正文的长度为have some limitation

我无法想到使用此方法或类似方法来附加文件(不向您的应用添加javamail)

答案 4 :(得分:0)

JDIC可能并非总是在您的用户平台上可用。一个好方法是使用javamail API。您可以按照本教程中的说明发送多部分电子邮件:

Sending Attachments

答案 5 :(得分:0)

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:a@a.de?subject=someSubject&cc=a@a.de&bcc=a@a.de&body=someBodyText&Attach=c:\\test\\test.doc"}, null
                  );


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}