Swift实现的国际电子邮件地址语法验证器,基于RFC822、RFC2047、RFC5321、RFC5322和RFC6531。由于电子邮件地址是本地 @ 远程的格式,因此验证器还包括 IPAddressSyntaxValidator 和 SwiftPublicSuffixList 库。
这个 Swift 包在运行时不需要 Internet 连接,唯一的依赖是 SwiftPublicSuffixList 库。
您可以使用 Swift Package Manager 来安装 SwiftEmailValidator,只需将其添加到您的 Package.swift 文件中即可
import PackageDescription
let package = Package(
name: "MyApp",
targets: [],
dependencies: [
.Package(url: "https://github.com/ekscrypto/SwiftEmailValidator.git", .upToNextMajor(from: "1.0.2"))
]
)
默认情况下,域名会根据 公共后缀列表,使用 SwiftPublicSuffixList 库进行验证。
简单用例
if EmailSyntaxValidator.correctlyFormatted("email@example.com") {
print("email@example.com respects Email syntax rules")
}
if let mailboxInfo = EmailSyntaxValidator.mailbox(from: "santa.claus@northpole.com") {
// mailboxInfo.email == "santa.claus@northpole.com"
// mailboxInfo.localPart == .dotAtom("santa.claus")
// mailboxInfo.host == .domain("northpole.com")
}
if let mailboxInfo = EmailSyntaxValidator.mailbox(from: "\"Santa Claus\"@northpole.com") {
// mailboxInfo.email == "\"Santa Claus\"@northpole.com"
// mailboxInfo.localPart == .quotedString("Santa Claus")
// mailboxInfo.host == .domain("northpole.com"")
}
允许 IPv4/IPv6 地址
if EmailSyntaxValidator.correctlyFormatted("email@[127.0.0.1]", allowAddressLiteral: true) {
print("email@[127.0.0.1] also respects since address literals are allowed")
}
if let mailboxInfo = EmailSyntaxValidator.mailbox(from: "email@[IPv6:fe80::1]", allowAddressLiteral: true) {
// mailboxInfo.email == "email@[IPv6:fe80::1]"
// mailboxInfo.localPart == .dotAtom("email")
// mailboxInfo.host == .addressLiteral("IPv6:fe80::1")
}
验证编码为 ASCII (RFC2047) 的 Unicode 电子邮件
if let mailboxInfo = EmailSyntaxValidator.mailbox(from: "=?utf-8?B?7ZWcQHgu7ZWc6rWt?=", compatibility: .asciiWithUnicodeExtension) {
// mailboxInfo.email == "=?utf-8?B?7ZWcQHgu7ZWc6rWt?="
// mailboxInfo.localpart == .dotAtom("한")
// mailboxInfo.host == .domain("x.한국")
}
验证使用自动 RFC2047 编码的 Unicode 电子邮件
if let mailboxInfo = EmailSyntaxValidator.mailbox(from: "한@x.한국", options: [.autoEncodeToRfc2047], compatibility.asciiWithUnicodeExtension) {
// mailboxInfo.email == "=?utf-8?b?7ZWcQHgu7ZWc6rWt?="
// mailboxInfo.localpart == .dotAtom("한")
// mailboxInfo.host == .domain("x.한국")
}
强制仅 ASCII 兼容性
if !EmailSyntaxValidator.correctlyFormatted("한@x.한국", compatibility: .ascii) {
// invalid email for ASCII-only support
}
if EmailSyntaxValidator.correctlyFormatted("hello@world.net", compatibility: .ascii) {
// Email is valid for ASCII-only systems
}
如果您实现自己的 PublicSuffixList 规则,或者像推荐的那样管理您自己的本地规则副本
let customRules: [[String]] = [["com"]]
if let mailboxInfo = EmailSyntaxValidator.mailbox(from: "santa.claus@northpole.com", domainValidator: { PublicSuffixList.isUnrestricted($0, rules: customRules)}) {
// mailboxInfo.localPart == .dotAtom("santa.claus")
// mailboxInfo.host == .domain("northpole.com")
}
EmailSyntaxValidator 函数都接受一个 domainValidator 闭包,默认情况下,该闭包使用 SwiftPublicSuffixList 库。 如果应将域视为有效,则此闭包应返回 true,否则返回 false 以拒绝该域。
if let mailboxInfo = EmailSyntaxValidator.mailbox(from: "santa.claus@Ho Ho Ho North Pole", domainValidator: { _ in true }) {
// mailboxInfo.localPart == .dotAtom("santa.claus")
// mailboxInfo.host == .domain("Ho Ho Ho North Pole")
}
if IPAddressSyntaxValidator.matchIPv6("::1") {
print("::1 is a valid IPv6 address")
}
if IPAddressSyntaxValidator.matchIPv4("127.0.0.1") {
print("127.0.0.1 is a valid IPv4 address")
}
if IPAddressSyntaxValidator.match("8.8.8.8") {
print("8.8.8.8 is a valid IP address")
}
if IPAddressSyntaxValidator.match("fe80::1") {
print("fe80::1 is a valid IP address")
}
允许从 SMTP 标头解码 ASCII 编码的 Latin-1/Latin-2/Unicode 电子邮件地址
print(RFC2047Decoder.decode("=?iso-8859-1?q?h=E9ro\@site.com?="))
// héro@site.com
print(RFC2047Decoder.decode("=?utf-8?B?7ZWcQHgu7ZWc6rWt?="))
// 한@x.한국
RFC822 - ARPA INTERNET 文本消息格式标准 https://datatracker.ietf.org/doc/html/rfc822
RFC2047 - MIME(多用途 Internet 邮件扩展)第三部分:非 ASCII 文本的消息头扩展 https://datatracker.ietf.org/doc/html/rfc2047
RFC5321 - 简单邮件传输协议 https://datatracker.ietf.org/doc/html/rfc5321
RFC5322 - Internet 消息格式 https://datatracker.ietf.org/doc/html/rfc5322
RFC6531 - 国际化电子邮件的 SMTP 扩展 https://datatracker.ietf.org/doc/html/rfc6531