Отправить javax.mail.internet.MimeMessage получателю с именем, отличным от ASCII? - PullRequest
5 голосов
/ 17 апреля 2010

Я пишу фрагмент кода Java, который должен отправлять почту пользователям с именами, отличными от ASCII. Я выяснил, как использовать UTF-8 для тела, строки темы и общих заголовков, но я все еще застрял на получателях .

Вот что я хотел бы в поле «Кому:»: "ウィキペディアにようこそ" <foo@example.com>. Он живет (для наших сегодняшних целей) в строке под названием recip.

  • msg.addRecipients(MimeMessage.RecipientType.TO, recip) дает "忙俾ェ▎S]" <foo@example.com>
  • msg.addHeader("To", MimeUtility.encodeText(recip, "utf-8", "B")) бросков AddressException: Local address contains control or whitespace in string ``=?utf-8?B?IuOCpuOCo+OCreODmuODh+OCo+OCouOBq+OCiOOBhuOBk+OBnSIgPA==?= =?utf-8?B?Zm9vQGV4YW1wbGUuY29tPg==?=''

Какого черта я должен отправить это сообщение?


Вот как я обработал другие компоненты:

  • Тело HTML: msg.setText(body, "UTF-8", "html");
  • Заголовки: msg.addHeader(name, MimeUtility.encodeText(value, "utf-8", "B"));
  • Тема: msg.setSubject(subject, "utf-8");

Ответы [ 2 ]

5 голосов
/ 17 апреля 2010

Тьфу, получил это с помощью глупого хака:

/**
 * 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;
}

Надеюсь, это кому-нибудь пригодится.

1 голос
/ 01 августа 2014

Я знаю, что это старо, но это может помочь кому-то еще. Я не понимаю, как это решение / взлом мог сделать что-нибудь для этой проблемы.

Эта строка задает адрес для рецептов [0]:

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

и этот конструктор здесь ничего не меняет, так как кодировка применяется к личному имени (в данном случае пустому), а не к адресу.

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

Но что-то подобное ниже будет работать при условии, что почтовый сервер может обрабатывать закодированных получателей! (что пока не кажется обычным ....)

recip = MimeUtility.encodeText(recip, "utf-8", "B");
InternetAddress[] addressArray = InternetAddress.parse(recip , false);
msg.addRecipients(MimeMessage.RecipientType.TO, addressArray);
...