Come posso aprire il programma di posta predefinito con oggetto e corpo in modo multipiattaforma?
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);
}
}
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:
- Cita l'argomentazione.
- Evita qualsiasi " tra virgolette con \.
- 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.