如何以跨平台方式打开带有主题和正文的默认邮件程序?
如何以跨平台方式打开带有主题和正文的默认邮件程序?
不幸的是,这是针对用Java编写的客户端应用程序,而不是网站。
我希望它可以跨平台的方式工作(这意味着Windows和Mac,对不起Linux)。我很高兴在Windows中执行VBScript,在OS X中执行AppleScript。但是我不知道这些脚本应该包含什么。我希望执行用户的默认程序,而不是仅搜索Outlook或者其他内容。
在OS X中,我尝试执行以下命令:
open mailto:?subject=MySubject&body=TheBody
需要使用URL转义以将%20替换为空格。
在Windows上更新,我们必须玩各种游戏才能使"开始"正确运行。这是正确的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); } }
解决方案
回答
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),我们就不必踢出脚本来执行此操作。
回答
1.添加主题行
我们可以在电子邮件地址之后添加主题,并在主题前添加"?subject =",以预填充主题行。
因此,链接现在变为:
<a href="mailto:[email protected]?subject=Mail from Our Site">Email Us</a>
2.发送给多个收件人
邮件可以复本(cc)或者密抄本(bcc)发送给其他收件人。
可以通过类似的方式完成,方法是在初始地址后添加" [email protected]"。
因此,链接如下所示:
<a href="mailto:[email protected][email protected]">Email Us</a>
如果我们要发送密件抄送,可以将cc替换为密件抄送。
如果我们在页面上有不同主题的链接,这将非常有用。我们可能会在每一页上将电子邮件发送给公司中的适当人员,但同时还会将所有邮件的副本发送到中心地址。
当然,我们可以指定多个其他收件人,只需用逗号分隔收件人列表即可。
<a href="mailto:[email protected][email protected], [email protected], [email protected]">Email Us</a>
源自" 404"从" mailto"获得更多信息。我从waybackmachine检索了内容。
3.组合码
我们可以通过在每个代码之间添加一个"&"来组合上面的各种代码。
因此增加
[email protected]?subject=Hello&[email protected]&[email protected]
会向我(我们和她)发送主题为" Hello"的电子邮件。
4.写电子邮件
我们还可以在邮件正文中预填邮件的开头,或者根据需要写完整的邮件!要将一些内容添加到电子邮件的正文中,再次像在电子邮件地址后的"?body ="上方一样简单。但是,格式化电子邮件可能有些棘手。要在单词之间创建空格,我们将必须在每个单词之间使用十六进制代码,例如'%20',而创建新行将意味着添加'%0D'。类似地,诸如$符号的符号将需要用十六进制代码编写。
如果我们还希望添加一个主题行并将副本发送给多个收件人,则可能会使代码写起来很长且很困难。
它将向三个人发送一条消息,并填写主题和消息,我们所要做的就是添加姓名。
只需看一下代码!
<a href="mailto:[email protected][email protected] &[email protected]&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抓取了内容并将其张贴在此处,因此不会丢失。另外,OP指出这些示例不是针对网站的,但是其中某些技术可能仍然有用。
回答
我已经实现了这一点,并且在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上进行测试。
回答
I had to re-implement URLencode because Java's would use + for space and Mail took those literally.
我不知道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
回答
在Windows中,"启动"可以正常工作(请参见下文)。我将使用Java内置的UrlEscape,然后仅对'+'字符进行第二次替换。
start mailto:"?subject=My%20Subject&body=The%20Body"
回答
I don't know if Java has some built-in method for urlencoding the string, but this link http://www.permadi.com/tutorial/urlEncoding/ shows some of the most common chars to encode:
要对mailto URI的hname和hvalue进行百分比编码,请使用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的字符串,并且杂散\ r已经被标准化为\ n。
还要注意,仅当我们在命令行中传递的mailto URI参数正确地转义并加引号时,才在上述异常中返回原始字符串才是安全的。
在Windows上,这意味着:
- 引述论点。
- 用\括住引号内的任何""。
- 用" "转义""之前或者字符串末尾的任何" "。
另外,在Windows上,如果像Java中那样处理UTF-16字符串,则可能要使用ShellExecuteW来"打开" mailto URI。如果不这样做,则返回一个s异常(其中某些hvalue不能完全按百分比编码),则最终可能会缩小一些宽字符并丢失信息。但是,并非所有邮件客户端都接受unicode参数,因此理想情况下,我们需要通过ShellExecute传递正确百分比编码的utf8 ascii参数。
像"开始"一样,带有" open"的ShellExecute应该在默认客户端中打开mailto URI。
不确定其他操作系统。
回答
切勿在Mac OS X或者任何其他操作系统上使用Runtime.exec(String)
。如果这样做,则必须弄清楚如何正确引用所有参数字符串等等。这是一个痛苦并且非常容易出错。
而是使用Runtime.exec(String [])
,它接受一个已经分隔的参数数组。这实际上适用于几乎所有用途。
回答
在Java 1.6中,我们可以使用标准方法打开平台的默认邮件程序:
Desktop.mail(URI)方法。URI可用于设置邮件的所有字段(发件人,收件人,正文,主题)。
我们可以在Java SE 6中使用桌面API上查看Java 1.6中桌面集成的完整示例。