mailto URI afkortet mellem Java.Desktop og Windows/MS outlook

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at oprette et automatiseret fejlrapporteringsværktøj til vores Java-desktopapp. Ideen er at gøre det så nemt som muligt for kunderne at sende os fejlrapporter, når vores ansøgning går i stykker.


Ved hjælp af API'en Desktop.mail kan jeg udarbejde meddelelser, der nemt kan redigeres og sendes fra vores brugere, men jeg kører ind i systembegrænsninger på flere platforme (især Windows 7 og MS Outlook, som de fleste kunder bruger)


Når jeg kører eksempelkoden nedenfor, vil du bemærke, at e-mail-meddelelsen, som vises, afkorter det medfølgende stakspor. Jeg tror, ​​at dette har noget at gøre med en maksimal længde af enten kommandolinjer eller URI'er i de underliggende systemer.


Er der en bedre måde at lave en email fra en fejlrapport, der ikke er underlagt denne begrænsning?


import java.awt.Desktop;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URI;
import java.net.URLEncoder;

public class Scratchpad {

    public static void main(String[] args) throws Exception {
        try {
            generateLongStackTrace();
        } catch (Error e) {
            URI uri = createMailURI(e);
            // this will correctly pop up the system email client, but it will truncate the message
            // after about 2K of data (this seems system dependent)
            Desktop.getDesktop().mail(uri);
        }
    }

    // Will eventually generate a really long stack overflow error
    public static void generateLongStackTrace() throws Exception {
        generateLongStackTrace();
    }

    public static URI createMailURI(Error e) throws Exception {
        StringBuilder builder = new StringBuilder();
        builder.append("mailto:foo@example.com?body=");
        // encodes the stack trace in a mailto URI friendly form
        String encodedStackTrace = URLEncoder.encode(dumpToString(e), "utf-8").replace("+", "\%20");
        builder.append(encodedStackTrace);
        return new URI(builder.toString());
    }

    // Dumps the offending stack trace into a string object.
    public static String dumpToString(Error e) {
        StringWriter sWriter = new StringWriter();
        PrintWriter writer = new PrintWriter(sWriter);
        e.printStackTrace(writer);
        writer.flush();
        return sWriter.toString();
    }

}

Bedste reference


der er længdebegrænsninger med adgangsadresser i ie og længden af ​​en Windows-kommandolinje (se her, her, her og her) - Jeg synes at du løber ind i en af ​​disse (selvom jeg indrømmer at jeg ikke har kontrolleret nøje).

men jeg synes det er en plausibel antagelse, at selvom du kunne snyde dig rundt de nævnte grænser, vil længden af ​​en generisk transmissionsbuffer mellem desktop-applikationer (medmindre du bruger en dedikeret API til fjernstyring af mål appen) blive begrænset på en eller anden måde uden en smuthul. [2] [3] [5]


derfor foreslår jeg en af ​​følgende strategier:



  1. distribution via en webserver.



    • upload de data, der skal sendes til en webserver i stedet ved hjælp af html-formular fil upload teknik.
      I grund og grund skal du forfalske en POST-anmodning, en nyttelast med indholdstype indstillet til 'multipart/form-data'. Dit indhold vil have brug for nogle indpakningsdata, der skal overholde syntaktisk med denne mime-type.

    • Den faktiske transmission kan initieres ved hjælp af WinHttpRequest COM-objektet under Windows eller Curl Command Line-programmet fra alle andre steder.

    • Server side behandling kan delegeres til en egnet cgi handler som f.eks. kan producere et (kort) link for at downloade data fra webserveren.

    • Dette link kan være en del af http-svaret på upload anmodningen, eller du genererer det klientsiden i det korrekte format for at offentliggøre det på webserveren uændret.

    • pro:

      Denne ordning er mulig - jeg har gentagne gange anvendt det i virksomhedsprojekter. dataoverførsel kan sikres via https.

    • con:

      kræver en webserver at implementere


  2. Send en mail ved hjælp af en vedhæftet fil (for nogle detaljer se her): [6] [7] [8]



    • Gem kroppen af ​​din besked til en fil på skrivebordet.

    • generer et mailto-link, der refererer til en vedhæftet fil (i stedet for størstedelen af ​​din krop)

    • En anstændig mailklient vil kunne vise vedhæftet fil inline, hvis det har nogle elementære mime-typer som 'tekst/almindelig'.
      På Windows-platforme sætter du det ved at vælge den rigtige filtypenavn ('.txt')

    • pro:

      enkel

    • con:

      filsystemadgang på klientplatformen;
      untested (i det mindste af mig)




held og lykke !