如何以跨平台方式使用主题和正文打开默认邮件程序?

时间:2008-08-20 03:20:02

标签: java windows macos email

如何以跨平台方式使用主题和正文打开默认邮件程序?

不幸的是,这是一个用Java编写的客户端应用程序,而不是网站。

我希望这能以跨平台的方式工作(这意味着Windows和Mac,对不起Linux)。我很高兴在Windows中执行VBScript,或在OS X中执行AppleScript。但我不知道这些脚本应该包含什么。我很乐意执行用户的默认程序,而不仅仅是搜索Outlook或其他任何内容。

在OS X中,我尝试执行命令:

open mailto:?subject=MySubject&body=TheBody

使用%20替换空格需要使用网址转义。

已更新在Windows上,您必须玩各种游戏才能使start正常运行。这是正确的Java咒语:

class Win32 extends OS {
    public void email(String subject, String body) throws Exception {
        String cmd = "cmd.exe /c start \"\" \"" + formatMailto(subject, body) + "\"";
        Runtime.getRuntime().exec(cmd);
    }
}

9 个答案:

答案 0 :(得分:10)

在Java 1.6中,您有一种打开平台默认邮件程序的标准方法: the Desktop.mail(URI) method。URI可用于设置邮件的所有字段(发件人,收件人,正文,主题)。 您可以在Using the Desktop API in Java SE 6

上查看Java 1.6中桌面集成的完整示例

答案 1 :(得分:4)

<强> 1。添加主题行

您可以在电子邮件地址后面添加以“?subject = ”开头的主题,预先填写电子邮件中的主题行。

现在链接变为:

<a href="mailto:someone@yoursite.com?subject=Mail from Our Site">Email Us</a> 

<强> 2。发送给多个收件人

邮件可以作为碳副本(cc)或密件副本(密送)发送给其他收件人。

这是以类似的方式完成的,方法是在初始地址后面加上“?cc = someoneelse@theirsite.com ”。

所以链接看起来像这样:

<a href="mailto:someone@yoursite.com?cc=someoneelse@theirsite.com">Email Us</a>
如果您希望发送盲目复印件,则可以简单地将cc替换为cc。

如果您在具有不同主题的页面上有链接,这将非常有用。您可能会将每个页面上的电子邮件发送给公司中的相应人员,但也会将所有邮件的副本发送到中央地址。

您当然可以指定多个其他收件人,只需用逗号分隔收件人列表即可。

<a href="mailto:someone@yoursite.com?cc=someoneelse@theirsite.com, another@thatsite.com, me@mysite.com">Email Us</a> 

来自Getting More From 'mailto',现在是404s。我从waybackmachine中检索了内容。

第3。合并代码

您可以通过添加'&amp;'来组合上面的各种代码。每个人之间。

因此添加

me@mysite.com?subject=Hello&cc=you@yoursite.com&bcc=her@hersite.com

会向我,您和她发送一封主题为“您好”的电子邮件。

<强> 4。撰写电子邮件

您也可以通过邮件的开头预填邮件正文,或者如果您愿意,也可以写完整条邮件!要在电子邮件正文中添加一些内容,它就像上面一样简单 - 电子邮件地址后面的'?body = '。然而,格式化该电子邮件可能有点棘手。要在单词之间创建空格,您必须使用十六进制代码 - 例如每个单词之间的“%20 ”,并创建新行将意味着添加“%0D ”。类似地, $ 符号等符号需要以十六进制代码编写。

如果您还希望添加主题行并将副本发送给多个收件人,则可能会造成很长且难以编写的代码。

它会向三个人发送一条消息,主题和消息已填写,您需要做的就是添加您的姓名。

看看代码吧!

<a href="mailto:abbeyvet@outfront.net?CC=spooky@outfront.net
&BCC=thomasbrunt@outfront.net&Subject=Please%2C%20I%20insist
%21&Body=Hi%0DI%20would%20like%20to%20send%20you%20
%241000000%20to%20divide%20as%20you%20see%20fit%20among
%20yourselves%20and%20all%20the%20moderators.%0DPlease%
20let%20me%20know%20to%20whom%20I%20should%20send
%20the%20check.">this link</a> 

注意:我找到的原始源URL现在为404,所以我grabbed to content from waybackmachine并将其发布在此处,以免丢失。此外,OP表示它不适用于网站,这就是这些示例,但其中一些技术可能仍然有用。

答案 2 :(得分:4)

start在Windows中运行正常(见下文)。我会使用Java内置的UrlEscape,然后再运行'+'字符的第二次替换。

start mailto:"?subject=My%20Subject&body=The%20Body"

答案 3 :(得分:3)

  

我不得不重新实施URLencode   因为Java会使用+作为空间   和邮件从字面上理解了这些。

我不知道Java是否有一些用于urlencoding字符串的内置方法,但是这个链接http://www.permadi.com/tutorial/urlEncoding/显示了一些最常见的字符编码:

;       %3B
?       %3F
/       %2F
:       %3A
#       %23
&       %24
=       %3D
+       %2B
$       %26
,       %2C
space   %20 or +
%       %25
<       %3C
>       %3E
~       %7E
%       %25

答案 4 :(得分:3)

  

我不知道Java是否有一些用于urlencoding字符串的内置方法,但是这个链接http://www.permadi.com/tutorial/urlEncoding/显示了一些最常见的字符编码:

对于编码mailto URI hnames和hvalues的百分比,我使用http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#encoding处的规则。在http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#implementations下,有一个可能有用的Java示例。

基本上,我使用:

private String encodex(final String s) {
    try {
        return java.net.URLEncoder.encode(s, "utf-8").replaceAll("\\+", "%20").replaceAll("\\%0A", "%0D%0A");
    } catch (Throwable x) {
        return s;
    }
}

传入的字符串应该是一个带\ r \ n的字符串,并且stray \ r已经标准化为\ n。

另请注意,只要在上面的异常上返回原始字符串,只有在传递给命令行的mailto URI参数被正确转义并引用时才会安全。

在Windows上意味着:

  1. 引用这个论点。
  2. 使用\。
  3. 撤消任何“引号内”
  4. 使用\。
  5. 转义字符串前面的任何\或字符串结尾

    此外,在Windows上,如果您正在使用Java中的UTF-16字符串,则可能需要使用ShellExecuteW来“打开”mailto URI。如果不这样做并返回s异常(某些hvalue没有完全百分比编码,你可能最终缩小一些宽字符并丢失信息。但是,并非所有邮件客户端都接受unicode参数,所以理想情况下,你想要使用ShellExecute传递正确的percent-encoded-utf8 ascii参数。

    与'start'类似,带有“open”的ShellExecute应该在默认客户端中打开mailto URI。

    不确定其他操作系统。

答案 5 :(得分:3)

切勿在Mac OS X或任何其他操作系统上使用Runtime.exec(String)。如果你这样做,你将不得不弄清楚如何正确引用所有参数字符串等等;这是一种痛苦,非常容易出错。

相反,使用Runtime.exec(String[])来获取已经分开的参数数组。这几乎适用于所有用途。

答案 6 :(得分:2)

Mailto不是一条糟糕的路线。但正如您所提到的,您需要确保它编码正确。

使用mailto的主要问题是断行。使用%0A表示回车符,%20表示空格。

另外,请记住,mailto被认为与排序的URL相同,因此对长度具有相同的限制。看到 http://support.microsoft.com/kb/208427,请注意最长网址长度为2083个字符。这也确认了mailto 在本文中:http://support.microsoft.com/kb/279460/en-us。此外,一些邮件客户端也可以有一个限制(我相信旧版本的Outlook Express有一个更小的限制,如483个字符或其他东西。如果你希望有一个更长的字符串,那么你需要看看替代品

顺便说一下,只要你可以从Java中发出一个命令(我不知道你是否可以,因为我不做Java),你不应该诉诸于踢出一个脚本来做到这一点。 / p>

答案 7 :(得分:1)

您可以使用此...

main(string[] args){    
String forUri = String.format("mailto:?subject=%s&body=%s",  urlEncode(sub), urlEncode(mailBody));
                        Desktop.getDesktop().mail(new URI(forUri));
}

private static final String urlEncode(String str) {
        try {
            return URLEncoder.encode(str, "UTF-8").replace("+", "%20");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

还用于格式化阅读A simple way of sending emails in Java: mail-to links

答案 8 :(得分:0)

我已经实现了这一点,它在OS X上运行良好。(Ryan提到的最大URL长度尚未编纂。)

public void email(String subject, String body) throws Exception {
    String cmd = "open mailto:";        
    cmd += "?subject=" + urlEncode(subject);
    cmd += "&body=" + urlEncode(body);
    Runtime.getRuntime().exec(cmd);
}

private static String urlEncode(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        if (Character.isLetterOrDigit(ch)) {
            sb.append(ch);
        }
        else {
            sb.append(String.format("%%%02X", (int)ch));
        }
    }
    return sb.toString();
}

我不得不重新实现URLencode,因为Java会使用+作为空间而Mail会从字面上理解这些内容。还没有在Windows上测试过。