2012-01-20 11 views
15

Tengo un enlace mailto: aquí, incluidos los parámetros subject= y body=, pero no estoy seguro de cómo escapar correctamente de los datos en los parámetros.¿Cuál es la forma correcta de escapar de una cadena para un enlace de mailto?

La página está codificada en utf-8 así que supongo que todos los caracteres especiales como umlauts alemanes deberían codificarse en representaciones de utf-8 también para la URL.

Por el momento estoy usando rawurlencode() como urlencode() insertaría + caracteres en todos los lugares en los espacios deberían haber estado, pero no estoy seguro si esta es la forma correcta de hacerlo.

+0

, habría pensado que, o bien 'rawurlencode()' O r 'urlencode()' debería hacer el trabajo: el navegador debe decodificar correctamente cualquier versión antes de pasarla al cliente de correo. También podría crear una matriz de parámetros y usar ['http_build_query()'] (http://php.net/manual/en/function.http-build-query.php) - la cadena de consulta está en el mismo formato . Asegúrese de pasar también la cadena resultante de cualquiera de esas opciones a través de ['htmlspecialchars()'] (http://php.net/manual/en/function.htmlspecialchars.php) si se va a utilizar en una página HTML. ... – DaveRandom

+0

Bueno, funciona así en todos los casos de uso en los que pensé, pero tal vez no sea la forma correcta de hacerlo y mi navegador/cliente de correo solo reconoce y soluciona correctamente ese error, por eso se lo pide, solo para ser seguro :) – bardiir

+0

Puede haber situaciones donde una funcionará y la otra no, pero si este es el caso, entonces sería culpa del navegador por no interpretarlo correctamente. Si hay un error conocido con uno u otro, obviamente es mejor evitarlo, pero no conozco ningún navegador moderno que cometa un error tan fundamental, si es que hay uno, probablemente será tan pobre como para serlo. inutilizable de todos modos. – DaveRandom

Respuesta

13

Sólo necesita rawurlencode() el enlace al final de la dirección de correo electrónico según los estándares W3C.

Hay un ejemplo en el Manual de PHP para urlencode (búsqueda de mailto en esa página): http://php.net/manual/en/function.urlencode.php

+7

Tenga en cuenta que 'rawurlencode()' escapará a & amp; ampersands a &, que la mayoría de los clientes de correo no decodificarán correctamente. % 26 se debe usar para reemplazar estos símbolos y usando algo como 'str_replace ('&', '% 26', rawurlencode ($ subject))' –

+2

@dev_row con ese código str_replace el '&' se habrá cambiado a '% 26 amp% 3B'. Usted ** primero ** necesita reemplazar '$ amp;' con '&' y luego hacer el rawurlencode(). ¿Por qué no utilizar 'htmlspecialchars_decode()' en lugar de str_replace? – Duncanmoo

+0

Acabo de agregar una respuesta que muestra un ejemplo con esta respuesta y comentarios: 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

Sobre la base de las respuestas aceptadas y es comentarios, esto es lo que he utilizado:

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

Ejemplo:

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

¿No necesita 'devolver $ text;' al final de la función? – Rober

+0

Gracias @Rober. He actualizado mi respuesta ahora. –

Cuestiones relacionadas