2010-04-16 10 views
5

Ich schreibe einen Teil des Java-Codes, der E-Mails an Benutzer mit Nicht-ASCII-Namen senden muss. Ich habe herausgefunden, wie UTF-8 für den Rumpf, die Betreffzeile und generische Header zu verwenden, aber ich bin immer noch auf die Empfänger fest.Senden Sie javax.mail.internet.MimeMessage an einen Empfänger mit Nicht-ASCII-Namen?

Folgendes möchte ich im Feld "An:": "ウィキペディアにようこそ" <[email protected]>. Dies lebt (für unsere Zwecke heute) in einem String namens recip.

  • msg.addRecipients(MimeMessage.RecipientType.TO, recip) gibt "忙俾ェ▎S]" <[email protected]>
  • msg.addHeader("To", MimeUtility.encodeText(recip, "utf-8", "B")) wirft AddressException: Local address contains control or whitespace in string ``=?utf-8?B?IuOCpuOCo+OCreODmuODh+OCo+OCouOBq+OCiOOBhuOBk+OBnSIgPA==?= =?utf-8?B?Zm9vQGV4YW1wbGUuY29tPg==?=''

Wie zum Teufel soll ich diese Nachricht senden?


Hier ist, wie ich die anderen Komponenten behandelt:

  • Körper HTML: msg.setText(body, "UTF-8", "html");
  • Headers: msg.addHeader(name, MimeUtility.encodeText(value, "utf-8", "B"));
  • Betreff: msg.setSubject(subject, "utf-8");
+0

Verwandte Frage und Lösung: http://StackOverflow.com/A/5650455/923560 – Abdull

Antwort

5

Ugh, bekam mit ihm einen dummen Hack:

/** 
* Parses addresses and re-encodes them in a way that won't cause {@link MimeMessage} 
* to freak out. This appears to be the only robust way of sending mail to recipients 
* with non-ASCII names. 
* 
* @param addresses The usual comma-delimited list of email addresses. 
*/ 
InternetAddress[] unicodifyAddresses(String addresses) throws AddressException { 
    InternetAddress[] recips = InternetAddress.parse(addresses, false); 
    for(int i=0; i<recips.length; i++) { 
     try { 
      recips[i] = new InternetAddress(recips[i].getAddress(), recips[i].getPersonal(), "utf-8"); 
     } catch(UnsupportedEncodingException uee) { 
      throw new RuntimeException("utf-8 not valid encoding?", uee); 
     } 
    } 
    return recips; 
} 

Ich hoffe, dass dies für jemanden nützlich ist.

1

Ich weiß, das ist alt, aber das könnte jemand anderen helfen. Ich verstehe nicht, wie diese Lösung/dieser Hack etwas für das Problem getan haben könnte.

hier würde dieser Zeile wird die Adresse für recips [0]:

InternetAddress[] recips = InternetAddress.parse(addresses, false); 

und dieser Konstruktor hier ändert sich nichts als die Codierung auf dem persönlichen Namen gilt (die in diesem Fall null ist) und nicht die Adresse .

new InternetAddress(recips[i].getAddress(), recips[i].getPersonal(), "utf-8"); 

Aber etwas wie das unten würde funktionieren, vorausgesetzt, der Mailserver kann verschlüsselte Empfänger verarbeiten! (was überhaupt nicht üblich scheint ....)