2016-10-19 32 views
15

Tôi muốn gửi email đến địa chỉ email không phải ASCII và tôi không chắc chắn quy trình được đề xuất sử dụng JDK8 là gì.Java: Gửi email đến địa chỉ email không phải ASCII

Tôi nên xử lý các địa chỉ email sau đây như thế nào?

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

Có bất kỳ vấn an ninh phải nhận thức được?

Mã mẫu này có đủ không?

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); 
    } 

} 

Trả lời

2

Do RFC6530 bạn nên mã hóa email dưới dạng UTF-8. Điều này có nghĩa là bạn không nên sử dụng IDN tại đây.
Nếu máy chủ SMTP đi của bạn hỗ trợ EAI (email được quốc tế hóa), điều đó không phải là vấn đề.

Hãy nhớ rằng EAI có thể gây ra rủi ro bảo mật nghiêm trọng. Nếu bạn quyết định xử lý trong ứng dụng của mình (dịch vụ?), Hãy đảm bảo ngăn người dùng đăng ký các địa chỉ email tương tự, ví dụ: địa chỉ email sử dụng các tập lệnh khác nhau. Ví dụ, một trong những kẻ nên bị từ chối:

+0

6530 vẫn là bản nháp, phải không? – bmargulies

+0

"TIÊU CHUẨN ĐỀ XUẤT" và "Danh mục: Theo dõi tiêu chuẩn" đề xuất nội dung khác. Đó là cách nó giả sử được thực hiện và tôi hoàn toàn tin rằng có các máy chủ SMTP ngoài đó hỗ trợ phần mở rộng này. –

3

Paweł là cơ bản đúng rằng các địa chỉ cần được mã hóa theo UTF-8 nếu máy chủ của bạn hỗ trợ điều đó, nhưng nó phức tạp hơn vì hiện tại JavaMail không hỗ trợ các phần mở rộng máy chủ cho phép sử dụng các tiêu đề UTF-8.

Cách giải quyết có thể liên quan đến việc chuyển đổi chuỗi Unicode Java thành mảng byte được mã hóa UTF-8, sau đó tạo một chuỗi Unicode Java trong đó mỗi byte là một ký tự iso-8859-1 riêng biệt. Tôi đã không cố gắng này vì vậy tôi không biết nếu nó sẽ chạy vào các vấn đề khác, nhưng không có sự hỗ trợ cần thiết trong JavaMail chính nó có lẽ là hy vọng tốt nhất của bạn.

Ví dụ:

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

Nếu bạn quan tâm đến việc kiểm tra phiên bản JavaMail bao gồm hỗ trợ cho tiêu đề không phải ASCII, hãy liên hệ với tôi theo địa chỉ [email protected] –

+0

Bạn đã thử ở trên chưa? Bạn có muốn thử nghiệm một phiên bản JavaMail cố định không? –

+0

Tôi chưa bao giờ nghe lại từ bạn vì vậy tôi cho rằng điều này không quan trọng đối với bạn sau tất cả. –

1

Đối với các tiêu đề của email, các giải pháp này là RFC-2047, trong đó xác định một giao thức mã hóa cụ thể cho phi tiêu chuẩn ISO-646 ký tự trong email. Java Mail có một lớp để sử dụng: MimeUtility. Punicode/IDNS không phù hợp để sử dụng tiêu đề.

Như Bill Shannon, một người trả lời khác ở đây, được chỉ ra trong this answer, Java Mail sẽ, nói chung, áp dụng MimeUtil cho tiêu đề của bạn tự động. Đối với một câu hỏi trong một bình luận về các máy chủ thư intervening, tôi chỉ trả lời câu hỏi của bạn về văn bản trong các tiêu đề, mà không có gì sẽ bận tâm. Đối với các thông điệp giao thức SMTP cần thiết để thực sự nhận được thông điệp đến đúng nơi, tôi không yêu cầu được biết.

+0

Bạn có thể giải thích cách tôi sử dụng lớp MimeUtility để mã hóa một địa chỉ email không phải ASCII không? Ngoài ra, những gì đảm bảo tôi có email sẽ không bị từ chối bởi các máy chủ email trên tuyến đường của nó? – Adrian

Các vấn đề liên quan