java-internetaddress不能用几种语言验证国际邮件

nzk0hqpo  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(214)

我需要验证国际电子邮件ID的用户名和域名在外国字符。为此,我使用 InternetAddress() 上课地点 javax.mail.internet.InternetAddress . 虽然这项技术对某些语言很有效,但对少数语言却不起作用。
我编写了一个小程序来测试它是否可以验证电子邮件地址:

import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress;

public class EmailTest {

    public static boolean isEmailValid(String emailId) throws AddressException {
        InternetAddress internetAddress = new InternetAddress(emailId);
        internetAddress.validate();
        return true;
    }

    public static void main(String[] args){
        String[] emailIds = {
                "jayesh平仮名@aio.com",
                "用户@例子.广告",
                "用户@例子.广告.net",
                "अजय@डाटा.भारत.in",
                "अजय@डाटा.भारत",
                "अजय@gmail.com",
                "квіточка@пошта.укр",
                "χρήστης@παράδειγμα.ελ",
                "Dörte@Sörensen.example.com",
                "коля@пример.рф",
                "иван.сергеев@пример.рф"
        };

        for(String s:emailIds){
            try{
                if(isEmailValid(s)){
                    System.out.println(s + " -> Valid");
                }
            }catch (AddressException e) {
                System.out.println(s + " -> InValid; Reason: " + e);
            }
        }
    }
}

输出:

jayesh平仮名@aio.com -> Valid
用户@例子.广告 -> Valid
用户@例子.广告.net -> Valid
अजय@डाटा.भारत.in -> InValid; Reason: javax.mail.internet.AddressException: Domain contains illegal character in string ``अजय@डाटा.भारत.in''
अजय@डाटा.भारत -> InValid; Reason: javax.mail.internet.AddressException: Domain contains illegal character in string ``अजय@डाटा.भारत''
अजय@gmail.com -> Valid
квіточка@пошта.укр -> Valid
χρήστης@παράδειγμα.ελ -> Valid
Dörte@Sörensen.example.com -> Valid
коля@пример.рф -> Valid
иван.сергеев@пример.рф -> Valid

如你所见 用户@例子.广告 显示为有效,而 अजय@डाटा.भारत 显示为无效的电子邮件地址。
这种行为背后的原因是什么?有没有办法解决这个问题,这样它就可以验证所有的语言?

xqnpmsa8

xqnpmsa81#

如果添加一堆字母,并检查域名:

for (String s : emailIds) {
        try {
            if (isEmailValid(s)) {
                System.out.println(s + " -> Valid");
            }
        } catch (AddressException e) {
            System.out.println(s + " -> InValid; Reason: " + e);
            s.codePoints().forEach(cp -> System.out.printf(
                    "- %s : %s, #%x, alpha %s%n",
                    new String(Character.toChars(cp)), Character.getName(cp),
                    Character.getType(cp), Character.isAlphabetic(cp)));
        }
    }

अजय@डाटा.भारत -> 无效;原因:javax.mail.internet.addressexception:域的字符串中包含非法字符``अजय@डाटा.भारत''
अ : 梵文字母a,#5,阿尔法真
ज : 梵文字母ja,#5,阿尔法真
य : 梵文字母ya,#5,阿尔法真
@:商业,18,阿尔法假
ड : 梵文字母dda,#5,alpha true
ा : 天成文书元音标记aa,#8,alpha true
ट : 梵文字母tta,#5,阿尔法真
ा : 天成文书元音标记aa,#8,alpha true
. : 句号,#18,alpha false
भ : 梵文字母bha,#5,阿尔法真
ा : 天成文书元音标记aa,#8,alpha true
र : 梵文字母ra,#5,阿尔法真
त : 梵文字母ta,#5,阿尔法真
如果有人要删除元音符号,电子邮件地址是可以接受的。

s = s.replace(" ा", "");

我尝试使用unicode标准化(结合devangari元音符号)没有用,它可以用于结合音调符号,使用 java.text.Normalizer .

s = Normalizer.normalize(s, Normalizer.Form.NFKC);

因为我不熟悉梵文伽里文字,你可以自己研究一下。

相关问题