¿Cómo abro el programa de correo predeterminado con Asunto y Cuerpo de forma multiplataforma?

StackOverflow https://stackoverflow.com/questions/17373

  •  08-06-2019
  •  | 
  •  

Pregunta

¿Cómo abro el programa de correo predeterminado con Asunto y Cuerpo de forma multiplataforma?

Desafortunadamente, esto es para una aplicación cliente escrita en Java, no para un sitio web.

Me gustaría que esto funcione de forma multiplataforma (lo que significa Windows y Mac, lo siento, Linux).Estoy feliz de ejecutar un VBScript en Windows o AppleScript en OS X.Pero no tengo idea de qué deberían contener esos scripts.Me encantaría ejecutar el programa predeterminado del usuario vs.simplemente buscando Outlook o lo que sea.

En OS X, intenté ejecutar el comando:

open mailto:?subject=MySubject&body=TheBody

Se necesita escape de URL para reemplazar espacios con %20.

Actualizado En Windows, tienes que jugar todo tipo de juegos para obtener start para ejecutarse correctamente.Aquí está el encantamiento de Java adecuado:

class Win32 extends OS {
    public void email(String subject, String body) throws Exception {
        String cmd = "cmd.exe /c start \"\" \"" + formatMailto(subject, body) + "\"";
        Runtime.getRuntime().exec(cmd);
    }
}
¿Fue útil?

Solución

En Java 1.6 tienes una forma estándar de abrir el correo predeterminado de la plataforma:el método Desktop.mail(URI).El URI se puede utilizar para configurar todos los campos del correo (remitente, destinatarios, cuerpo, asunto).Puede consultar un ejemplo completo de integración de escritorio en Java 1.6 en Usando la API de escritorio en Java SE 6

Otros consejos

start funciona bien en Windows (ver más abajo).Usaría UrlEscape integrado de Java y luego simplemente ejecutaría un segundo reemplazo para los caracteres '+'.

start mailto:"?subject=My%20Subject&body=The%20Body"

1.Agregar una línea de asunto

Puede completar previamente la línea de asunto en el correo electrónico agregando el asunto precedido por '?asunto=' después de la dirección de correo electrónico.

Entonces el enlace ahora se convierte en:

<a href="mailto:someone@yoursite.com?subject=Mail from Our Site">Email Us</a> 

2.Enviar a múltiples destinatarios

El correo se puede enviar a destinatarios adicionales, ya sea como copias carbón (cc) o copias carbón ocultas (bcc).

Esto se hace de manera similar, colocando '?cc=alguienmás@susitio.com' después de la dirección inicial.

Entonces el enlace se ve así:

<a href="mailto:someone@yoursite.com?cc=someoneelse@theirsite.com">Email Us</a>

cc puede simplemente reemplazarse por bcc si desea enviar copias ocultas.

Esto puede resultar muy útil si tienes enlaces a páginas con diferentes temas.Es posible que el correo electrónico de cada página llegue a la persona adecuada de una empresa, pero también se envíe una copia de todos los correos electrónicos a una dirección central.

Por supuesto, puedes especificar más de un destinatario adicional, simplemente separa tu lista de destinatarios con una coma.

<a href="mailto:someone@yoursite.com?cc=someoneelse@theirsite.com, another@thatsite.com, me@mysite.com">Email Us</a> 

Procedente de Obtener más de 'mailto' que ahora 404.Recuperé el contenido de waybackmachine.

3.Combinando código

Puede combinar los distintos fragmentos de código anteriores agregando un '&' entre cada uno.

Añadiendo así

me@mysite.com?subject=Hello&cc=you@yoursite.com&bcc=her@hersite.com

Me enviaría un correo electrónico con el asunto 'Hola' a mí, a ti y a ella.

4.Escribe el correo electrónico

¡También puedes completar el cuerpo del correo electrónico con el inicio de un mensaje o escribir el mensaje completo si lo deseas!Para agregar algo al cuerpo del correo electrónico, nuevamente es tan simple como arriba: '?cuerpo=' después de la dirección de correo electrónico.Sin embargo, formatear ese correo electrónico puede ser un poco complicado.Para crear espacios entre palabras tendrás que usar código hexadecimal, por ejemplo '%20' entre cada palabra, y para crear nuevas líneas significará agregar '%0D'.De manera similar, símbolos como $ los letreros deberán escribirse en código hexadecimal.

Si también desea agregar una línea de asunto y enviar copias a varios destinatarios, esto puede hacer que escribir un fragmento de código sea muy largo y difícil.

Enviará un mensaje a tres personas, con el asunto y el mensaje completos, todo lo que necesitas hacer es agregar tu nombre.

¡Solo mira el código!

<a href="mailto:abbeyvet@outfront.net?CC=spooky@outfront.net
&BCC=thomasbrunt@outfront.net&Subject=Please%2C%20I%20insist
%21&Body=Hi%0DI%20would%20like%20to%20send%20you%20
%241000000%20to%20divide%20as%20you%20see%20fit%20among
%20yourselves%20and%20all%20the%20moderators.%0DPlease%
20let%20me%20know%20to%20whom%20I%20should%20send
%20the%20check.">this link</a> 

Nota:La URL de origen original donde encontré esto ahora es 404, así que agarrado al contenido de waybackmachine Y lo publiqué aquí para que no se pierda.Además, el OP declaró que no era para un sitio web, que es lo que son estos ejemplos, pero algunas de estas técnicas aún pueden ser útiles.

Tuve que volver a implementar Urlencode porque Java usaría + para el espacio y el correo los tomó literalmente.

No sé si Java tiene algún método incorporado para codificar la cadena, pero este enlace http://www.permadi.com/tutorial/urlEncoding/ muestra algunos de los caracteres más comunes para codificar:

;       %3B
?       %3F
/       %2F
:       %3A
#       %23
&       %24
=       %3D
+       %2B
$       %26
,       %2C
space   %20 or +
%       %25
<       %3C
>       %3E
~       %7E
%       %25

No sé si Java tiene algún método incorporado para codificar la cadena, pero este enlace http://www.permadi.com/tutorial/urlEncoding/ muestra algunos de los caracteres más comunes para codificar:

Para codificar por porcentaje los nombres y valores h de URI de mailto, utilizo las reglas en http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#encoding.Bajo http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#implementations, hay un ejemplo de Java que puede ayudar.

Básicamente, uso:

private String encodex(final String s) {
    try {
        return java.net.URLEncoder.encode(s, "utf-8").replaceAll("\\+", "%20").replaceAll("\\%0A", "%0D%0A");
    } catch (Throwable x) {
        return s;
    }
}

La cadena que se pasa debe ser una cadena con y perdida ya normalizada a .

También tenga en cuenta que simplemente devolver la cadena original en una excepción como la anterior solo es seguro si el argumento URI de correo que está pasando en la línea de comandos tiene el escape y las comillas correctamente.

En Windows eso significa:

  1. Cite el argumento.
  2. Escapa cualquier " dentro de las comillas con \.
  3. Escapa cualquier \ que preceda a " o al final de la cadena con \.

Además, en Windows, si trabaja con cadenas UTF-16 como en Java, es posible que desee utilizar ShellExecuteW para "abrir" el URI de correo.Si no lo hace y devuelve s en una excepción (donde algún valor h no está completamente codificado en porcentaje, podría terminar reduciendo algunos caracteres anchos y perdiendo información.Pero no todos los clientes de correo aceptan argumentos Unicode, por lo que lo ideal es pasar un argumento ascii utf8 con porcentaje de codificación adecuada con ShellExecute.

Al igual que 'iniciar', ShellExecute con "abrir" debería abrir el URI de correo en el cliente predeterminado.

No estoy seguro acerca de otros sistemas operativos.

Nunca usar Runtime.exec(String) en Mac OS X o cualquier otro sistema operativo.Si hace eso, tendrá que descubrir cómo citar correctamente todas las cadenas de argumentos, etc.;es una molestia y muy propenso a errores.

En su lugar, utilice Runtime.exec(String[]) que requiere una serie de argumentos ya separados.Esto es mucho más apropiado para prácticamente todos los usos.

Mailto no es una mala ruta a seguir.Pero como mencionaste, deberás asegurarte de que esté codificado correctamente.

El principal problema con el uso de mailto es la rotura de líneas.Utilice %0A para retornos de carro, %20 para espacios.

Además, tenga en cuenta que el mailto se considera lo mismo que una especie de URL y, por lo tanto, tendrá las mismas limitaciones de longitud.Verhttp://support.microsoft.com/kb/208427, tenga en cuenta la longitud máxima de la URL de 2083 caracteres.Esto también se confirma para Mailto en este artículo: http://support.microsoft.com/kb/279460/en-us.Además, algunos clientes de correo también pueden tener un límite (creo que las versiones anteriores de Outlook Express tenían un límite de algo mucho más pequeño, como 483 caracteres o algo así).Si espera tener una cadena más larga que esa, deberá buscar alternativas.

Por cierto, no deberías tener que recurrir a ejecutar un script para hacerlo, siempre y cuando puedas ejecutar un comando desde Java (no sé si puedes, ya que yo no uso Java).

Puedes usar esto...

main(string[] args){    
String forUri = String.format("mailto:?subject=%s&body=%s",  urlEncode(sub), urlEncode(mailBody));
                        Desktop.getDesktop().mail(new URI(forUri));
}

private static final String urlEncode(String str) {
        try {
            return URLEncoder.encode(str, "UTF-8").replace("+", "%20");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

También para formatear leer Una forma sencilla de enviar correos electrónicos en Java:enlaces de correo

He implementado esto y funciona bien en OS X.(La mención de Ryan sobre la longitud máxima de la URL no ha sido codificada).

public void email(String subject, String body) throws Exception {
    String cmd = "open mailto:";        
    cmd += "?subject=" + urlEncode(subject);
    cmd += "&body=" + urlEncode(body);
    Runtime.getRuntime().exec(cmd);
}

private static String urlEncode(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        if (Character.isLetterOrDigit(ch)) {
            sb.append(ch);
        }
        else {
            sb.append(String.format("%%%02X", (int)ch));
        }
    }
    return sb.toString();
}

Tuve que volver a implementar URLencode porque Java usaría + para el espacio y el correo los tomó literalmente.Aún no lo he probado en Windows.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top