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 电子邮件

Download history 27/week @ 2024-03-11 24/week @ 2024-03-18 16/week @ 2024-03-25 50/week @ 2024-04-01 23/week @ 2024-04-08 20/week @ 2024-04-15 24/week @ 2024-04-22 21/week @ 2024-04-29 24/week @ 2024-05-06 31/week @ 2024-05-13 22/week @ 2024-05-20 33/week @ 2024-05-27 23/week @ 2024-06-03 22/week @ 2024-06-10 15/week @ 2024-06-17 19/week @ 2024-06-24

85 次每月下载
用于 5 个 Crates(3 个直接使用)

GPL-3.0+

115KB
2.5K SLoC

rustyknife

Build Status codecov

专注于可靠处理格式错误数据的电子邮件解析库

最新文档

功能

路线图

  • 所有常见 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