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

Posted

技术标签:

【中文标题】在 Java 中解析 RFC 2822 电子邮件地址【英文标题】:Parse RFC 2822 email addresses in Java 【发布时间】:2013-09-01 02:59:51 【问题描述】:

许多人不知道,电子邮件地址需要一个库来解析。像@(.*) 这样的简单正则表达式是不够的。电子邮件地址甚至可以包含 cmets,其中可以包含 @ 等字符,从而破坏简单的正则表达式。

有一个 Node.js library 可以解析 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 部分,它不包含要执行的方法。

我很惊讶我找不到解决这个问题的通用库,但想必很多人都有这个问题。使用图书馆如何解决这个问题?

【问题讨论】:

域名中可以出现cmets吗?如果没有,只需解析lastIndexOf("@")之后的电子邮件地址 @SotiriosDelimanolis 是的,他们可以。 【参考方案1】:

大多数情况下,无需将地址拆分为其组成部分,因为您无法对这些部分进行任何操作。假设您有一个有效的需求,那么有一些库可以进行比 JavaMail 更完整的验证。 Here's one I found quickly.我确定还有其他人。

【讨论】:

嗯,特别是我现在需要该域 - 尝试例如从“user@gmail.com”中提取“gmail.com”。我真的很惊讶我在 Javamail 或 Apache 的东西中找不到这个,但我会看看你的链接。我想从构建 IMAP 或 SMTP 客户端或服务器的角度来看,这可能不太有用,但我们更多地使用这些东西来分析电子邮件(分类为个人/订阅等)【参考方案2】:

如果您只需要从电子邮件地址获取域部分(请注意邮件组,因为它们没有@),您可以这样做:

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

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

PS 也可能是地址包含路由信息:

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

或地址文字:

peter@[192.168.134.1]

【讨论】:

以上是关于在 Java 中解析 RFC 2822 电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

如何从 python 中的 RFC 2822 邮件标头中提取多个电子邮件地址?

给定 [] 邮箱中的地址不符合 RFC 2822, 3.6.2。当电子邮件在变量中时

RFC 2822兼容(大部分)电子邮件地址正则表达式

RFC 2822电子邮件验证

正则表达式根据 RFC2822 验证消息 ID

电子邮件地址(RFC 2822)