2016-10-19 3 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

"PROPOSED STANDARD"및 "Category : Standards track"은 다른 것을 제안합니다. 그것은 어떻게 구현 될 것인가이며이 확장을 지원하는 SMTP 서버가 있다는 것을 확신합니다. –

3

파블는 주소가 UTF-8로 인코딩되어야한다는 본질적으로 옳다 서버가이를 지원하지만 현재 JavaMail이 UTF-8 헤더의 사용을 허용하는 서버 확장을 지원하지 않기 때문에보다 복잡합니다.

가능한 해결 방법은 Java 유니 코드 문자열을 UTF-8 인코딩 된 바이트 배열로 변환 한 다음 각 바이트가 별도의 iso-8859-1 문자 인 Java 유니 코드 문자열을 만드는 것입니다. 나는 이것을 시도하지 않았기 때문에 다른 문제가 발생할지 모르지만 JavaMail 자체에서 필요한 지원이 없다면 아마도 이것이 최선의 희망 일 것입니다. 예를 들어

: 이메일의 헤더

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

비 ASCII 헤더 지원을 포함하는 JavaMail 버전 테스트에 관심이 있으시면 [email protected]으로 문의하십시오. –

+0

위 내용을 시도 했습니까? 고정 된 버전의 JavaMail을 테스트 하시겠습니까? –

+0

나는 너에게서 결코 들리지 않았다 그래서 나는 이것이 결국 너에게 중요하지 않다고 가정하고있다. –

1

,이에 대한 해결책은 이메일에서 비 ISO-646 문자를 특정 인코딩 프로토콜을 정의 RFC-2047이다. Java Mail에는 이것을 사용하기위한 클래스가 있습니다 : MimeUtility. Punicode/IDNS는 헤더 사용에 부적합합니다.

다른 답변자 인 Bill Shannon은 this answer에 지적했듯이 일반적으로 Java Mail은 MimeUtil을 헤더에 자동으로 적용합니다. 중재하는 메일 서버에 관한 의견에 대한 질문에서 헤더의 텍스트에 대한 질문에 답할뿐입니다. 실제로 올바른 위치로 메시지를 가져 오는 데 필요한 SMTP 프로토콜 메시지에 관해서는 알지 못합니다.

+0

MimeUtility 클래스를 사용하여 비 ASCII 전자 메일 주소를 인코딩하는 방법을 자세히 설명 할 수 있습니까? 또한 내가 이메일을 가지고 있다는 보장이 이메일 서버에 의해 거부되지 않을 것이다. – Adrian

관련 문제