代码之家  ›  专栏  ›  技术社区  ›  Frank Krueger

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

  •  11
  • Frank Krueger  · 技术社区  · 16 年前

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

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

    我希望它以跨平台的方式工作(这意味着Windows和Mac,对不起,Linux)。我很乐意在Windows中执行vbscript,或者在OSX中执行applescript。但是我不知道这些脚本应该包含什么。我希望执行用户的默认程序,而不是仅仅搜索Outlook或其他程序。

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

    open mailto:?subject=MySubject&body=TheBody
    

    需要使用URL转义来替换空格 %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 回复  |  直到 12 年前
        1
  •  10
  •   rotabla    16 年前

    在爪哇1.6中,您有一个开放平台的默认邮件收件人: the Desktop.mail(URI) method .uri可用于设置邮件的所有字段(发件人、收件人、正文、主题)。 您可以在Java 1.6上检查桌面集成的完整示例。 Using the Desktop API in Java SE 6

        2
  •  4
  •   travis    16 年前

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

    start mailto:"?subject=My%20Subject&body=The%20Body"
    
        3
  •  4
  •   Dhaust    12 年前

    1。添加主题行

    您可以在电子邮件的主题行前加上' ?主题= '在电子邮件地址之后。

    因此链接现在变成:

    <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>
    

    如果你想发送密件抄送,密件抄送可以简单地用密件抄送代替。

    如果你在不同主题的页面上有链接,这会非常有用。你可能会让每一页的邮件都发送给公司中的合适的人,但同时也会将所有邮件的副本发送到中心地址。

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

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

    来源于 Getting More From 'mailto' 现在是404。我从Waybackmachine中检索到内容。

    三。组合码

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

    从而增加

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

    会给我,你和她发一封邮件,主题是“你好”。

    4。写电子邮件

    您还可以在邮件正文前加上邮件开头,或者根据需要编写整个邮件!要在电子邮件正文中添加一些内容,同样简单,如上所述-- ?身体= '在电子邮件地址之后。然而,格式化电子邮件可能有点棘手。要在单词之间创建空格,必须使用十六进制代码-例如' % 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现在是404ing,所以我 grabbed to content from waybackmachine 把它贴在这里,这样它就不会迷路。另外,OP声明它不是为一个网站,这就是这些例子,但其中一些技术可能仍然有用。

        4
  •  3
  •   Ryan Farley    16 年前

    我必须重新执行URLENCODE 因为Java会使用+空间 邮件把这些字面上记下来了。

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

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

    我不知道Java是否有一些URL编码的内置方法,但是这个链接 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和杂散\r已经规范化为\n。

    还要注意,只有在命令行上传递的mailto-uri参数正确转义和引用后,才可以安全地返回上述异常的原始字符串。

    在窗户上,这意味着:

    1. 引用论点。
    2. 在引号内用\转义任意“”。
    3. 用\转义任何在“前面或字符串末尾的\。

    另外,在Windows上,如果您处理的是像Java那样的UTF 16字符串,那么您可能希望使用SHILRealExuTew来“打开”邮件到URI。如果不这样做,并返回一个异常的s(其中一些hvalue不是完全百分比编码的,那么最终可能会缩小一些宽字符的范围并丢失信息。但是,并非所有邮件客户机都接受Unicode参数,因此理想情况下,您希望通过ShellExecute传递正确百分比编码的utf8-ascii参数。

    与“start”类似,shellexecute和“open”应该在默认客户端中打开mailto-uri。

    不确定其他操作系统。

        6
  •  3
  •   Chris Hanson    16 年前

    从不使用 Runtime.exec(String) 在Mac OS X或任何其他操作系统上。如果你这样做了,你就必须弄清楚如何正确地引用所有的参数字符串等等;这是一种痛苦,而且很容易出错。

    相反,使用 Runtime.exec(String[]) 它接受一个已经分隔的参数数组。这实际上更适合于所有用途。

        7
  •  2
  •   Ryan Farley    16 年前

    发邮件不是一个糟糕的选择。但是正如您提到的,您需要确保它是正确编码的。

    使用mailto的主要问题是换行。回车时使用%0A,空格时使用%20。

    此外,请记住,mailto被视为与排序的URL相同,因此在长度上也有相同的限制。见 http://support.microsoft.com/kb/208427 ,注意最大URL长度为2083个字符。这也是邮件确认的 在本文中: http://support.microsoft.com/kb/279460/en-us . 此外,有些邮件客户端也有一个限制(我相信旧版本的Outlook Express有一个更小的限制,比如483个字符或其他一些。如果您希望有一个比这更长的字符串,那么您需要寻找替代方案。

    顺便说一下,只要你能从Java中弹出一个命令(我不知道你是否可以,因为我不做Java),你就不必诉诸于脚本。

        8
  •  1
  •   NoNaMe    12 年前

    你可以用这个…

    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

        9
  •  0
  •   Frank Krueger    16 年前

    我已经实现了这一点,并且它在OSX上工作得很好(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();
    }
    

    因为Java的使用,我不得不重新实现URLencode。 + 对于空间和邮件来说,这些都是字面意义上的。尚未在Windows上测试。