如何使用邮件过滤器上下文数据?
How to use mail filter context data?
我正在尝试使用 milter
crate 在 Rust 中编写邮件过滤器。我在 Linux 虚拟机上构建了示例,一切正常。但是,该示例使用 u32 作为注入其处理程序的上下文类型,这是一个非常简单的示例。相反,我需要将 handle_header
回调中的字符串存储到 handle_eom
处理程序,以便我可以使用传入的 header 来设置信封。
如果我将 handle_header
中的 header 的值记录到控制台,它会正确写入,但是当它到达 handle_eom
时,它已经 corrupted/overwritten任何。我认为上下文应该专门针对这种情况,但它使用类型推断而不是例如,这似乎很奇怪一个指向 object 的指针,你可以随意分配给它。
是我对上下文的理解有误还是代码有误?
我尝试在 handle_header
中使用 value
和 &value
,它们的行为方式相同。
use milter::*;
fn main() {
Milter::new("inet:3000@localhost")
.name("BounceRewriteFilter")
.on_header(header_callback)
.on_eom(eom_callback)
.on_abort(abort_callback)
.actions(Actions::ADD_HEADER | Actions::REPLACE_SENDER)
.run()
.expect("milter execution failed");
}
#[on_header(header_callback)]
fn handle_header<'a>(mut context: Context<&'a str>, header: &str, value: &'a str) -> milter::Result<Status> {
if header == "Set-Return-Path" {
match context.data.borrow_mut() {
Some(retpath) => *retpath = &value,
None => {
context.data.replace(value)?;
}
}
}
Ok(Status::Continue)
}
#[on_eom(eom_callback)]
fn handle_eom(mut context: Context<&str>) -> milter::Result<Status> {
match context.data.take() {
Ok(result) => {
println!("Set-return-path header is {}", result.unwrap());
context.api.replace_sender(result.unwrap(), None::<&str>)?;
}
Err(_error) => {}
}
Ok(Status::Continue)
}
感谢 crate 作者 Github 上的 glts,问题是传递给 handle_header
方法的字符串切片没有被存储数据指针的外部代码借用,所以到调用 handle_eom
时,内存已被重新用于其他用途。
我所要做的就是将 Context<&str>
更改为 Context<String>
并使用 mystr.to_owned()
和反向 val = &*mystring
转换字符串
我正在尝试使用 milter
crate 在 Rust 中编写邮件过滤器。我在 Linux 虚拟机上构建了示例,一切正常。但是,该示例使用 u32 作为注入其处理程序的上下文类型,这是一个非常简单的示例。相反,我需要将 handle_header
回调中的字符串存储到 handle_eom
处理程序,以便我可以使用传入的 header 来设置信封。
如果我将 handle_header
中的 header 的值记录到控制台,它会正确写入,但是当它到达 handle_eom
时,它已经 corrupted/overwritten任何。我认为上下文应该专门针对这种情况,但它使用类型推断而不是例如,这似乎很奇怪一个指向 object 的指针,你可以随意分配给它。
是我对上下文的理解有误还是代码有误?
我尝试在 handle_header
中使用 value
和 &value
,它们的行为方式相同。
use milter::*;
fn main() {
Milter::new("inet:3000@localhost")
.name("BounceRewriteFilter")
.on_header(header_callback)
.on_eom(eom_callback)
.on_abort(abort_callback)
.actions(Actions::ADD_HEADER | Actions::REPLACE_SENDER)
.run()
.expect("milter execution failed");
}
#[on_header(header_callback)]
fn handle_header<'a>(mut context: Context<&'a str>, header: &str, value: &'a str) -> milter::Result<Status> {
if header == "Set-Return-Path" {
match context.data.borrow_mut() {
Some(retpath) => *retpath = &value,
None => {
context.data.replace(value)?;
}
}
}
Ok(Status::Continue)
}
#[on_eom(eom_callback)]
fn handle_eom(mut context: Context<&str>) -> milter::Result<Status> {
match context.data.take() {
Ok(result) => {
println!("Set-return-path header is {}", result.unwrap());
context.api.replace_sender(result.unwrap(), None::<&str>)?;
}
Err(_error) => {}
}
Ok(Status::Continue)
}
感谢 crate 作者 Github 上的 glts,问题是传递给 handle_header
方法的字符串切片没有被存储数据指针的外部代码借用,所以到调用 handle_eom
时,内存已被重新用于其他用途。
我所要做的就是将 Context<&str>
更改为 Context<String>
并使用 mystr.to_owned()
和反向 val = &*mystring