如何以跨平台方式使用主题和正文打开默认邮件程序?
不幸的是,这是一个用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);
}
}
答案 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上意味着:
此外,在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上测试过。