2 个版本
0.1.1 | 2019年10月6日 |
---|---|
0.1.0 | 2019年10月1日 |
#203 in 邮件
56KB
843 行
mda-rs
mda-rs 是一个用于编写自定义邮件投递代理的 Rust 库。
文档
详细的模块文档,包括所有特性的代码示例,可以在 https://docs.rs/mda 找到。
使用方法
将以下内容添加到您的 Cargo.toml
[dependencies]
mda = "0.1"
如果您使用的是 Rust 2015,请将以下内容添加到您的 crate 根文件中(Rust 2018 不需要此步骤)
extern crate mda;
请参阅 examples/personal-mda.rs 了解使用 mda-rs 的示例。
许可证
本项目采用 Mozilla Public License Version 2.0 许可(LICENSE 或 https://www.mozilla.org/en-US/MPL/2.0/)。
lib.rs
:
mda crate 提供了一个用于编写自定义邮件投递代理的库。它支持本地投递到 maildirs,提供易于处理的规范化邮件字节数据访问,以及访问单个头部字段。
邮件数据规范化涉及确保头部字段位于单行,解码使用某种传输编码(例如 base64)的消息文本部分,并将所有文本转换为 UTF-8。在投递过程中使用原始(非规范化)邮件数据。
此 crate 还公开了方便的用于正则表达式搜索和邮件处理/过滤的方法。
邮件构建
Email struct 是 mda
crate 的基本抽象。要构建一个 Email,请使用 Email::from_stdin 或 Email::from_vec 方法。
use mda::Email;
let email = Email::from_stdin()?;
let email = Email::from_vec(vec![97, 98, 99])?;
邮件投递
使用 Email::deliver_to_maildir 方法将邮件投递到本地的 maildir 目录。请注意,在投递过程中使用的是原始(非规范化)邮件数据。
use mda::Email;
let email = Email::from_stdin()?;
email.deliver_to_maildir("/my/maildir/path")?;
email.deliver_to_maildir("/my/other/maildir/path")?;
访问邮件头部字段
使用 Email::header_field 和 Email::header_field_all_occurrences 方法来访问电子邮件头字段。头字段值中的任何 MIME 编码的单词都会被解码,字段值转换为 UTF-8。
use mda::Email;
let email = Email::from_stdin()?;
let to = email.header_field("To").unwrap_or("");
if to.contains("[email protected]") {
email.deliver_to_maildir("/my/maildir/path")?;
}
使用正则表达式进行搜索
EmailRegex 特性提供了使用正则表达式搜索头、正文或整个电子邮件的便捷方法。便捷函数使用不区分大小写的多行搜索(^
和 $
匹配行的开头和结尾)。如果上述方法不满足您的需求,或者您需要额外的功能,可以使用电子邮件数据手动进行正则表达式搜索。
use mda::{Email, EmailRegex};
let email = Email::from_stdin()?;
if email.header().search(r"^To:.*[email protected]")? {
email.deliver_to_maildir("/my/maildir/path")?;
}
使用外部程序处理和过滤电子邮件
使用 Email::filter 和 Email::from_stdin_filtered 方法来过滤电子邮件,在这两种情况下都会创建一个新的电子邮件。
use mda::Email;
// Filtering directly from stdin is more efficient.
let email = Email::from_stdin_filtered(&["bogofilter", "-ep"])?;
let bogosity = email.header_field("X-Bogosity").unwrap_or("");
if bogosity.contains("Spam, tests=bogofilter") {
email.deliver_to_maildir("/my/spam/path")?;
}
// We can also filter at any other time.
let email = email.filter(&["bogofilter", "-ep"])?;
要执行更通用的处理,请使用 Email::process 方法
use mda::Email;
let email = Email::from_stdin()?;
let output = email.process(&["bogofilter"])?;
if let Some(0) = output.status.code() {
email.deliver_to_maildir("/my/spam/path")?;
}
访问字节数据
使用 Email::header、Email::body 和 Email::data 方法分别访问头、正文和整个电子邮件的规范化字节数据。
规范化包括确保头字段位于单行,解码使用某种传输编码(例如,base64)的消息的文本部分,以及将所有文本转换为 UTF-8 字符编码。
如果您出于某些原因需要访问非规范化数据,请使用 Email::raw_data。
use std::str;
use mda::Email;
let email = Email::from_stdin()?;
let body_str = String::from_utf8_lossy(email.header());
if body_str.contains("FREE BEER") {
email.deliver_to_maildir("/my/spam/path")?;
}
决定交付持久性与速度之间的权衡
使用 Email::set_delivery_durability 来决定使用哪个 DeliveryDurability 方法。默认情况下,使用最持久的(但速度也较慢)的方法。
use mda::{Email, DeliveryDurability};
let mut email = Email::from_stdin()?;
email.set_delivery_durability(DeliveryDurability::FileSyncOnly);
依赖项
~7MB
~182K SLoC