在Java中解析RFC 2822电子邮件地址

6
许多人并不知道,电子邮件地址需要使用库进行解析。简单的正则表达式,例如@(.*),是不够的。 电子邮件地址甚至可以包含注释,这些注释可以包含像@这样的字符,从而破坏了简单的正则表达式。
有一个 Node.js库 可以解析RFC 2822地址:
var address = addresses[0];
console.log("Email address: " + address.address);
console.log("Email name: " + address.name());
console.log("Reformatted: " + address.format());
console.log("User part: " + address.user());
console.log("Host part: " + address.host());

这是一个几乎直接移植自perl模块Mail::Address的内容。

我认为在Java的InternetAddress类中应该有这样的内容,但它没有将地址拆分得比完整地址更细致,其中可能包括user@gmail.com。 但是我正在尝试提取gmail.com部分,而它没有提供相应的方法。

我很惊讶找不到解决这个问题的常见库,但估计很多人都遇到了这个问题。如何使用库或其他方式解决这个问题?


1
评论可以出现在域名中吗?如果不行,只需在 lastIndexOf("@") 后解析电子邮件地址。 - Sotirios Delimanolis
@SotiriosDelimanolis 是的,他们可以。 - djechlin
2个回答

2
如果你只需要从电子邮件地址中获取域名部分(注意邮件组,因为它们没有@符号),可以像这样操作:

int index = "user@domain.com".lastIndexOf("@");
String domain = "user@domain.com".substring(index+1);

我在这里使用了lastIndexOf,因为根据RFC2822电子邮件地址可能包含多个@符号(如果已转义)。 如果您想跳过邮寄组,InternetAddress类中有一个isGroup()方法。

另外,该地址可能包含路由信息。

@donald.mit.edu,@mail.mit.edu:peter@hotmail.com

或者地址字面值:
peter@[192.168.134.1]

0
大多数情况下,没有必要将地址拆分为其组成部分,因为您无法使用这些部分。假设您有一个有效的需求,那么有一些库可以进行比JavaMail更完整的验证。这是我快速找到的一个。我相信还有其他的。

1
现在我特别需要域名 - 比如从"user@gmail.com"中提取"gmail.com"。我真的很惊讶在Javamail或Apache的东西中找不到这个,但我会看看你的链接。我猜从构建IMAP或SMTP客户端或服务器的角度来看,这可能没有那么有用,但我们更多地使用这些东西来分析电子邮件(将其分类为个人/订阅等)。 - djechlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接