# mailto-Link in MessageBox



## scooterJava (15. Dez 2008)

Ich versuche, in einem MessageDialog einen Link einzubauen, der über "mailto:" den Mail-Client startet:

An passender Stelle wird dazu wie in HTML folgender String ausgegeben:


```
<html><a href='mail@web.com'</a>web.com</html>
```

Obwohl Java sonst HTML-Formatierungen beachtet in Labels usw., interessiert ihn dies hier nicht. Ich nutze Eclipse 3.3.4 unter Java 5 (Java 6 soll nicht genutzt werden) auf Linux- und Windows-Servern. Das Tutorial www.tecchannel.de/webtechnik/entwicklung/402430/java_einsatz_im_netzwerk/index10.html konnte ich nicht geeignet umsetzen, weil die Maillinks aus einer Datenbank ausgelesen werden.


----------



## The_S (15. Dez 2008)

Was heißt denn "interessiert nicht"? Was passiert und was erwartest du das passiert?


----------



## scooterJava (15. Dez 2008)

"interessiert nicht" heißt, dass der Text einfach nur als Text erscheint, weder wie ein Link unterstrichen noch als Link anklickbar. Beides habe ich aber erwartet.


----------



## The_S (15. Dez 2008)

Anklickbar kannste vergessen, weil Java nur rendert, nicht auswertet. Du kannst aber bspw. ein JEditorPane und einen HyperlinkListener verwenden.

Zur Fehlerhaften Darstellung: Das ist auch kein HTML ... So könnte es z. B. aussehen:

<html>web.com</html>


----------



## scooterJava (15. Dez 2008)

Danke für die HTML-Korrektur, jetzt sieht der Link auch wie ein Link aus ...

Den HyperlinkListener kannte ich noch gar nicht. Habe dazu dann dies gefunden:
www.devdaily.com/blog/post/jfc-swing/add-hyperlinklistener-java-component/

und werde es mal ausprobieren.


----------



## Eminent (15. Dez 2008)

Ich hab mal sowas in der Art gemacht (nur mit ner aufzurufenden URL statt nem mailto), sieht ungefähr so aus:


```
JLabel urlLabel = new JLabel(<html><a href........>xxxxx</a></html>);
urlLabel.addMousListener(new MyMousAdapter());
urlLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
```

Damit sieht es dann aus wie ein Link und beim drüber fahren mit der Maus wird der Mauszeiger angepasst.

Im MyMousAdapter musst du dann natürlich entsprechend so reagieren wie du dir das vorstellst, sprich dein Mailzeugs machen.

Das mit JEdiotorPane und dem HyperlinkListener wird sicher auch gehen aber das kannte ich zur Zeit als ich meins umgesetzt habe auch noch nicht und wie heißt es immer so schön ... "Never change a running system"   

Greetz
Eminent


----------



## scooterJava (15. Dez 2008)

@Eminent: Sieht ja nett aus. Nur, in meinem Fall haufenweise Labels erzeugen ist nicht so der Bringer (mindestens 10 sind zu erwarten).

Ich habe mich mal an dem Link www.devdaily.com/blog/post/jfc-swing/add-hyperlinklistener-java-component/ orientiert, stehe jetzt aber vor dem Problem, was ich als auszuführenden Code in den Listener eintragen soll. Das Ganze soll in einer Standalone-Anwendung auf einem Server erscheinen, die unter Linux oder Windows laufen. Ideal wäre es, wenn sich beim Linkklick der Mailclient des Users öffnen würde.

EDIT:
Gemeint ist, dass ich hier nicht z. B. Thunderbird aufrufen kann oder so.


----------



## The_S (15. Dez 2008)

Versteh ich nicht. Evtl. hilft dir die Klasse "Desktop" => http://www.java-blog-buch.de/a-desktop-jdk-16/


----------



## scooterJava (15. Dez 2008)

Nein, leider nicht, da die Anwendung unter Java 5 laufen muss.

Der HyperlinkListener muss doch irgendwas tun. Beim Klick auf den Link soll doch was passieren, nämlich der Mail-Client aufgerufen werden. Das ist aber auf jedem System ein anderer.

@Eminent: Wie sieht dein MyMousAdapter aus?


----------



## Leroy42 (15. Dez 2008)

scooterJava hat gesagt.:
			
		

> Der HyperlinkListener muss doch irgendwas tun. Beim Klick auf den Link soll doch was passieren



Der Listener tut genau das, was du ihm sagst.  ???:L


----------



## scooterJava (15. Dez 2008)

Schlaue Antwort - das weiß ich auch. Ich habe mein Problem ausführlich geschildert. Vielleicht ist es ganz simpel, aber ich sehe die Lösung einfach derzeit nicht.


----------



## scooterJava (15. Dez 2008)

Tut mir leid, wenn sich jemand auf den Schlips getreten fühlt, aber ich bin etwas genervt, weil ich schon seit einer Weile versuche, mein Problem zu lösen.

Zur Lösung des Problems fallen mir nur zwei Sachen:
* JavaMail, aber so bombastisch möchte ich es gar nicht anfangen wegen einer Handvoll Links.
* In den Listener den Befehl "mailto:mailadresse.com" für die Kommandozeile ausführen lassen. Weiß aber nicht, ob das unter Linux funktionieren würde.


----------



## Landei (15. Dez 2008)

http://java.sun.com/javase/6/docs/api/java/awt/Desktop.html#mail(java.net.URI)


----------



## scooterJava (15. Dez 2008)

Danke für alle Tipps, ich würde ja gerne auf Java 6 umsteigen, das wollen die Kunden aber nicht (war schwer genug, sie auf Java 5 umzustimmen).

@Landei: Kann ich leider nicht verwenden, weil Java 6. >>Seufz<<


----------



## WieselAc (15. Dez 2008)

Hab vor einer weile ein ähnliches Problem gehabt. Zwar wollte ich keine Mail schicken sondern einen Link öffnen, aber vielleicht nützt dir der Ansatz ja auch was.. wenn nicht ignorieren: Hier der Schnippsel den ich dazu im Netz gefunden habe:


```
/* Copyright (C) 2002 */
/* This class was found at: [url]http://www.javaworld.com[/url] */

import java.io.IOException;

/**
 * A simple, static class to display a URL in the system browser.
 * 
 * 
 * Under Unix, the system browser is hard-coded to be 'netscape'. Netscape must
 * be in your PATH for this to work. This has been tested with the following
 * platforms: AIX, HP-UX and Solaris.
 * 
 * 
 * Under Windows, this will bring up the default browser under windows, usually
 * either Netscape or Microsoft IE. The default browser is determined by the OS.
 * This has been tested under Windows 95/98/NT.
 * 
 * 
 * Examples:
 * 
 * 
 * BrowserControl.displayURL("http://www.javaworld.com")
 * 
 * BrowserControl.displayURL("file://c:\\docs\\index.html")
 * 
 * BrowserContorl.displayURL("file:///user/joe/index.html");
 * 
 * 
 * Note - you must include the url type -- either "http://" or "file://".
 */
public final class BrowserControl {
    // Used to identify the windows platform.
    private static final String WIN_ID = "Windows";

    // The default system browser under windows.
    private static final String WIN_PATH = "rundll32";

    // The flag to display a url.
    private static final String WIN_FLAG = "url.dll,FileProtocolHandler";

    // The default browser under unix.
    private static final String UNIX_PATH = "netscape";

    // The flag to display a url.
    private static final String UNIX_FLAG = "-remote openURL";

    /**
     * Private constructor.
     */
    private BrowserControl() {
        // do nothing
    }

    /**
     * Display a file in the system browser. If you want to display a file, you
     * must include the absolute path name.
     * 
     * @param url
     *            the file's url (the url must start with either "http://" or
     *            "file://").
     */
    public static void displayURL(String url) {
        boolean windows = isWindowsPlatform();
        String cmd = null;
        try {
            if (windows) {
                // cmd = 'rundll32 url.dll,FileProtocolHandler http://...'
                cmd = WIN_PATH + " " + WIN_FLAG + " " + url;
                Runtime.getRuntime().exec(cmd);
            } else {
                // Under Unix, Netscape has to be running for the "-remote"
                // command to work. So, we try sending the command and
                // check for an exit value. If the exit command is 0,
                // it worked, otherwise we need to start the browser.
                // cmd = 'netscape -remote openURL([url]http://www.javaworld.com[/url])'
                cmd = UNIX_PATH + ' ' + UNIX_FLAG + '(' + url + ')';
                Process p = Runtime.getRuntime().exec(cmd);
                try {
                    // wait for exit code -- if it's 0, command worked,
                    // otherwise we need to start the browser up.
                    int exitCode = p.waitFor();
                    if (exitCode != 0) {
                        // Command failed, start up the browser
                        // cmd = 'netscape http://www.javaworld.com'
                        cmd = UNIX_PATH + " " + url;
                        p = Runtime.getRuntime().exec(cmd);
                    }
                } catch (InterruptedException x) {
                    System.err.println("Error bringing up browser, cmd='" + cmd + "'");
                    System.err.println("Caught: " + x);
                }
            }
        } catch (IOException x) {
            // couldn't exec browser
            System.err.println("Could not invoke browser, command=" + cmd);
            System.err.println("Caught: " + x);
        }
    }

    /**
     * Try to determine whether this application is running under Windows or
     * some other platform by examing the "os.name" property.
     * 
     * @return true if this application is running under a Windows OS
     */
    public static boolean isWindowsPlatform() {
        boolean retVal = false;
        String os = System.getProperty("os.name");
        if (os != null && os.startsWith(WIN_ID)) {
            retVal = true;
        } else {
            retVal = false;
        }
        return retVal;

    }
}
```


----------



## WieselAc (15. Dez 2008)

Hab gerade mal selber was rumprobiert, zusammen mit dem GalileoLink solltest du erfolgreich sein 


```
public static void main(String[] args) {
        BrowserControl.displayURL("mailto:test@test.com");
    }
```

Eigentlich sollte man zwar den _MailToProtocolHandler _verwenden, aber irgendwie klappt das nicht und da der _FileProtocolHandler _auch bei Emails geht, was solls!


----------



## The_S (16. Dez 2008)

@Landei erst lesen, dann posten  

@scooterJava soweit ich weiß, gibts in JDIC auch für Java 5 die Desktop-Klasse.


----------



## scooterJava (17. Dez 2008)

@Hobbit_Im_Blutrausch: Vielen Dank! JDIC scheint das zu sein, was ich suche.


----------

