2008-08-20 13 views
11

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

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

Me gustaría que esto funcione de forma multiplataforma (lo que significa Windows y Mac, lo siento Linux). Me complace 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 frente a solo buscar Outlook o lo que sea.

En OS X, he tratado de ejecutar el comando: se necesita

open mailto:?subject=MySubject&body=TheBody 

escape URL para sustituir los espacios %20.

Actualizado En Windows, tiene que jugar todo tipo de juegos para obtener start para que se ejecute correctamente. Aquí está el encantamiento 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); 
    } 
} 

Respuesta

10

En Java 1.6 tiene una forma estándar para abrir el correo electrónico predeterminado de la plataforma: the Desktop.mail(URI) method. El URI se puede usar 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 Using the Desktop API in Java SE 6

2

Mailto no es un mal camino a seguir. Pero como mencionaste, necesitarás asegurarte de que esté codificado correctamente.

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

Además, tenga en cuenta que el mailto se considera lo mismo que una URL de tipo y, por lo tanto, tendrá las mismas limitaciones de longitud. Consulte http://support.microsoft.com/kb/208427, tenga en cuenta la longitud máxima de 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. Si espera tener una cadena más larga que eso, tendrá que buscar alternativas

Por cierto, no debería tener que recurrir a expulsar un script para hacer eso, siempre que pueda pagar un comando de Java (no sé si puede, ya que no hago Java) .

4

1. Añadir una línea de asunto

puede pre-rellenar la línea de asunto en el correo electrónico mediante la adición de la materia precedido por '? subject = 'después de la dirección de correo electrónico.

Así que el enlace se convierte ahora en:

<a href="mailto:[email protected]?subject=Mail from Our Site">Email Us</a> 

2. Enviar a varios destinatarios

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

Esto se hace de forma similar, colocando '? Cc = [email protected]' después de la dirección inicial.

Así que el enlace tiene el siguiente aspecto:

<a href="mailto:[email protected][email protected]">Email Us</a> 

cc simplemente puede ser reemplazado por BCC si desea enviar copias ocultas.

Esto puede ser muy útil si tiene enlaces en páginas con temas diferentes. Puede hacer que el correo electrónico en cada página vaya a la persona adecuada en una empresa, pero también con una copia de todos los correos enviados a una dirección central.

Por supuesto, puede especificar más de un destinatario adicional, simplemente separe su lista de destinatarios con una coma.

<a href="mailto:[email protected][email protected], [email protected], [email protected]">Email Us</a> 

procedente de Getting More From 'mailto' que ahora 404s. Recuperé el contenido de waybackmachine.

3. Combinar Código

Se pueden combinar los distintos bits de código anterior por la adición de un '&' entre cada uno.

Por lo tanto la adición de

[email protected]?subject=Hello&[email protected]&[email protected] 

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

4. Escribe el correo electrónico

También puede llenar previamente el cuerpo del correo electrónico con el inicio de un mensaje, o escribir el mensaje completo si te gusta! Para agregar algo al cuerpo del correo electrónico, nuevamente es tan simple como el anterior: '? Body =' 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, deberá usar código hexadecimal, por ejemplo, '% 20' entre cada palabra, y crear líneas nuevas significará agregar '% 0D'. De manera similar, los símbolos como $ deberán escribirse en código hexadecimal.

Si también desea agregar una línea de asunto y enviar copias a destinatarios múltiples, esto puede generar un código de código muy largo y difícil de escribir.

Se enviará un mensaje a tres personas, con el asunto y el mensaje completado, todo lo que necesita hacer es agregar su nombre.

¡Solo mira el código!

<a href="mailto:[email protected][email protected] 
&[email protected]&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: URL fuente original donde encontré esto ahora se 404ing así que grabbed to content from waybackmachine y lo publicó aquí, así que no se pierda. Además, el OP indicó que no era para un sitio web, que es lo que estos ejemplos son, pero algunas de estas técnicas aún pueden ser útiles.

0

Lo he implementado, y funciona bien en OS X. (La mención de Ryan de 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(); 
} 

que tenía que volver a implementar urlencode porque Java de + utilizaría para el espacio y correo tomaron los literalmente. Aún no he probado en Windows.

3

que tuvo que volver a aplicar urlencode porque Java + usaría para el espacio and Mail tomaron los literalmente.

No sé si tiene algún método de Java incorporado para URLEncoding 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 
4

start funciona bien en Windows (vea abajo). Usaría Java's construido en UrlEscape y luego solo ejecutaría un segundo reemplazo para los caracteres '+'.

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

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

Por ciento- codificando los nombres y hvalues ​​del URI del correo, utilizo las reglas al http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#encoding. Debajo de http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#implementations, hay un ejemplo de Java que puede ayudar.

Básicamente, yo 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 en que debería ser una cadena con \ r \ n, y perdida \ r ya se normalizaron a \ n.

También tenga en cuenta que solo devolver la cadena original en una excepción como la anterior solo es segura si el argumento de URI de mailto que está pasando en la línea de comandos está escapado y citado correctamente.

En las ventanas que eso significa:

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

Además, en Windows, si se trata de cadenas UTF-16 como en Java, es posible que desee usar ShellExecuteW para "abrir" el URI de correo. Si no lo hace y devuelve s en una excepción (donde algún hvalue no está completamente codificado en porcentajes, podría terminar enangostando algunos caracteres anchos y perdiendo información. Pero, no todos los clientes de correo aceptan argumentos unicode, así que, idealmente, desea para pasar un argumento ascii adecuadamente por ciento con codificación utf8 con ShellExecute.

Como 'inicio', ShellExecute con "abrir" debe abrir el mailto URI en el cliente predeterminado.

No estoy seguro sobre otros sistemas operativos.

3

Nunca use Runtime.exec(String) en Mac OS X o en cualquier otro sistema operativo. Si lo hace, tendrá que averiguar cómo citar correctamente todas las cadenas de argumentos, etc., es un problema y es muy propenso a errores.

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

1

Usted puede utilizar este ...

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 leer el formato A simple way of sending emails in Java: mail-to links

Cuestiones relacionadas