Come posso aprire il programma di posta predefinito con oggetto e corpo in modo multipiattaforma?

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

  •  08-06-2019
  •  | 
  •  

Domanda

Come posso aprire il programma di posta predefinito con oggetto e corpo in modo multipiattaforma?

Sfortunatamente, si tratta di un'app client scritta in Java, non di un sito Web.

Vorrei che funzionasse in modo multipiattaforma (il che significa Windows e Mac, scusa Linux).Sono felice di eseguire un VBScript in Windows o un AppleScript in OS X.Ma non ho idea di cosa dovrebbero contenere quegli script.Mi piacerebbe eseguire il programma predefinito dell'utente vs.sto solo cercando Outlook o altro.

In OS X, ho provato a eseguire il comando:

open mailto:?subject=MySubject&body=TheBody

È necessario l'escape dell'URL per sostituire gli spazi %20.

Aggiornato Su Windows, devi giocare a tutti i tipi di giochi per ottenerlo start per funzionare correttamente.Ecco l'incantesimo Java corretto:

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);
    }
}
È stato utile?

Soluzione

In Java 1.6 hai un modo standard per aprire il mailer predefinito della piattaforma:il metodo Desktop.mail(URI)..L'URI può essere utilizzato per impostare tutti i campi della mail (mittente, destinatari, corpo, oggetto).Puoi controllare un esempio completo di integrazione desktop in Java 1.6 su Utilizzo dell'API desktop in Java SE 6

Altri suggerimenti

start funziona bene in Windows (vedi sotto).Vorrei utilizzare UrlEscape integrato in Java, quindi eseguire semplicemente una seconda sostituzione per i caratteri "+".

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

1.Aggiungi una riga oggetto

Puoi precompilare la riga dell'oggetto nell'e-mail aggiungendo l'oggetto preceduto da '?oggetto=' dopo l'indirizzo email.

Quindi il collegamento ora diventa:

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

2.Invia a più destinatari

La posta può essere inviata a destinatari aggiuntivi come copia carbone (cc) o copia conoscenza nascosta (bcc).

Questo viene fatto in modo simile, inserendo '?cc=qualcunaltro@lorosito.com' dopo l'indirizzo iniziale.

Quindi il collegamento è simile a questo:

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

cc può essere semplicemente sostituito da bcc se desideri inviare copie carbone nascoste.

Questo può essere molto utile se hai collegamenti su pagine con argomenti diversi.Potresti far sì che l'e-mail su ciascuna pagina venga inviata alla persona appropriata in un'azienda, ma con una copia di tutte le e-mail inviate anche a un indirizzo centrale.

Ovviamente puoi specificare più di un destinatario aggiuntivo, basta separare l'elenco dei destinatari con una virgola.

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

Proveniente da Ottenere di più da 'mailto' che ora 404s.Ho recuperato il contenuto da waybackmachine.

3.Combinazione di codici

Puoi combinare i vari bit di codice sopra aggiungendo un "&" tra ciascuno.

Aggiungendo così

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

invierebbe un'e-mail con oggetto "Ciao" a me, a te e a lei.

4.Scrivi l'e-mail

Puoi anche precompilare il corpo dell'e-mail con l'inizio di un messaggio o scrivere l'intero messaggio, se preferisci!Per aggiungere qualcosa al corpo dell'e-mail è semplice come sopra: '?corpo=' dopo l'indirizzo email.Tuttavia la formattazione dell'e-mail può essere un po' complicata.Per creare spazi tra le parole dovrai utilizzare il codice esadecimale, ad esempio '%20' tra ogni parola e creare nuove righe significherà aggiungere '%0D'.Allo stesso modo simboli come $ i segni dovranno essere scritti in codice esadecimale.

Se desideri anche aggiungere una riga dell'oggetto e inviare copie a più destinatari, ciò può rendere la parte di codice molto lunga e difficile da scrivere.

Invierà un messaggio a tre persone, con l'oggetto e il messaggio compilati, tutto ciò che devi fare è aggiungere il tuo nome.

Basta guardare il codice!

<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:L'URL della fonte originale in cui ho trovato questo ora è 404, quindi I recuperato il contenuto da waybackmachine e postato qui in modo che non si perda.Inoltre, l'OP ha dichiarato che non era per un sito Web, che è ciò che sono questi esempi, ma alcune di queste tecniche potrebbero comunque essere utili.

Ho dovuto reimplementare Urlencode perché Java avrebbe usato + per spazio e la posta ha preso quelli letteralmente.

Non so se Java abbia qualche metodo integrato per codificare l'urlen della stringa, ma questo collegamento http://www.permadi.com/tutorial/urlEncoding/ mostra alcuni dei caratteri più comuni da codificare:

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

Non so se Java abbia qualche metodo integrato per codificare l'urlen della stringa, ma questo collegamento http://www.permadi.com/tutorial/urlEncoding/ mostra alcuni dei caratteri più comuni da codificare:

Per hname e hvalue URI mailto con codifica percentuale, utilizzo le regole su http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#encoding.Sotto http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#implementations, c'è un esempio Java che può aiutare.

Fondamentalmente, utilizzo:

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 stringa passata dovrebbe essere una stringa con e già normalizzata in .

Tieni inoltre presente che la semplice restituzione della stringa originale su un'eccezione come quella sopra è sicura solo se l'argomento URI mailto che stai passando sulla riga di comando è correttamente sottoposto a escape e racchiuso tra virgolette.

Su Windows ciò significa:

  1. Cita l'argomentazione.
  2. Evita qualsiasi " tra virgolette con \.
  3. Evita qualsiasi \ che preceda un " o la fine della stringa con \.

Inoltre, su Windows, se hai a che fare con stringhe UTF-16 come in Java, potresti voler utilizzare ShellExecuteW per "aprire" l'URI mailto.Se non lo fai e restituisci s su un'eccezione (dove alcuni hvalue non sono completamente codificati in percentuale, potresti finire per restringere alcuni caratteri larghi e perdere informazioni.Ma non tutti i client di posta accettano argomenti Unicode, quindi idealmente dovresti passare un argomento ASCII con codifica percentuale-utf8 corretta con ShellExecute.

Come "start", ShellExecute con "open" dovrebbe aprire l'URI mailto nel client predefinito.

Non sono sicuro di altri sistemi operativi.

Non usare mai Runtime.exec(String) su Mac OS X o qualsiasi altro sistema operativo.Se lo fai, dovrai capire come citare correttamente tutte le stringhe di argomenti e così via;è una seccatura e molto soggetta a errori.

Invece, usa Runtime.exec(String[]) che accetta una serie di argomenti già separati.Questo è molto più appropriato praticamente per tutti gli usi.

Mailto non è una brutta strada da percorrere.Ma come hai detto, dovrai assicurarti che sia codificato correttamente.

Il problema principale con l'utilizzo di mailto è la rottura delle righe.Utilizzare %0A per i ritorni a capo, %20 per gli spazi.

Inoltre, tieni presente che il mailto è considerato uguale a una sorta di URL e pertanto avrà le stesse limitazioni di lunghezza.Vederehttp://support.microsoft.com/kb/208427, tieni presente la lunghezza massima dell'URL di 2083 caratteri.Ciò è confermato anche per Mailto in questo articolo: http://support.microsoft.com/kb/279460/en-us.Inoltre, alcuni client di posta possono anche avere un limite (credo che le versioni precedenti di Outlook Express avessero un limite molto più piccolo come 483 caratteri o qualcosa del genere.Se prevedi di avere una stringa più lunga, dovrai cercare delle alternative.

A proposito, non dovresti ricorrere all'espulsione di uno script per farlo fintanto che puoi sborsare un comando da Java (non so se puoi dato che non uso Java).

Potresti usare questo...

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);
        }
    }

Anche per la formattazione read Un modo semplice per inviare e-mail in Java:collegamenti per posta

L'ho implementato e funziona bene su OS X.(La menzione di Ryan sulla lunghezza massima dell'URL non è stata codificata.)

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();
}

Ho dovuto reimplementare URLencode perché Java lo avrebbe utilizzato + per lo spazio e Mail li ha presi alla lettera.Non ho ancora testato su Windows.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top