it-swarm.com.de

Java Mail API - Probleme beim Kodieren

Ich verwende Java Mail API und versuche, eine E-Mail über SMTP von Google Mail zu senden. Funktionsweise meines Programms: Die Klasse Java.util.Scanner wird verwendet, um Benutzereingaben abzurufen - I ' m den Benutzer nach verschiedenen Parametern fragen, die in der Mail-Sendeklasse verwendet werden sollen; was macht das Folgende:

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

Alles funktioniert, solange ich ASCII Symbole/Zeichen verwende. Wann immer ich "länderspezifische" Zeichen verwenden möchte - wie [õäöü] -, bekomme ich eine Menge seltsamer Symbole ...

Bisher verwendete Techniken (die für mich nicht funktionieren):

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

Hinweis: In einem IDE wird alles korrekt angezeigt, wenn System.out.println () ausgeführt wird, um die zu sendende Nachricht anzuzeigen.

EDIT: e.x. Wenn der gesendete Nachrichtentext [õäöü] ist, wird [ä „“?] in Google Mail angezeigt.

BEARBEITEN: Wenn mailMessage.setText(MimeUtility.encodeText(mail.getMessage(), "UTF-8", "Q")); verwendet wird, lautet die Ausgabe in Google Mail: 

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

EIN ANDERER BEARBEITUNG: Interessanterweise, wenn ich Folgendes mache: mailMessage.setText(strVar + "õäöü", "ISO-8859-1"); Es hängt tatsächlich "õäöü" in meiner E-Mail an (aber der erste Teil [strVar] der Zeichenfolge ist noch voll mit? Und []).

11
Furlando

Grundsätzlich funktioniert mein Code gut, wie es sein soll. Es war das Cmd, das nicht mit ASCII-Buchstaben umgehen konnte. Ich habe eine Bat-Datei verwendet, um auf ein Glas zuzugreifen. Ich denke, ich werde dann einfach eine kleine grafische Benutzeroberfläche erstellen ... Vielen Dank an alle für die Antwort.

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

Man muss also die Zeichenkodierung für Körper und Betreff einstellen.


Nachtrag wegen Kommentar von @bartac

Führen Sie für die entsprechende MimeBodyParteine setHeader("Content-Type", "text/plain; charset=UTF-8") aus.

14
Joop Eggen

Sie sollten setText(String text, String charset) oder setText(String text, String charset, String subtype) verwenden, um den Textkörper mit einer bestimmten Kodierung festzulegen.

MimeUtility.encodeText() ist nicht für Haupttext gedacht, sondern nur für kodierten Text in Kopfzeilen (und dann nur für mit setHeader oder addHeader gesetzte Kopfzeilen).

5
Mark Rotteveel

Folgendes hat für mich gearbeitet:

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

Dabei sind subject und body regulär String-Objekte ohne besondere Behandlung (Code und Benutzeroberfläche verwenden UTF-8).

2

1- Sie möchten eine E-Mail mit dieser Zeichenfolge im Hauptteil senden:

"Olá João!"

2 - Da der Code auf dem GAE-Server ausgeführt wird, wird diese Zeichenfolge mit der Standardkodierung ASCII interpretiert. Um diese E-Mail mit den richtigen Akzentzeichen zu senden, definieren Sie den String als:

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

Die Sonderzeichen werden manuell mit ihren UTF-8-Codes definiert. Suchen Sie die benötigten Codes in der Tabelle http://www.utf8-chartable.de/

3- Konvertieren Sie die Zeichenfolge in UTF-8. Alle manuell eingegebenen Codes werden nun korrekt interpretiert: 

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");
0
supertreta

Verwenden Sie die encodeText-Methode von MimeUtility:

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

(Ich weiß nicht, was "B" bedeutet, bleib ruhig und benutze es einfach. Eigentlich kann es "B" oder "Q" sein.)

0
Mark Szabo
JavaMailSenderImpl emailSender = new JavaMailSenderImpl();
mailSender.setHost("...");

MimeMessage message = emailSender.createMimeMessage();
message.setSubject("...", "UTF-8");
message.setText("...", "UTF-8");

MimeMessageHelper helper = new MimeMessageHelper(message, "UTF-8");
helper.setFrom(from);
helper.setTo(to);

emailSender.send(message);
0
Taras Melnyk

Falls Sie HTML-Nachrichten verwenden, versuchen Sie Folgendes:

Message message = new MimeMessage(session);
message.setContent(htmlText, "text/html; charset=UTF-8");
0
Ruslan Sheremet