2016-10-19 5 views
15

Я хочу отправить электронное письмо на адрес электронной почты, отличный от ASCII, и я не уверен, что рекомендуемая процедура с использованием JDK8.Java: отправьте электронное письмо на адрес электронной почты, отличной от ASCII

Как мне обращаться со следующими адресами электронной почты?

  1. [email protected]
  2. [email protected]örensen.de
  3. [email protected]örensen.de

Существуют ли какие-либо соображения безопасности, чтобы быть в курсе?

Будет ли этот образец кода достаточным?

import java.net.IDN; 


public class IDNMailHelper { 

    public static String toIdnAddress(String mail) { 
     if (mail == null) { 
      return null; 
     } 
     int idx = mail.indexOf('@'); 
     if (idx < 0) { 
      return mail; 
     } 
     return localPart(mail, idx) + "@" + IDN.toASCII(domain(mail, idx)); 
    } 

    private static String localPart(String mail, int idx) { 
     return mail.substring(0, idx); 
    } 

    private static String domain(String mail, int idx) { 
     return mail.substring(idx + 1); 
    } 

} 

ответ

2

Благодаря RFC6530 Вы должны фактически закодировать электронную почту как UTF-8. Это означает, что вы не должны использовать IDN здесь.
Если ваши исходящие SMTP-серверы поддерживают EAI (интернационализированные электронные письма), это не должно быть проблемой.

Имейте в виду, что EAI может представлять серьезную угрозу безопасности. Если вы решили обработать в своем приложении (услуге?), Не забудьте запретить пользователям регистрировать похожие адреса электронной почты, то есть те, которые используют разные сценарии. Например, один из этих парней, должно быть отвергнуто:

+0

6530 все еще сквозняк, нет? – bmargulies

+0

«ПРЕДЛАГАЕМЫЙ СТАНДАРТ» и «Категория: Стандарт трек» предлагает что-то еще. Это, как предполагается, будет реализовано, и я вполне уверен, что есть SMTP-серверы, поддерживающие это расширение. –

3

Paweł прав по существу, что адреса должны быть закодированы как UTF-8 если ваш сервер поддерживает это, но это сложнее, потому что в настоящее время JavaMail не поддерживает расширения сервера, которые позволяют использовать заголовки UTF-8.

Возможное обходное решение включает преобразование строки Java Unicode в кодированный байтовый массив UTF-8, а затем создание строки Java Unicode, где каждый байт является отдельным символом iso-8859-1. Я не пробовал это, поэтому я не знаю, будет ли он работать с другими проблемами, но без необходимой поддержки в JavaMail это, вероятно, ваша лучшая надежда.

Например:

address = new String(address.getBytes("utf-8"), "iso-8859-1"); 
+2

Если вы заинтересованы в тестировании версии JavaMail, которая включает поддержку заголовков, отличных от ASCII, свяжитесь со мной по адресу [email protected] –

+0

Вы попробовали выше? Вы хотите протестировать фиксированную версию JavaMail? –

+0

Я никогда не слышал от вас, поэтому я предполагаю, что это не важно для вас в конце концов. –

1

Для заголовков вашей электронной почты, решение этого RFC-2047, который определяет конкретный протокол кодирования не ISO-646 символов в электронной почте. Java Mail имеет класс для использования: MimeUtility. Punicode/IDNS не подходит для использования заголовков.

Как Билл Шеннон, другой ответчик, указанный в this answer, Java Mail, в общем, автоматически применит MimeUtil к вашим заголовкам. Что касается вопроса в комментарии о промежуточных почтовых серверах, я отвечаю только на ваш вопрос о тексте в заголовках, который ни о чем не беспокоит. Что касается сообщений протокола SMTP, необходимых для фактического получения сообщения в нужном месте, я не утверждаю, что знаю.

+0

Можете ли вы рассказать, как использовать класс MimeUtility для кодирования адреса электронной почты, отличного от ASCII? Кроме того, какие гарантии у меня есть, электронная почта не будет отклонена серверами электронной почты на ее маршруте? – Adrian