2012-01-20 13 views
15

Mam link mailto: na stronie tutaj, w tym parametrów subject= i body=, ale nie jestem pewien, jak poprawnie uciec danych w parametrach.Jaki jest poprawny sposób na ucieczkę ciąg dla łącza mailto

Strona jest zakodowana w utf-8, więc przypuszczam, że wszystkie specjalne znaki, takie jak niemieckie umlauty, powinny być zakodowane w utf-8 reprezentacjach również dla adresu URL?

Obecnie używam rawurlencode() jak urlencode() by wstawić + znaków we wszystkich miejscach, w których obowiązuje powinny były, ale jestem pewien, czy jest to właściwy sposób, aby to zrobić.

+0

bym, że, że albo 'rawurlencode()' O r 'urlencode()' powinno wykonać zadanie - przeglądarka powinna poprawnie zdekodować każdą wersję przed przekazaniem jej do klienta poczty. Można również utworzyć tablicę parametrów i użyć ['http_build_query()'] (http://php.net/manual/en/function.http-build-query.php) - ciąg zapytania jest w tym samym formacie . Upewnij się, że przekazałeś wynikowy ciąg z dowolnej z tych opcji przez ['htmlspecialchars()'] (http://php.net/manual/en/function.htmlspecialchars.php), jeśli ma on być używany na stronie HTML ... – DaveRandom

+0

To działa tak, jak we wszystkich przypadkach, o których myślałem, ale może nie jest to właściwy sposób, a moja przeglądarka/klient poczty poprawnie rozpoznaje i rozwiązuje ten błąd, dlatego jest proszony, żeby być pewnie :) – bardiir

+0

Mogą zaistnieć sytuacje, w których jedna będzie działać, a druga nie, ale jeśli tak jest, to z winy przeglądarki nie będzie interpretowana poprawnie. Jeśli jest jakiś znany błąd z jednym lub drugim, oczywiście najlepiej go omijać, ale nie znam żadnej nowoczesnej przeglądarki, która spowodowałaby taki podstawowy błąd - jeśli taki istnieje, prawdopodobnie będzie tak słaby, bezużyteczny. – DaveRandom

Odpowiedz

13

Po prostu potrzebujesz rawurlencode() łącza na końcu adresu e-mail zgodnie ze standardami W3C.

Jest to przykład na podręczniku PHP dla urlencode (poszukiwanie mailto na tej stronie): http://php.net/manual/en/function.urlencode.php

+7

Należy zauważyć, że "rawurlencode()" ucieknie ampersandom do &, którego większość klientów pocztowych nie będzie poprawnie dekodować. % 26 powinno być użyte do zastąpienia tych ampersandów przy użyciu czegoś takiego jak 'str_replace ('&', '% 26', rawurlencode ($ subject))' –

+2

@dev_row z tym kodem str_replace '&' zostanie zmienione na '% 26 amp%3B'. Najpierw ** musisz najpierw zamienić '$ amp;' na '&', a następnie zrobić rawurlencode(). Również dlaczego nie używać 'htmlspecialchars_decode()' zamiast str_replace? – Duncanmoo

+0

Właśnie dodałem odpowiedź, która pokazuje przykład, używając tej odpowiedzi i komentarzy: 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

podstawie zaakceptowanych odpowiedzi i to uwagi, to właśnie użyłem:

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

przykład:

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

Nie musisz "zwracać $ text;" na końcu funkcji? – Rober

+0

Dzięki @Rober. Zaktualizowałem teraz swoją odpowiedź. –

Powiązane problemy