如何使用邮件过滤器上下文数据?

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

转换字符串