Проблема Javamail с символами в почтовых адресах - PullRequest
5 голосов
/ 05 января 2011

У меня проблемы с методом разбора при использовании символа ñ:

essage.setRecipients(Message.RecipientType.TO, internetAddress.parse("somedir.withñchar@m ailserver.com",false));

Я передаю false для строгого параметра, но всегда получаю ошибку:

javax.mail.internet.AddressException: Local address contains control or whitespace in string ``somedir.with±har@mailserver.com''
at Mailer.main(Mailer.java:386)
Caused by: javax.mail.internet.AddressException: Local address contains control
or whitespace in string ``somedir.with±har@mailserver.com''
        at javax.mail.internet.InternetAddress.checkAddress(InternetAddress.java
:1155)
        at javax.mail.internet.InternetAddress.parse(InternetAddress.java:1044)
        at javax.mail.internet.InternetAddress.parse(InternetAddress.java:575)
        at Mailer.main(Mailer.java:377)

Ответы [ 6 ]

5 голосов
/ 10 февраля 2012

Если у вас все еще есть проблема, я советую вам добавить двойные кавычки на ваш необычный адрес электронной почты , как я это сделал.Это сработало для меня, потому что метод checkAddress в InternetAddress сдается для проверки указанного адреса.Это простое и быстрое решение.

Пример:

unusual_email_without_at_sign_or_with_accentuátion (won't work)
"unusual_email_without_at_sign_or_with_accentuátion" (it works!)

Идеальным и правильным решением было бы исправление Java Team InternetAddress class 'bug что даже получая "strict = false" в конструкторе проверяет синтаксис электронной почты, когда это не должно быть.

Пример ошибки:

InternetAddress i = new InternetAddress("unusual_email_without_at_sign_or_with_accentuátion ", false)

Пример обходного решения:

InternetAddress i = new InternetAddress("\"unusual_email_without_at_sign_or_with_accentuátion\"", false)

Подход к созданию нового класса, расширяющего Address, не будет работать, так как Transport.send () длякажется, что какая-то причина снова подтверждает адрес, и исключение также запускается.

Пожалуйста, дайте нам знать, если это помогло!

3 голосов
/ 05 января 2011

Убедитесь, что ваш - на самом деле n-тильда.Следующее прекрасно работает для меня

InternetAddress[] list = InternetAddress.parse("fred.joñes@example.com", false);
for (InternetAddress a : list) {
    System.out.println("[" + a + "]");
}

Это также работает при замене ñ на экранирование Юникодом (в исходном файле .java)

InternetAddress[] list = InternetAddress.parse("fred.jo\u00F1es@example.com", false);

Вы можете попробовать заменить его следующим образомпросто как тест.

Редактировать: Кстати, я также использовал parse ("...") с адресом и без второго параметра, и передал true для строгого, оба из которых также работали.

0 голосов
/ 23 сентября 2015

Чтобы отправлять электронные письма на адреса с непечатаемыми символами (например, ñ), необходимо кодировать адрес электронной почты, используя UTF-8.

Подчеркнутые символы недопустимы в оригинале RFC 5322 Формат интернет-сообщения . Но с тех пор RFC 6532 (интернационализированные заголовки электронной почты) предложили способ использования международных символов в адресах электронной почты.

Проверьте этот вопрос StackOverflow для получения более подробной информации.

0 голосов
/ 06 января 2011

Анализатор адресов JavaMail сообщает вам кое-что очень важное: вы можете использовать только обычные печатаемые символы ASCII слева от знака @ в адресе электронной почты. Проверьте RFC 5322 для ABNF для действительных адресов электронной почты :

addr-spec       =   local-part "@" domain

local-part      =   dot-atom / quoted-string / obs-local-part

dot-atom        =   [CFWS] dot-atom-text [CFWS]

dot-atom-text   =   1*atext *("." 1*atext)

atext           =   ALPHA / DIGIT /    ; Printable US-ASCII
                    "!" / "#" /        ;  characters not including
                    "$" / "%" /        ;  specials.  Used for atoms.
                    "&" / "'" /
                    "*" / "+" /
                    "-" / "/" /
                    "=" / "?" /
                    "^" / "_" /
                    "`" / "{" /
                    "|" / "}" /
                    "~"

quoted-string   =   [CFWS]
                    DQUOTE *([FWS] qcontent) [FWS] DQUOTE
                    [CFWS]

qcontent        =   qtext / quoted-pair

quoted-pair     =   ("\" (VCHAR / WSP)) / obs-qp

qtext           =   %d33 /             ; Printable US-ASCII
                    %d35-91 /          ;  characters not including
                    %d93-126 /         ;  "\" or the quote character
                    obs-qtext

Прежде чем идти дальше, убедитесь, что адрес правильный.

0 голосов
/ 06 января 2011

Может быть, ваш текстовый редактор не сохраняет ваш исходный файл как UTF8, но как ASCII, так что ваша ня запуталась Убедитесь, что вы сохраняете его как UTF8. Также может быть опция компиляции, необходимая для компиляции файла .java, когда он сохраняется как UTF8. Я давно этого не делал, но помню, что так было.

0 голосов
/ 05 января 2011

Создайте новый класс, расширьте его и переопределите функцию проверки. Однако я не понимаю, почему вы этого хотите.

public class invalidInternetAddress extends internetAddress {

  @Override
  private static void checkAddress() throws AddressException {
  }
}
...