2012-01-20 2 views
15

У меня есть ссылка mailto: на странице здесь, включая параметры subject= и body=, но я не уверен, как правильно избежать данных в параметрах.Каков правильный способ избежать строки для ссылки mailto

Эта страница кодируется в utf-8, поэтому, я думаю, что все специальные символы, такие как немецкие умлауты, должны быть закодированы в utf-8 изображения для URL-адреса тоже?

На данный момент я использую rawurlencode(), как urlencode() бы вставить + символы во всех местах, где пробелы должны были быть, но я не уверен, если это правильный способ сделать это.

+0

я бы подумал, что либо 'rawurlencode()' о r 'urlencode()' должен выполнять задание - браузер должен правильно декодировать любую версию перед передачей ее почтовому клиенту. Вы также можете создать массив параметров и использовать ['http_build_query()'] (http://php.net/manual/en/function.http-build-query.php) - строка запроса находится в том же формате , Убедитесь, что вы также передаете полученную строку из любого из этих параметров через ['htmlspecialchars()'] (http://php.net/manual/en/function.htmlspecialchars.php), если она должна использоваться на странице HTML ... – DaveRandom

+0

Хорошо, что это работает во всех случаях, о которых я думал, но, возможно, это неправильный способ сделать это, и мои браузеры/почтовый клиент просто правильно распознают и обходят эту ошибку, поэтому спрашивают, просто чтобы быть конечно :) – bardiir

+0

Могут быть ситуации, когда один будет работать, а другой - нет, но если это так, то ошибкой браузера является неправильная его интерпретация. Если есть известная ошибка с той или другой, очевидно, лучше ее избегать, но я не знаю какого-либо современного браузера, который бы сделал такую ​​фундаментальную ошибку - если она есть, она, вероятно, будет настолько бедна, чтобы быть непригодным для использования. – DaveRandom

ответ

13

Вам нужно только rawurlencode() ссылку в конце адреса электронной почты в соответствии со стандартами W3C.

Существует пример на Руководство по PHP для UrlEncode (поиск MAILTO на этой странице): http://php.net/manual/en/function.urlencode.php

+7

Обратите внимание, что 'rawurlencode()' будет выходить из амперсандов до &, которые большинство почтовых клиентов не будут должным образом декодировать. % 26 следует использовать для замены этих амперсандов, используя что-то вроде 'str_replace ('&', '% 26', rawurlencode ($ subject))' –

+2

@dev_row с этим кодом str_replace '&' будет изменен на '% 26 amp%3B'. Вы ** сначала ** должны заменить '$ amp;' на '&', а затем сделать rawurlencode(). Также почему бы не использовать 'htmlspecialchars_decode()', а не str_replace? – Duncanmoo

+0

Я только что добавил ответ, в котором показан пример использования этого ответа и комментариев: https://stackoverflow.com/a/46865401/1617737 –

0
function MailToUrl ($strUser, $strServer, $queryParams = null) { 
    $strUrl = 'mailto:' . rawurlencode($strUser) . '@' . rawurlencode($strServer); 
    if ($queryParams) { 
     $strUrl .= '?' . http_build_query($queryParams, null, null, PHP_QUERY_RFC3986); 
    } 
    return $strUrl; 
} 

function MailToLink ($strUser, $strServer, $queryParams = null) { 
    $strUrl = MailToUrl($strUser, $strServer, $queryParams); 

    $strEscapedUrl = htmlspecialchars($strUrl); 
    $strVisibleUrl = htmlspecialchars(rawurldecode($strUrl)); 

    $strLink = "<a href='{$strEscapedUrl}'>{$strVisibleUrl}</a>"; 

    return $strLink; 
} 

print (MailToLink('"very.(),:;<>[]\".VERY.\"[email protected]\ \"very\".unusual"', 'test.com', ['subject'=>'this & \ that/'])); 
print (MailToLink('müller', 'test.com', ['subject'=>'Einflußgröße'])); 
2

на основе принятых ответов и это комментарии, это то, что я использовал:

function format_text_for_mailto_param($text) { 
    return rawurlencode(htmlspecialchars_decode($text)); 
} 

Пример:

$email = "[email protected]"; 
$subject = "Test Subject"; 
<a href="mailto:' . $email . '?subject=' . format_text_for_mailto_param($subject) . '">send email</a> 
+1

Вам не нужно возвращать $ text; 'в конце функции? – Rober

+0

Спасибо @Rober. Теперь я обновил свой ответ. –

Смежные вопросы