You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust mail_parser解析From字段:匹配HeaderValue枚举获取Addr数据遇阻

解决mail_parser提取From字段到自定义结构体的match写法

首先定义你的自定义结构体,示例如下:

use std::borrow::Cow;

#[derive(Debug)]
struct SenderInfo {
    name: Option<String>,
    address: Option<String>,
}

接下来针对mail_parser的from()方法返回的HeaderValue枚举,通过match语句精准匹配Address变体,提取Addr中的字段并转换到自定义结构体:

use mail_parser::{HeaderValue, Addr};

// 假设已解析得到邮件对象msg
let from_header = msg.from();

let sender_info = match from_header {
    Some(HeaderValue::Address(addr)) => {
        // 将Cow<str>转换为String,若需保留原生命周期可直接用Cow类型
        let name = addr.name.as_ref().map(|cow| cow.to_string());
        let address = addr.address.as_ref().map(|cow| cow.to_string());
        SenderInfo { name, address }
    }
    // 处理From字段包含多个地址的情况
    Some(HeaderValue::AddressList(addrs)) => {
        // 示例取第一个地址,可根据需求遍历所有地址
        addrs.first().map_or(
            SenderInfo { name: None, address: None },
            |addr| {
                let name = addr.name.as_ref().map(|cow| cow.to_string());
                let address = addr.address.as_ref().map(|cow| cow.to_string());
                SenderInfo { name, address }
            }
        )
    }
    // 处理From字段不存在或其他类型的情况
    _ => SenderInfo { name: None, address: None },
};

关键点说明

  • 必须明确匹配HeaderValue的Address和AddressList变体,覆盖From字段的常见格式
  • Addr的name和address均为Option<Cow<'x, str>>,使用as_ref()避免所有权移动,再通过map转换为String(若无需所有权,可将自定义结构体字段改为Option<Cow<'static, str>>)
  • _分支兜底处理所有未匹配到的情况,保证代码完整性

内容的提问来源于stack exchange,提问作者devMe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:30:02