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

时间:2020-03-05 18:58:31  来源:igfitidea点击:

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

我已经设法使用URI标头通过Java 6的JDIC调用发送堆栈跟踪:Desktop.getDesktop()。mail(java.net.URI)。这将启动用户的邮件客户端,使他们可以添加评论并点击发送。

我喜欢启动电子邮件客户端,因为这是用户习惯的方式,它告诉支持人员很多有关用户(信号,联系方式等)的信息,而我真的不希望随Java Mail一起提供。

我想做的是将日志文件和stacktrace添加为文件,因此没有最大长度要求,并且用户看到的电子邮件看上去很干净,并且支持部门有很多信息可以使用。

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

编辑:
我在OSGi环境中,因此捆绑JDIC是必要的。如果可能的话,我希望提供尽可能少的依赖项,并且为多个平台捆绑JDIC听起来并不有趣,尤其是对于这么小的功能。

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

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

解决方案

回答

使用该方法,我们可以使用以下URI设置主题行和正文

mailto:[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(确实应该使用),则Desktop API现在是JRE的一部分。有关更多信息,请参见http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/desktop_api/。

回答

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

我敢肯定,大多数错误跟踪器都有类似的可用功能。我们使用Jira,而且效果很好(显然,他们刚刚发布了免费的Personal版本,可以轻松尝试)。

回答

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();
        }
    }

}