在 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 邮件标头中提取多个电子邮件地址?