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
相关产品推荐
相关产品推荐

