[英]escape mailto link in php
我的 php 代码中有一个 mailto 链接,即
<a href="mailto:email@domain.tld?subject=<?php rawurlencode('Travels & Tours'); ?>&body=this is body">link text</a>
问题是当它出现在电子邮件客户端时,例如 Outlook,主题行文本更改为Travels & Tours
Travels & Tours
严格来说,您应该使用urlencode()
对 URL 参数值进行 URL 编码,而不是使用rawurlencode()
来编码 URL 的 URL-path 部分。 虽然这两个函数产生相似的结果,但还是有区别的。 URL 的不同部分有不同的限制。 值得注意的是(从您的示例中),空格在 URL 参数值中被编码为+
,而它们在 URL 路径中被编码为%20
(尽管这在大多数情况下并不重要)。
除了对 URL 进行 URL 编码以发出有效请求外,您可能还需要对整个 HTML 属性进行 HTML 实体编码以使其有效(不过,HTML5 不太严格)。 (然而,浏览器非常宽容,并且可能会根据需要自动对 URL 进行 HTML 实体编码。但是,这可能并不总是正确运行,出于安全原因,您应该确保生成的任何 HTML 都已经正确编码。)
因此,理想情况下,您应该执行以下操作:
<?php
$subject = urlencode('Travels & Tours');
$body = urlencode('body is body');
$url = htmlspecialchars("mailto:email@domain.tld?subject=$subject&body=$body");
?>
<a href="<?=$url?>">link text</a>
这将产生以下 HTML:
<a href="mailto:email@domain.tld?subject=Travels+%26+Tours&body=body+is+body">link text</a>
但是,这可能仍然无法解决您的问题,并且可能取决于浏览器/电子邮件客户端 - 因为 URL 参数在被电子邮件客户端处理之前必须是正确的 HTML 实体和 URL 解码。 以上对我使用 Gmail 可以正常工作,但您的原始示例也是如此(一旦 PHP 语法得到纠正)。
电子邮件客户端在它们可以处理的内容方面相对基本,因此通常是您需要处理的电子邮件客户端。 就个人而言,我会避免在电子邮件主题中使用&
开始。
即
<a href="mailto:email@domain.tld?subject=<?php html_entity_decode(Travels & Tours) ?>&body=this is body">link text</a>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.