我正在尝试使用procmail对传入邮件运行一些自定义解析,并且希望调用java程序使用stdin管道读取消息的头和正文。有很多使用perl和python过滤邮件的示例,但没有一个使用java。作为一个开始的例子,我的procmail菜谱:
:0 hbfW
|"/usr/bin/java -cp /root/parser HelloWorldApp"
我的java应用程序只是回显stdin:
import java.io.*;
public class HelloWorldApp {
public static void main(String[] args) {
InputStreamReader isReader = new InputStreamReader(System.in);
BufferedReader bufReader = new BufferedReader(isReader);
while(true){
try {
String inputStr = null;
if((inputStr=bufReader.readLine()) != null) {
System.out.println(inputStr);
}
else {
break;
}
}
catch (Exception e) {
break;
}
}
}
}
procmail日志:
procmail: Executing "/usr/bin/java -cp /root/parser HelloWorldApp"
/bin/sh: /usr/bin/java HelloWorldApp: No such file or directory
procmail: Error while writing to "/usr/bin/java HelloWorldApp"
procmail: Rescue of unfiltered data succeeded
1)我是否创建了正确的接收者来将数据管道传输到java?2)由于我仍然希望procmail处理交付,我的配方使用(f)标志。但是我如何从我的java程序创建的结果发送回procmail?stdout吗?
去掉"/usr/bin/java -cp/root/parser HelloWorldApp"周围的引号。
来源:http://www.linfo.org/pipe.html
配方上的"filter"标志指定管道将在标准输入上读取消息,并在标准输出上写回(可能未更改的)消息,该消息将替换原始消息。
正如Jake223已经回复的,命令周围的引号是不正确的,应该去掉。然而,错误消息看起来并不像它真正对应于那个特定的错误。