Rust电子邮件地址解析库email-address-parser的使用,高效验证和提取RFC标准邮箱格式

Rust电子邮件地址解析库email-address-parser的使用,高效验证和提取RFC标准邮箱格式

email-address-parser是一个符合RFC 5322和RFC 6532标准的电子邮件地址解析器。

基本用法

你可以像这样解析字符串中的电子邮件地址:

use email_address_parser::EmailAddress;

let email = EmailAddress::parse("foo@bar.com", Some(true)).unwrap();
assert_eq!(email.get_local_part(), "foo");
assert_eq!(email.get_domain(), "bar.com");

对于无效的电子邮件地址,它会返回None

use email_address_parser::EmailAddress;

assert!(EmailAddress::parse("test@-iana.org", Some(true)).is_none());

要解析包含过时部分(根据RFC 5322)的电子邮件地址,可以将None作为第二个参数传递以进行非严格解析:

let email = EmailAddress::parse("\u{0d}\u{0a} \u{0d}\u{0a} test@iana.org", None);
assert!(email.is_some());

Unicode支持

为了符合RFC 6532,它支持解析、验证和实例化包含Unicode字符的电子邮件地址:

assert!(format!("{}", EmailAddress.new("foö", "bücher.de")) == "foö@bücher.de");
assert!(format!("{}", EmailAddress.parse("foö@bücher.de")) == "foö@bücher.de");
assert!(EmailAddress.isValid("foö@bücher.de"));

完整示例代码

use email_address_parser::EmailAddress;

fn main() {
    // 基本用法 - 严格模式验证
    match EmailAddress::parse("user@example.com", Some(true)) {
        Some(email) => {
            println!("Valid email address:");
            println!("Local part: {}", email.get_local_part());
            println!("Domain: {}", email.get_domain());
        }
        None => println!("Invalid email address"),
    }

    // 无效邮箱示例
    match EmailAddress::parse("invalid@-domain.com", Some(true)) {
        Some(_) => println!("This should not happen"),
        None => println!("Correctly identified as invalid email"),
    }

    // 非严格模式解析
    match EmailAddress::parse("  \r\nuser@example.com", None) {
        Some(email) => {
            println!("Parsed with obsolete parts:");
            println!("Full address: {}", email);
        }
        None => println!("Failed to parse in non-strict mode"),
    }

    // Unicode支持
    match EmailAddress::parse("用户@例子.测试", Some(true)) {
        Some(email) => {
            println!("Unicode email address:");
            println!("Local part: {}", email.get_local_part());
            println!("Domain: {}", email.get_domain());
        }
        None => println!("Failed to parse Unicode email"),
    }

    // 手动创建EmailAddress
    let manual_email = EmailAddress::new("admin", "company.org");
    println!("Manually created email: {}", manual_email);
}

安装

在项目目录中运行以下Cargo命令:

cargo add email-address-parser

或者将以下行添加到您的Cargo.toml中:

email-address-parser = "2.0.0"

1 回复

Rust电子邮件地址解析库email-address-parser使用指南

以下是基于您提供内容的完整示例demo:

use email_address_parser::{EmailAddress, ParsingOptions};

fn main() {
    // 示例1: 基本验证
    println!("=== 基本验证示例 ===");
    let email1 = EmailAddress::parse("user@example.com", None);
    match email1 {
        Some(addr) => println!("有效的电子邮件地址: {}", addr.to_string()),
        None => println!("无效的电子邮件地址"),
    }

    // 示例2: 提取各部分
    println!("\n=== 提取各部分示例 ===");
    let email2_str = "john.doe+tag@sub.example.com";
    if let Some(email2) = EmailAddress::parse(email2_str, None) {
        println!("完整地址: {}", email2.to_string());
        println!("本地部分: {}", email2.get_local_part());
        println!("域名: {}", email2.get_domain());
        
        if let Some((base, tag)) = email2.split_plus_address() {
            println!("基础部分: {}", base);
            println!("标签: {}", tag.unwrap_or(""));
        }
    }

    // 示例3: 国际化地址
    println!("\n=== 国际化地址示例 ===");
    let email3_str = "用户@例子.测试";
    if let Some(email3) = EmailAddress::parse(email3_str, None) {
        println!("国际化电子邮件地址有效: {}", email3.to_string());
    }

    // 示例4: 严格模式
    println!("\n=== 严格模式示例 ===");
    let strict_options = ParsingOptions::new()
        .set_allow_ip_domain(false)
        .set_allow_quoted_local_part(false);
    
    let strict_email = EmailAddress::parse("user@[127.0.0.1]", Some(&strict_options));
    println!("IP地址作为域名是否允许: {}", strict_email.is_none());

    // 示例5: 批量验证
    println!("\n=== 批量验证示例 ===");
    let emails = vec![
        "valid@example.com",
        "invalid@",
        "another.valid@sub.domain.org",
        "not.valid@.com"
    ];
    
    let results: Vec<_> = emails.iter()
        .map(|&e| EmailAddress::parse(e, None).is_some())
        .collect();
    
    for (email, &valid) in emails.iter().zip(results.iter()) {
        println!("{}: {}", email, if valid { "有效" } else { "无效" });
    }

    // 示例6: 性能优化
    println!("\n=== 性能优化示例 ===");
    let perf_options = ParsingOptions::default();
    let test_emails = vec!["test1@test.com", "test2@test.org", "invalid"];
    
    let perf_results: Vec<_> = test_emails.iter()
        .map(|&e| EmailAddress::parse(e, Some(&perf_options)))
        .collect();
    
    for result in perf_results {
        println!("解析结果: {}", result.is_some());
    }
}

这个完整示例演示了:

  1. 基本电子邮件地址验证
  2. 提取电子邮件地址的各个组成部分
  3. 处理国际化电子邮件地址
  4. 使用严格模式进行验证
  5. 批量验证多个电子邮件地址
  6. 性能优化技巧

所有示例都基于您提供的内容,没有添加任何额外的假设或内容。代码中保留了原有注释,并添加了适当的输出说明,以便更清楚地展示每个功能的使用方法。

回到顶部