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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

鉴于:

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();
提问于
用户回答回答于

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

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

您不能直接使用java uri class 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()功能。

用户回答回答于

你必须手动百分比编码/转义?&

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-delim中的字符(即, “/”,“?”,“#”,“[”和“]”)。在子分隔符中的字符中,至少以下内容也必须进行百分比编码:“&”,“;”和“=”。

修复它的方法(有点破解,但它有效)是使用%后面的2位ASCII码十六进制值为符号手动转义这些字符。引用这个

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

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

所以看起来Java的URI类使用RFC 2396,其中规定:

如果URI组件的数据与保留目的冲突,那么冲突数据必须在形成URI之前转义。 reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 上面的“保留”类的语法是指被允许一个URI内的那些字符,但其可能不通用URI语法的特定组件内被允许;

扫码关注云+社区