Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [JAVA] problema di encoding in invio mail

    Ciao a tutti,

    ho un problema con l'encoding nell'invio di mail.

    il testo che devo inviare e' stato scritto il unicode di seguito un esempio:

    codice:
    Cher/Ch\u00E8re {0} {1},\n\nMerci d'avoir achet\u00E9
    come potete intuire dalla struttura del testo utilizzo la classe MessageFormat per formattare il testo.
    (ho provato a guardarmi anache questa classe ma non ho trovato traccia di encoding, charset o altro)

    Come Charset prima di inviare la mail setto ISO-8859-1,
    ma il mail server sembra non prendere in cosiderazione il Charset da me imposato...
    o meglio lo imposta nell'header della mail ma invia la mail in UTF-8...

    vi posto anche il frammento dell'header della mail:

    codice:
    Subject: =?ISO-8859-1?Q?Confirmation_de_r=E9servation_vol_a=E9rien?=MIME-Version: 1.0
    Content-Type: text/plain; charset=ISO-8859-1
    il risultato e' scontato...
    Il client prova ad interpretare il testo usando la codifica ISO...
    ma essendo stato scritto il UTF fa' casino.
    codice:
    Cher/Chère <nome> <cognome>,
    
    Merci d'avoir acheté
    ho fatto delle prove, se faccio leggere a ThunderBird la mail codificandola in UTF-8 la interpreta correttamente...

    non so piu' come poter affrontare il porblema ho provato in mille modi diversi, ma il risultato e' sempre lo stesso...

    Per completezza vi posto anche un paio di soluzioni che ho provato ad adottare senza riuscire a trovare una soluzione...
    magari sbaglio da qualche parte e non me ne sono accorto...

    PRIMA SOLUZIONE:

    codice:
    public static void main(String[] args) throws UnsupportedEncodingException
      {
        byte[] test2;
        String test = "Arriv\u00E9:", test3;
        
        test2 = test.getBytes("ISO-8859-1");
        test3 = new String(test2, "ISO-8859-1");
        
        System.out.println(test);
        System.out.println(test2);
        System.out.println(test3);
        
      }
    SECONDA SOLUZIONE:

    codice:
    public static void main (String[] args) throws UnsupportedEncodingException, CharacterCodingException
      {
        Charset isoCharset = Charset.forName("ISO-8859-1");
        Charset utfCharset = Charset.forName("UTF-8");
        
        CharsetDecoder decoder = utfCharset.newDecoder();
        CharsetEncoder encoder = isoCharset.newEncoder();
        
        String text = new String("Cher/Ch\u00E8re {0} {1},\n\nMerci d'avoir achet\u00E9".getBytes("UTF-8"));
        
        System.out.println("text:" + text);
          
        ByteBuffer byteBuffer = encoder.encode(CharBuffer.wrap(text));
        CharBuffer charBuffer = decoder.decode(byteBuffer);
        String text1 = charBuffer.toString();
        System.out.println("text1: " + text1);
      }
    Le ho postate in dei main almeno cosi' se volete potete provarli...

    Scusate per il papiro infinito... spero di essere stati chiaro nel caso chiedete pure...

    grazie a tutti
    La vita sarebbe piu' facile se avessi il codice sorgente!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Stai usando JavaMail per inviare la email??? Allora devi andare a vedere le API di JavaMail per impostare il charset, non ingarbugliarti con i vari getBytes(), CharsetEncoder ecc...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    si si utilizzo JavaMail, l'avevo tralasciato... mi pareva scontato... :master:

    Ho girato in lungo e in largo le api JavaMail e ho provato a fare tutte le prove del caso...

    il risultato e' sempre lo stesso... a questo punto temo sia un problema di configurazione del mail server...

    anche perche' la stessa classe la settimana scorsa funzionava senza problemi...

    ho cercato una soluzione (e' da lunedi' che ci sbatto la testa) e non sono riuscita a trovarne 1...
    La vita sarebbe piu' facile se avessi il codice sorgente!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da zip2k
    Ho girato in lungo e in largo le api JavaMail e ho provato a fare tutte le prove del caso...
    Devi inviare testo "puro"?? Allora vedi:

    setText(java.lang.String text, java.lang.String charset)

    di MimeMessage
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    io ho usato:

    subtype = text/plain
    charset = ISO-8859-1

    codice:
    message.setContent(this.text, new StringBuffer(this.subtype).append("; charset=").append(this.charset).toString());
    La vita sarebbe piu' facile se avessi il codice sorgente!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da zip2k
    io ho usato:

    subtype = text/plain
    charset = ISO-8859-1

    codice:
    message.setContent(this.text, new StringBuffer(this.subtype).append("; charset=").append(this.charset).toString());
    A parte che bastava usare l'operatore + (che viene tradotto dal compilatore appunto in codice che usa StringBuffer/StringBuilder), comunque mi sembra ok. Cioè ... non vedo alcun problema, ho fatto adesso una prova spedendo con JavaMail ad un mio indirizzo di posta del testo con caratteri speciali (lettere accentate) e indicando ISO-8859-1 funziona benissimo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    A parte che bastava usare l'operatore + (che viene tradotto dal compilatore appunto in codice che usa StringBuffer/StringBuilder), comunque mi sembra ok.
    ... si, so che bastava usare l'operatore + ... pero' funziona in modo leggermente differente in memoria lo StringBuffer/StringBuilder rispetto all'operatore +, e' solo una questione di ottimizzazione.

    cmq il problema non e' questo...

    Cioè ... non vedo alcun problema, ho fatto adesso una prova spedendo con JavaMail ad un mio indirizzo di posta del testo con caratteri speciali (lettere accentate) e indicando ISO-8859-1 funziona benissimo.
    il fatto e' che ho guardato e riguardato le classi 10000 volte... e non riesco a trovare dove sia il problema.

    a questo punto penso che sia un problema di configurazione del server... anche perche' in locale mi funziona, su un server di test che ho a disposizione funziona correttamente... ma quando deployo in produzione... non funziona... e' una situazione logorante... non so piu' cosa fare/pensare...
    La vita sarebbe piu' facile se avessi il codice sorgente!

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da zip2k
    ... si, so che bastava usare l'operatore + ... pero' funziona in modo leggermente differente in memoria lo StringBuffer/StringBuilder rispetto all'operatore +, e' solo una questione di ottimizzazione.
    L'unica differenza sta nel come viene istanziato lo StringBuffer/StringBuilder.

    Con l'operatore +, il codice generato istanzia sempre prima un StringBuffer/StringBuilder vuoto (usa il costruttore senza argomenti) e poi fa tutte le append.
    Se usi esplicitamente un StringBuffer/StringBuilder, allora puoi istanziarlo passando al costruttore già una stringa, cosa che ti permette di risparmiare un append rispetto all'operatore +.

    Ma la differenza finisce qui e basta. Se la prima parte da concatenare non fosse una stringa, dovresti sostanzialmente scrivere lo stesso identico codice che genera il compilatore per l'operatore +.

    Quindi è inutile che mi vieni a sbandierare la tua "ottimizzazione", quando l'uso dell'operatore +, salvo casi particolari, è più semplice, leggibile e pratico nel 99% dei casi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    non era una critica la mia, io sapevo che al contrario dell'operatore +, l'append non andava a creare una nuova string in memoria con la concatenazione delle due stringhe, ma "ampliava" la zona di memoria dove e' allocata la stringa originaria in modo da non avere 2 locazioni di memoria allocare, con un risparmio di memoria (qui sta l'ottimizzazione), ma una sola con l'intera concatenazione...

    pero' magari mi confondo e mi sbaglio... ripeto non era una critica.
    La vita sarebbe piu' facile se avessi il codice sorgente!

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da zip2k
    io sapevo che al contrario dell'operatore +, l'append non andava a creare una nuova string in memoria con la concatenazione delle due stringhe, ma "ampliava" la zona di memoria dove e' allocata la stringa originaria in modo da non avere 2 locazioni di memoria allocare, con un risparmio di memoria (qui sta l'ottimizzazione), ma una sola con l'intera concatenazione...
    L'append() di StringBuilder/StringBuffer infatti non genera una nuova stringa .... semplicemente accoda i caratteri nel buffer (e per fare questo può essere necessario espandere la capacità, cioè riallocare l'array di char interno).

    Su Java 5 (quindi con StringBuilder), date 2 stringhe a e b:

    System.out.println (a + b);

    genera praticamente l'equivalente di:

    System.out.println (new StringBuilder().append(a).append(b).toString());

    Se usi esplicitamente lo StringBuilder, allora potresti fare:

    System.out.println (new StringBuilder(a).append(b).toString());

    risparmiando 1 append().

    Ma la questione finisce lì. In nessuno dei 2 casi viene generata una nuova stringa con l'append().
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.