swift workflow codecov License: MIT Issues Releases

SwiftEmailValidator

Swift实现的国际电子邮件地址语法验证器,基于RFC822、RFC2047、RFC5321、RFC5322和RFC6531。由于电子邮件地址是本地 @ 远程的格式,因此验证器还包括 IPAddressSyntaxValidator 和 SwiftPublicSuffixList 库。

这个 Swift 包在运行时不需要 Internet 连接,唯一的依赖是 SwiftPublicSuffixList 库。

安装

Swift Package Manager (SPM)

您可以使用 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 库进行验证。

注意事项

类 & 用法

EmailSyntaxValidator

简单用例

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
}

使用自定义 SwiftPublicSuffixList 规则

如果您实现自己的 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")
}

绕过 SwiftPublicSuffixList

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")
}

IPAddressSyntaxValidator

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")
}

RFC2047Decoder

允许从 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