2012-12-20 12 views
9

Utilizzo API Java Mail e sto tentando di inviare un'email tramite SMTP di Gmail. Come funziona il mio programma: java.util.Scanner la classe viene utilizzata per ottenere l'input dell'utente - Chiedo all'utente di utilizzare vari parametri nella classe di invio della posta; che fa quanto segue:Java Mail - Problemi di codifica

Message mailMessage = new MimeMessage(session); 
mailMessage.setFrom(new InternetAddress("[email protected]")); 
mailMessage.setRecipients(Message.RecipientType.TO,InternetAddress.parse(mail.getTo())); 
mailMessage.setSubject(mail.getSubject()); 
mailMessage.setText(mail.getMessage()); 
Transport.send(mailMessage); 

Tutto funziona fintanto che utilizzo simboli/caratteri ASCII. Ma ogni volta che voglio usare caratteri "specifici per paese" - come [õäöü] - ottengo un sacco di simboli dall'aspetto strano ...

Tecniche che ho usato finora (che non funzionano per me):

setHeader("Content-Type", "text/plain; charset=UTF-8"); 
setHeader("Content-Encoding","ISO-8859-9"); 
setContent(message, "text/plain; charset=iso-8859-2"); 

Nota: tutto è visualizzato correttamente all'interno di un IDE quando viene eseguita System.out.println() per visualizzare il messaggio da inviare.

MODIFICA: e.x. quando il corpo del messaggio inviato è [õäöü] Viene visualizzato [ä ""?] in Gmail.

EDIT: Quando si utilizza mailMessage.setText(MimeUtility.encodeText(mail.getMessage(), "UTF-8", "Q"));, allora l'uscita di Gmail è la seguente:

"=?UTF-8?Q?=C3=A4=E2=80=9E=E2=80=9D=EF=BF=BD;=0D=0A?=" 

ALTRO EDIT: È interessante notare che, quando lo faccio: mailMessage.setText(strVar + "õäöü", "ISO-8859-1"); Si aggiunge in realtà "õäöü" bene nella mia e-mail (ma il la prima parte [strVar] della stringa è ancora piena di? 's e []' s).

+0

Come si imposta 'strVar' ?, e cosa succede se si assegna' strVar' immediatamente prima di 'mailMessate.setText (..)'? Forse il contenuto che ricevi dallo scanner non è lo stesso della stringa che funziona. –

+0

Ho cambiato il mio codice un po 'per permettere a me di inviare HTML, quindi il mio metodo di invio è: 'message.setContent ("

[õäöü]

"+ strVar +"

", "text/html"); ' Quando ottengo una mail, l'HTML viene analizzato correttamente, quindi è" [õäöü] ", ma' strVar' sembra "venire" in modo errato. Ho una classe 'Input' e' get() 'metodo all'interno di esso: ' public String get() { /* dichiarazione Scanner qui */ ritorno scanner.nextLine(); } ' E in seconda classe' MailSender' inizializzo 'strVar' così: ' /* classe di ingresso dichiarazione */ String = strVar input.get(); // Scusa, difficile scrivere il codice qui :) – Furlando

+0

Puoi verificare quali caratteri sono presenti nella stringa (e in che modo si confronta con i caratteri nel caso in cui funziona)? –

risposta

2

Fondamentalmente, il mio codice funziona bene, come previsto. Era il cmd, che non poteva gestire le lettere non ascii. Ho usato un file bat per accedere a un jar. Penso che farò solo una piccola GUI ... Grazie a tutti per aver risposto.

+0

Ciao a tutti, ho lo stesso problema con i caratteri francesi, ho provato questo codice: messaggio MimeMessage = nuovo MimeMessage (sessione); message.setSubject (subject, "UTF-8"); messaggio.setBody (corpo, "UTF-8"); Il corpo viene generato correttamente ma il soggetto non viene visualizzato correttamente. Qualcuno mi aiuta –

5

È necessario utilizzare setText(String text, String charset) o setText(String text, String charset, String subtype) per impostare il corpo del testo con una codifica specifica.

MimeUtility.encodeText() non è inteso per il corpo del testo, ma solo per il testo codificato nelle intestazioni (e quindi solo per le intestazioni impostate con setHeader o addHeader).

+0

Ho usato questo: 'mailMessage.setText (" input da Scanner qui "," ISO-8859-1 ");' Ma nulla è cambiato ... Cos'altro potrebbe essere il problema? – Furlando

9
MimeMessage message = new MimeMessage(session); 
    message.setSubject(subject, "UTF-8"); 
    message.setText(body, "UTF-8"); 

Quindi è necessario impostare la codifica dei caratteri per entrambi, corpo e soggetto.

+1

Usando 'setText' si imposta anche l'intestazione' Content-Type' (e se si guarda attraverso il codice si vedrà che le intestazioni 'Content-Type' e' Content-Transfer-Encoding' esistenti vengono rimosse dopo aver impostato qualsiasi contenuto usando ' setText' o 'setContent') –

+0

@MarkRotteveel grazie, rimuoverò il ridondante' setHeader ("Content-Type", "text/plain; charset = UTF-8") '. –

0

1- Si consideri che si desidera inviare una e-mail con questa stringa nel corpo:

"Olá João!" 

2 - Quando il codice viene eseguito nel server GAE, questa stringa viene interpretata con la codifica di default ASCII. Per inviare questa e-mail con i caratteri accentati corretti, definire la stringa come:

String body = "Ol\u00e1 Jo\u00e3o!"; 

I caratteri speciali sono definiti manualmente con i suoi codici UTF-8. Cerca i codici necessari nella tabella http://www.utf8-chartable.de/

3- Convertire la codifica della stringa in UTF-8.Tutti i codici digitati manualmente verranno ora correttamente interpretato:

Session session = Session.getDefaultInstance(props); 
MimeMessage message = new MimeMessage(session); 
String encodedSubject = new String (subject.getBytes("UTF-8"),"UTF-8"); 
String encodedBody = new String (body.getBytes("UTF-8"),"UTF-8"); 
message.setSubject(encodedSubject, "UTF-8"); 
message.setText(encodedBody, "UTF-8"); 
2

Di seguito ha lavorato per me:

MimeMessage message = ... 
message.setSubject(subject, "UTF-8"); 
message.setContent(body, "text/plain; charset=UTF-8"); 

Dove subject e body sono oggetti String regolari con nessun trattamento speciale (codice e usare l'interfaccia utente UTF -8).

0

utilizzare il metodo encodeText da MimeUtility:

MimeUtility.encodeText(mail_subject, "UTF-8", "B") 

(non so cosa significa "B", calma e gesso, e basta usare realtà può essere "B" o "Q"..)

+1

B sta per codifica Base64 in questo caso. Q sta per quoted-stampabile. Vuoi scegliere quello che rappresenta la codifica dei dati nella tua parola codificata. Nella domanda originale, è stato usato il preventivo stampabile, quindi Q sarebbe la scelta giusta qui –