簡體   English   中英

在php中轉義mailto鏈接

[英]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 &amp; Tours Travels &amp; 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&amp;body=body+is+body">link text</a>

但是,這可能仍然無法解決您的問題,並且可能取決於瀏覽器/電子郵件客戶端 - 因為 URL 參數在被電子郵件客戶端處理之前必須是正確的 HTML 實體和 URL 解碼。 以上對我使用 Gmail 可以正常工作,但您的原始示例也是如此(一旦 PHP 語法得到糾正)。

電子郵件客戶端在它們可以處理的內容方面相對基本,因此通常是您需要處理的電子郵件客戶端。 就個人而言,我會避免在電子郵件主題中使用&開始。

使用html_entity_decode

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM