I need to send $message_received to spamc and capture its output in a variable (preferably) so I can get the spam score. I know I can just back quote a system command to capture stdout to a variable, but how can I do both the stdout and the stdin handling here? This should be simple, but I am just missing it...
The somewhat low-level approach in perl would be:
my $pid = open(CHLD, "-|");
die "Failed to fork: $!\n" unless defined $pid;
if($pid == 0)
die "Failed to run spamc: $!" unless open(PROC, "|spamc");
print PROC "My Arguments";
# collect the input
The above assumes, that spamc writes to STDOUT all output and simply exits. The approach is slow, because there are 2 forks involved. I don't know anything about SpamAssassin, but if you have spamd (daemon), then there should be some network protocol for talking to that daemon. If your program did the talking directly, then you'd save time for making forks.
Another point. Looks like SpamAssassin is slow in working even without forks. So, your best bet would be processing multiple emails in parallel.