[英]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.