bardiir
tengo un mailto:
enlace en una página aquí incluyendo subject=
y body=
parámetros pero no estoy seguro de cómo escapar correctamente los datos en los parámetros.
La página está codificada en utf-8
así que supongo que todos los caracteres especiales como las diéresis alemanas deberían codificarse en utf-8
representaciones para la URL también?
En este momento estoy usando rawurlencode()
como urlencode()
insertaría +
caracteres en todos los lugares donde deberían haber espacios, pero no estoy seguro de si esta es la forma correcta de hacerlo.
solo necesitas rawurlencode()
el enlace al final de la dirección de correo electrónico según los estándares del W3C.
Hay un ejemplo en el Manual de PHP para urlencode (busque mailto en esa página):
http://php.net/manual/en/function.urlencode.php
-
Tenga en cuenta que ‘rawurlencode()’ escapará de los símbolos de unión a &, que la mayoría de los clientes de correo no decodificarán correctamente. Se debe usar %26 para reemplazar estos símbolos de unión usando algo como un
str_replace('&','%26',rawurlencode($subject))
– dev_fila
23 de enero de 2013 a las 21:43
-
@dev_row con ese código str_replace el
&
se habrá cambiado a%26amp%3B
. Tú primero necesita reemplazar$amp;
con&
y luego haz el rawurlencode(). También por qué no usarhtmlspecialchars_decode()
en lugar de str_replace?– Duncanmoo
7 de junio de 2016 a las 9:54
-
Acabo de agregar una respuesta que muestra un ejemplo usando esta respuesta y comentarios: stackoverflow.com/a/46865401/1617737
– ban-geoingeniería
21 de octubre de 2017 a las 16:26
ban-geoingeniería
Según las respuestas aceptadas y sus comentarios, esto es lo que he usado:
function format_text_for_mailto_param($text) {
return rawurlencode(htmlspecialchars_decode($text));
}
Ejemplo:
$email = "someone@example.org";
$subject = "Test Subject";
<a href="https://stackoverflow.com/questions/8940445/mailto:" . $email . '?subject=" . format_text_for_mailto_param($subject) . "">send email</a>
-
no necesitas
return $text;
al final de la función?– Roberto
18 de enero de 2018 a las 12:52
function MailToUrl ($strUser, $strServer, $queryParams = null) {
$strUrl="https://stackoverflow.com/questions/8940445/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="https://stackoverflow.com/questions/8940445/{$strEscapedUrl}">{$strVisibleUrl}</a>";
return $strLink;
}
print (MailToLink('"very.(),:;<>[]\".VERY.\"very@\ \"very\".unusual"', 'test.com', ['subject'=>'this & \ that / ']));
print (MailToLink('müller', 'test.com', ['subject'=>'Einflußgröße']));
hubiera pensado que tampoco
rawurlencode()
ourlencode()
debería hacer el trabajo: el navegador debería decodificar correctamente cualquier versión antes de pasarla al cliente de correo. También puede crear una matriz de parámetros y usarhttp_build_query()
– 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 dehtmlspecialchars()
si se va a utilizar en una página HTML…– DaveRandom
20 de enero de 2012 a las 11:11
Bueno, funciona así en todos los casos de uso en los que pensé, pero tal vez no sea la forma correcta de hacer esto y mi navegador/cliente de correo simplemente reconozca correctamente y solucione ese error, es por eso que se pregunta, solo para estar seguro 🙂
– bardiir
20 de enero de 2012 a las 11:15
Puede haber situaciones en las que uno funcione y el otro no, pero si es así, 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 hay uno, probablemente sea tan malo como para ser inutilizable de todos modos.
– DaveRandom
20 de enero de 2012 a las 11:18