13 个版本
0.2.11 | 2021 年 1 月 4 日 |
---|---|
0.2.10 | 2020 年 11 月 17 日 |
0.2.9 | 2020 年 9 月 4 日 |
0.2.8 | 2020 年 4 月 17 日 |
0.1.7 | 2019 年 3 月 26 日 |
#118 in 电子邮件
85 次每月下载
用于 5 个 Crates(3 个直接使用)
115KB
2.5K SLoC
rustyknife
专注于可靠处理格式错误数据的电子邮件解析库
功能
- Python 模块
- 电子邮件标题解析
- ESMTP 命令解析
- 高覆盖率单元测试
- 支持通过 RFC 2047 和 RFC 2231 解码支持国际化电子邮件标题
- 每天用于解析数百万封电子邮件的内容
- SMTPUTF8 支持
- UTF-8 国际化电子邮件标题 支持
路线图
- 所有常见 ESMTP 扩展的解码
- 支持更多电子邮件内容语法
示例
电子邮件标题解码
use rustyknife::behaviour::Intl;
use rustyknife::types::{DomainPart, DotAtom, Mailbox};
use rustyknife::rfc5322::{Address, Group, Mailbox as IMFMailbox};
use rustyknife::rfc5322::from;
let (rem, parsed) = from::<Intl>(b" A Group(Some people)\r
:Chris Jones <c@(Chris's host.)public.example>,\r
[email protected],\r
John <[email protected]> (my dear friend); (the end of the group)\r\n").unwrap();
// `rem` contains the unparsed remainder.
assert!(rem.is_empty());
assert_eq!(parsed, [Address::Group(Group{
dname: "A Group".into(),
members: vec![
IMFMailbox { dname: Some("Chris Jones".into()),
address: Mailbox::from_imf(b"[email protected]").unwrap() },
IMFMailbox { dname: None,
address: Mailbox::from_imf(b"[email protected]").unwrap() },
IMFMailbox { dname: Some("John".into()),
address: Mailbox::from_imf(b"[email protected]").unwrap() }
]
})]);
ESMTP 命令解析
use rustyknife::behaviour::Intl;
use rustyknife::types::{Mailbox, QuotedString, Domain};
use rustyknife::rfc5321::{mail_command, Path, ReversePath, Param};
let (_, (path, params)) = mail_command::<Intl>(b"MAIL FROM:<\"mr bob\"@example.com> RET=FULL ENVID=abc123\r\n").unwrap();
assert_eq!(path, ReversePath::Path(
Path(Mailbox(QuotedString::from_smtp(b"\"mr bob\"").unwrap().into(),
Domain::from_smtp(b"example.com").unwrap().into()),
vec![])));
assert_eq!(params, [Param::new("RET", Some("FULL")).unwrap(),
Param::new("ENVID", Some("abc123")).unwrap()]);
RFC 2047 编码单词解码
use rustyknife::rfc2047::encoded_word;
let (_, decoded) = encoded_word(b"=?x-sjis?B?lEWWQI7Kg4GM9ZTygs6CtSiPzik=?=").unwrap();
assert_eq!(decoded, "忍法写メ光飛ばし(笑)");
依赖项
~7MB
~141K SLoC