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

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

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

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

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

open mailto:?subject=MySubject&body=TheBody 

URL转义需要用%20replace空格。

更新在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); } } 

Solutions Collecting From Web of "如何以跨平台的方式打开主题和正文的默认邮件程序?"

在Java 1.6中,您可以使用标准方式打开平台的默认邮件程序: Desktop.mail(URI)方法 .URI可用于设置邮件的所有字段(发件人,收件人,正文,主题)。 您可以在Java SE 6中的“使用桌面API”中查看 Java 1.6中桌面集成的完整示例

start在Windows中工作正常(见下文)。 我会使用内建在UrlEscape中的Java,然后运行第二个“+”字符替换。

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

1.添加主题行

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

所以现在链接变成:

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

2.发送到多个收件人

邮件可以发送到其他收件人作为抄送(cc)或抄送抄送(bcc)。

这是以类似的方式完成的,在首字母后面加上'? cc = someoneelse@theirsite.com '。

所以链接如下所示:

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

cc可以简单地由bcc取代,如果你想发送盲目的抄送。

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

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

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

从现在404s的“mailto”中获得更多信息 。 我从waybackmachine中获取内容。

3.组合代码

您可以通过在每个代码之间添加一个“&”来组合上面的各个代码位。

从而增加

 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,所以我抓住了从waybackmachine的内容,并张贴在这里,所以它不会迷路。 此外,业务执行部门表示,这不是一个网站,这是这些例子是什么,但其中一些技术可能仍然有用。

我不得不重新实现URLencode,因为Java将使用+作为空格,Mail从字面上使用这些。

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

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

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

对于百分比编码的mailto URI hnames和hvalues,我使用http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#encoding中的规则&#x3002; 在http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#implementations&#x4E0B; ,有一个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的字符串,\ r \ n已经标准化为\ n。

还要注意,仅仅在像上面这样的异常时返回原始字符串是安全的,只要你在命令行传递的mailto URI参数被正确地转义和引用。

在这意味着:

  1. 引用参数。
  2. 在\引用里面跳出任何“。
  3. 用“\”前面的“\”或字符串的结尾来回避。

另外,在windows上,如果你正在处理像Java一样的UTF-16字符串,你可能想使用ShellExecuteW来“打开”mailto URI。 如果你不这样做,并返回一个例外(某些hvalue不完全百分比编码,你可能会缩小一些宽字符和丢失的信息。但是,并不是所有的邮件客户端接受unicode参数,所以理想的情况下,你想用ShellExecute传递正确的percent-encoded-utf8 ascii参数。

像“开始”一样,带有“open”的ShellExecute应该打开默认客户端中的mailto URI。

不知道其他操作系统的。

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

相反,使用Runtime.exec(String[]) ,它接受一个已经分离的参数数组。 这对于几乎所有的用途来说都更合适。

Mailto不是一个不好的路线。 但正如你所提到的,你需要确保编码正确。

使用mailto的主要问题是突破线路。 回车使用%0A,空格使用%20。

另外,请记住,mailto被认为是相同的排序的URL,因此将有相同的长度限制。 请参阅http://support.microsoft.com/kb/208427 ,注意最大URL长度为2083个字符。 这也是mailto以及本文中确认: http : //support.microsoft.com/kb/279460/en-us 。 另外,一些邮件客户端也可以有一个限制(我相信旧版本的Outlook Express有一个像483个字符或者更小的东西的限制,如果你希望有一个比这更长的字符串,那么你需要看看备选方案。

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

你可以用这个…

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

也用于格式化读取使用Java发送电子邮件的简单方法:邮件链接

我已经实现了这一点,它在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上测试过。