[erlang-questions] Communicating with SpamAssassin from Erlang

Alain O'Dea <>
Tue Mar 8 03:11:35 CET 2011


On 2011-03-07, at 7:57, Atilla Erdődi <> wrote:

> Hi everyone,
> 
> I'm trying to use SpamAssassin to check the spam score of a mail from
> Erlang using a port.  I've experimented with several options for
> open_port, different message formats, but haven't managed to get any
> reply from spamc, so it times out. Apparently it doesn't notice the
> end of the transmission. Hopefully the solution is something trivial,
> I've missed so far.
> 
> (The obvious solution would be to reimplement the tcp protocol of
> SpamAssassin in Erlang, but I would like simpler solution for now, at
> least for the prototype.)
> 
> The simplified code is below:
> 
> SpamDServer = "127.0.0.1",
> Exec = os:find_executable("spamc"),
> Port = open_port({spawn, Exec ++ " -c -d " ++ SpamDServer}, [use_stdio]),
> port_command(Port, "dummy text \r\n"),
> port_command(Port, <<4>>), %EOT
> receive
>    {Port, {data, Res}} ->
>        io:format("Spamscore: ~p~n", [Res]);
>    Other ->
>        io:format("Unknown message: ~p\n", [Other])
> after 10000 ->
>        io:format("timeout\n")
> end,
> erlang:port_close(Port).
> 
> 
> Regards,
> Atilla

Hi Atilla:

This is probably a non-answer, but Akismet provides a REST API for spam checks and is far more accurate than SpamAssassin.  Akismet is non-free, but inexpensive.

Cheers,
Alain


More information about the erlang-questions mailing list