繁体   English   中英

如何(正确)在Java中创建mailto URL(URI)?

[英]How to (correctly) create mailto URL (URI) in Java?

鉴于:

String email1 = "simple@example.org";

// legal email address according to wikipedia [1]
String email2 = "\"()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org";

创建mailto的最佳/正确方法是什么:URI(以String对象的形式)?

我试过了:

String uri = new URI("mailto", the_email_address, null).toString();

这是我得到的最接近的,但它没有在电子邮件地址的本地部分编码问号(?),但根据RFC 6068它应该。 它也没有在RFC中的示例中失败,例如“not@me"@example.org或者不太可能address = example.com

[1] Valid_email_addresses示例

PS:还有一些有用的信息应该加上mailto:超链接吗?


我为此解决了这个问题:

import org.apache.http.client.utils.URIBuilder;
// from Apache HttpClient
// maven group: org.apache.httpcomponents artifact: httpclient

String emailURL = new URIBuilder().setScheme("mailto").setPath(the_email_address).toString();

你必须手动百分比编码/逃避? &

String email2 = "\"()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org";
String uri2 = (new URI("mailto", email2, null)).toString().replace("?", "%3F").replace("&", "%26");

所以似乎? &符号未在URI中正确转义。 什么事后? 在URI中被忽略,因为该符号是为URL中的“查询字符串”保留的。 参考这里

根据这个和参考文献,我们需要逃避&为好。 出于某种原因,Java并没有为我们这样做。 事实上,RFC 6068甚至声明:

可以出现的许多字符必须是百分比编码的。 这些是根据[STD66]不能出现在URI中的字符以及“%”(因为它用于百分比编码)和gen-delims中除“@”和“:”之外的所有字符(即, “/”,“?”,“#”,“[”和“]”)。 在sub-delims中的字符中,至少以下内容也必须进行百分比编码:“&”,“;”和“=”。

修复它的方法(有点像黑客,但它的工作原理)是使用%后跟符号的2位ASCII十六进制值来手动转义这些字符。 参考这个

我通过将生成的字符串粘贴到Chrome中进行测试,并通过电子邮件正确打开了我的默认电子邮件

"()<>[]:,; @\"!#$%&'*+-/=?^_`{}| ~.a"@example.org

更多研究

所以Java的URI类似乎使用了RFC 2396 ,它指出:

如果URI组件的数据与保留的目的冲突,则必须在形成URI之前转义冲突的数据。

  reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 

上面的“保留”语法类指的是URI中允许的那些字符,但在通用URI语法的特定组件中可能不允许这些字符;

您将不得不使用Apache Commons URI构建器

该值预计未转义,可能包含非ASCII字符。

你不能直接使用java uri类的 Java URI doc
所有标点符号都保留,字符串“?/ [] @”中的标点符号保留

Java的URI类使用RFC 2396 ,其中规定:如果URI组件的数据与保留的目的相冲突,则必须在形成URI之前转义冲突的数据。

  reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 

您可以使用java.net.URLEncoder对user_name进行编码,然后使用编码的用户名创建URI String uri = new URI("mailto", the_email_address, null).toString(); 要么
您可以手动百分比编码/转义? 和&。

 String email2 = "\\"()<>[]:,;@\\\\\\"!#$%&'*+-/=?^_`{}| ~.a\\"@example.org"; String uri2 = (new URI("mailto", email2, null)).toString().replace("?", "%3F").replace("&", "%26"); 

在JavaScript中,您可以使用encodeURI()函数。 PHP具有rawurlencode()函数,ASP具有Server.URLEncode()函数。


您可能希望使用URI.create(String uri)静态方法来创建mailto uri,而不是使用“new”构造函数。 例如,这会返回一个有效的URI(我使用的是jdk 7):

URI.create("mailto:john?doe@foo.bar.com");

我希望它有所帮助。

干杯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM