¿Cuál es la forma correcta de escapar de una cadena para un enlace mailto?

3 minutos de lectura

avatar de usuario
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.

  • hubiera pensado que tampoco rawurlencode() o urlencode() 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 usar http_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 de htmlspecialchars() 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


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 usar htmlspecialchars_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

avatar de usuario
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']));

¿Ha sido útil esta solución?

¿Cuál es la forma correcta de escapar de una cadena para un enlace mailto?

3 minutos de lectura

avatar de usuario
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.

  • hubiera pensado que tampoco rawurlencode() o urlencode() 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 usar http_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 de htmlspecialchars() 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


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('&amp;','%26',rawurlencode($subject))

    – dev_fila

    23 de enero de 2013 a las 21:43

  • @dev_row con ese código str_replace el &amp; se habrá cambiado a %26amp%3B. Tú primero necesita reemplazar $amp; con & y luego haz el rawurlencode(). También por qué no usar htmlspecialchars_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

avatar de usuario
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']));

¿Ha sido útil esta solución?