Frage

Wie öffne ich das Standard-Mailprogramm mit Betreff und Text plattformübergreifend?

Leider handelt es sich dabei um eine in Java geschriebene Client-App und nicht um eine Website.

Ich möchte, dass dies plattformübergreifend funktioniert (also Windows und Mac, sorry Linux).Gerne führe ich ein VBScript unter Windows oder AppleScript unter OS X aus.Aber ich habe keine Ahnung, was diese Skripte enthalten sollen.Ich würde gerne das Standardprogramm des Benutzers ausführen vs.Ich suche nur nach Outlook oder was auch immer.

Unter OS X habe ich versucht, den folgenden Befehl auszuführen:

open mailto:?subject=MySubject&body=TheBody

Zum Ersetzen von Leerzeichen ist URL-Escape erforderlich %20.

Aktualisiert Unter Windows müssen Sie alle möglichen Spiele spielen, um es zu bekommen start richtig laufen zu lassen.Hier ist die richtige Java-Beschwörung:

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);
    }
}
War es hilfreich?

Lösung

In Java 1.6 gibt es eine standardmäßige Möglichkeit, den Standard-Mailer der Plattform zu öffnen:die Desktop.mail(URI)-Methode.Über den URI können alle Felder der E-Mail (Absender, Empfänger, Text, Betreff) festgelegt werden.Ein vollständiges Beispiel der Desktop-Integration in Java 1.6 finden Sie unter Verwenden der Desktop-API in Java SE 6

Andere Tipps

start funktioniert gut unter Windows (siehe unten).Ich würde das in Java integrierte UrlEscape verwenden und dann einfach einen zweiten Ersatz für „+“-Zeichen ausführen.

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

1.Fügen Sie eine Betreffzeile hinzu

Sie können die Betreffzeile in der E-Mail vorab ausfüllen, indem Sie den Betreff mit dem vorangestellten „“ hinzufügen.?subjekt=' nach der E-Mail-Adresse.

Der Link lautet nun also:

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

2.An mehrere Empfänger senden

E-Mails können entweder als Durchschläge (cc) oder als Blindkopien (bcc) an weitere Empfänger gesendet werden.

Dies geschieht auf ähnliche Weise, indem man „?cc=someoneelse@theirsite.com' nach der Anfangsadresse.

Der Link sieht also so aus:

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

cc kann einfach durch bcc ersetzt werden, wenn Sie Blindkopien versenden möchten.

Dies kann sehr nützlich sein, wenn Sie Links zu Seiten mit unterschiedlichen Themen haben.Sie können die E-Mail auf jeder Seite an die entsprechende Person in einem Unternehmen senden lassen, aber auch eine Kopie aller E-Mails an eine zentrale Adresse senden.

Sie können natürlich auch mehr als einen weiteren Empfänger angeben, trennen Sie Ihre Empfängerliste einfach durch ein Komma.

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

Bezogen von Mehr aus „mailto“ herausholen was jetzt 404s.Ich habe den Inhalt von waybackmachine abgerufen.

3.Code kombinieren

Sie können die verschiedenen Codeteile oben kombinieren, indem Sie jeweils ein „&“ dazwischen einfügen.

Also hinzufügen

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

würde eine E-Mail mit dem Betreff „Hallo“ an mich, Sie und sie senden.

4.Schreiben Sie die E-Mail

Sie können den Text der E-Mail auch mit dem Anfang einer Nachricht vorab ausfüllen oder die gesamte Nachricht schreiben, wenn Sie möchten!Um etwas zum E-Mail-Text hinzuzufügen, ist es wieder so einfach wie oben: '?body=' nach der E-Mail-Adresse.Allerdings kann das Formatieren dieser E-Mail etwas schwierig sein.Um Leerzeichen zwischen Wörtern zu erstellen, müssen Sie einen Hexadezimalcode verwenden, zum Beispiel „%20' zwischen jedem Wort, und um neue Zeilen zu erstellen, muss man ' hinzufügen%0D'.Ebenso Symbole wie $ Zeichen müssen im Hex-Code geschrieben werden.

Wenn Sie außerdem eine Betreffzeile hinzufügen und Kopien an mehrere Empfänger senden möchten, kann dies zu einem sehr langen und schwierig zu schreibenden Code führen.

Es wird eine Nachricht an drei Personen gesendet, wobei der Betreff und die Nachricht ausgefüllt sind. Sie müssen lediglich Ihren Namen hinzufügen.

Schauen Sie sich einfach den Code an!

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

Notiz:Die ursprüngliche Quell-URL, unter der ich das gefunden habe, ist jetzt 404ing, also ich Zum Inhalt von Waybackmachine geholt und habe es hier gepostet, damit es nicht verloren geht.Außerdem gab das OP an, dass es sich nicht um eine Website handelte, um die es bei diesen Beispielen geht, aber einige dieser Techniken könnten dennoch nützlich sein.

Ich musste Urlencode erneut implementieren, weil Java + für den Platz verwenden würde und Mail diese buchstäblich nahm.

Ich weiß nicht, ob Java eine integrierte Methode zum URL-Codieren der Zeichenfolge hat, aber dieser Link http://www.permadi.com/tutorial/urlEncoding/ zeigt einige der am häufigsten zu kodierenden Zeichen:

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

Ich weiß nicht, ob Java eine integrierte Methode zum URL-Codieren der Zeichenfolge hat, aber dieser Link http://www.permadi.com/tutorial/urlEncoding/ zeigt einige der am häufigsten zu kodierenden Zeichen:

Für die prozentuale Codierung von Mailto-URI-H-Namen und -Werten verwende ich die Regeln unter http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#encoding.Unter http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#implementations, es gibt ein Java-Beispiel, das helfen könnte.

Grundsätzlich verwende ich:

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

Die übergebene Zeichenfolge sollte eine Zeichenfolge mit sein und das verstreute bereits auf normalisiert sein.

Beachten Sie außerdem, dass die Rückgabe der Originalzeichenfolge bei einer Ausnahme wie oben nur dann sicher ist, wenn das Mailto-URI-Argument, das Sie in der Befehlszeile übergeben, ordnungsgemäß maskiert und in Anführungszeichen gesetzt ist.

Unter Windows bedeutet das:

  1. Zitieren Sie das Argument.
  2. Escapen Sie jedes „ innerhalb der Anführungszeichen mit \.
  3. Escapen Sie jedes \, das vor einem „ oder dem Ende der Zeichenfolge steht, mit \.

Wenn Sie unter Windows wie in Java mit UTF-16-Zeichenfolgen arbeiten, möchten Sie möglicherweise ShellExecuteW verwenden, um den Mailto-URI zu „öffnen“.Wenn Sie dies nicht tun und bei einer Ausnahme s zurückgeben (bei der ein H-Wert nicht vollständig prozentual codiert ist), könnte es sein, dass Sie einige breite Zeichen einschränken und Informationen verlieren.Da jedoch nicht alle E-Mail-Clients Unicode-Argumente akzeptieren, sollten Sie mit ShellExecute idealerweise ein ordnungsgemäß prozentcodiertes UTF8-ASCII-Argument übergeben.

Wie „start“ sollte ShellExecute mit „open“ den Mailto-URI im Standardclient öffnen.

Bei anderen Betriebssystemen bin ich mir nicht sicher.

Benutze niemals Runtime.exec(String) auf Mac OS X oder einem anderen Betriebssystem.Wenn Sie das tun, müssen Sie herausfinden, wie Sie alle Argumentzeichenfolgen usw. richtig in Anführungszeichen setzen.Es ist mühsam und sehr fehleranfällig.

Verwenden Sie stattdessen Runtime.exec(String[]) Dies erfordert ein Array bereits getrennter Argumente.Dies ist für praktisch alle Verwendungszwecke viel besser geeignet.

Mailto ist kein schlechter Weg.Aber wie Sie bereits erwähnt haben, müssen Sie sicherstellen, dass es richtig codiert ist.

Das Hauptproblem bei der Verwendung von mailto besteht im Zeilenumbruch.Verwenden Sie %0A für Wagenrückläufe, %20 für Leerzeichen.

Bedenken Sie außerdem, dass das Mailto als eine Art URL betrachtet wird und daher denselben Längenbeschränkungen unterliegt.Sehenhttp://support.microsoft.com/kb/208427, Beachten Sie die maximale URL-Länge von 2083 Zeichen.Dies wird auch für Mailto in diesem Artikel bestätigt: http://support.microsoft.com/kb/279460/en-us.Außerdem können einige E-Mail-Clients eine Beschränkung haben (ich glaube, ältere Versionen von Outlook Express hatten eine Beschränkung auf etwas viel Kleineres, etwa 483 Zeichen oder so).Wenn Sie mit einer längeren Saite rechnen, müssen Sie sich nach Alternativen umsehen.

Übrigens sollten Sie dazu nicht auf ein Skript zurückgreifen müssen, solange Sie einen Befehl aus Java herausbekommen können (ich weiß nicht, ob Sie das können, da ich Java nicht beherrsche).

Sie können dies verwenden...

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

Auch zum Formatieren lesen Eine einfache Möglichkeit, E-Mails in Java zu versenden:Mail-to-Links

Ich habe dies implementiert und es funktioniert gut unter OS X.(Ryans Erwähnung der maximalen URL-Länge wurde nicht kodifiziert.)

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

Ich musste URLencode neu implementieren, da Java es verwenden würde + für den Weltraum und Mail nahm das wörtlich.Noch nicht unter Windows getestet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top