> I stumbled across this today: http://www.erlang.org/user.html.
> It contains an SMTP client which seems dated but should still be
> usable here: http://www.erlang.org/contrib/smtp_client-1.1.tgz
I've had success with smtp_fsm.erl. I have an example below that is an
gen_event error-handler that emails SASL errors to a given email
address. Use it like:
---------- begin snip ----------
ok=error_logger:add_report_handler(emailing_errorhandler,
[MailServer,MailTo,MailFrom])
---------- end snip ----------
And the code:
---------- begin snip ----------
-module(emailing_errorhandler).
-behaviour(gen_event).
-export([init/1,handle_event/2,handle_call/2,
handle_info/2,terminate/2,code_change/3]).
-record(state,{smtp_server,
from_address,
to_address,
queued_messages=[],
tref}). % the handle for the timer used to flush
messages
-record(queued_message,{message,
time}).
%% gen_event callbacks
init({SmtpServer,_OldState}) ->
init(SmtpServer);
init([SmtpServer,ToAddress,FromAddress]) ->
init([SmtpServer,ToAddress,FromAddress,5*60]);
init([SmtpServer,ToAddress,FromAddress,Interval]) ->
{ok,Tref} = timer:send_interval(Interval*1000, self(),
flush_messages),
{ok,#state{smtp_server=SmtpServer,
to_address=ToAddress,
from_address=FromAddress,
tref=Tref}}.
handle_event({error, _Gleader, {_Pid, Format, Data}},
State=#state{queued_messages = Messages}) ->
Message = #queued_message{message=io_lib:format(Format,Data),
time=erlang:now()},
{ok,State#state{queued_messages=[Message | Messages]}};
handle_event({error_report, _Gleader, {_Pid, std_error, Report}},
State=#state{queued_messages = Messages}) ->
Message = #queued_message{message=Report,
time=erlang:now()},
{ok,State#state{queued_messages = [Message | Messages]}};
handle_event({error_report, _Gleader, {_Pid, Type, Report}},
State=#state{queued_messages = Messages}) ->
Message = #queued_message{message=io_lib:format("Type: ~p~nReport:
~p~n",
[Type,Report]),
time=erlang:now()},
{ok,State#state{queued_messages = [Message | Messages]}};
%% pass all other events through
handle_event(_Event, State) ->
{ok,State}.
handle_call(nocall,State) ->
{ok,_Reply=ok,State}.
handle_info(flush_messages, State=#state{queued_messages=[]}) ->
{ok,State};
handle_info(flush_messages, State=#state{queued_messages=Queued}) ->
Messages = lists:map(fun make_email/1,Queued),
Message = io_lib:format("~p messages from ~p, sent at ~p:\n\n~s",
[length(Queued),node(),
calendar:now_to_datetime(erlang:now()),
join(Messages, "\n\n---------------------\n
\n") ]),
send_email(Message,State),
{ok,State#state{queued_messages=[]}}.
terminate(_Reason,State) ->
{ok,NewState} = handle_info(flush_messages,State),
{ok,cancel} = timer:cancel(NewState#state.tref),
NewState#state{tref=undefined}.
code_change(_OldVsn,State,_Extra) ->
{ok,State}.
%% join([iolist()], iolist()) -> iolist()
join([ First | Rest ],Sep) ->
[ First | [ [Sep, X]
|| X <- Rest ]].
make_email(#queued_message{message=Message,
time=Time}) ->
io_lib:format("Error report at ~p:~n~s",
[calendar:now_to_datetime(Time),
Message]).
send_email(Msg, #state{smtp_server=SmtpServer,
to_address=ToAddress,
from_address=FromAddress}) ->
{ok,Pid} = smtp_fsm:start(SmtpServer),
{ok,_Response1}=smtp_fsm:helo(Pid),
ok=smtp_fsm:sendemail(Pid,
FromAddress,_To=ToAddress,
smtp_fsm:simp_msg(FromAddress,
ToAddress,
io_lib:format("Error report
from ~p",
[node()]),
Msg)),
ok=smtp_fsm:close(Pid),
ok.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"erlyweb" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/erlyweb?hl=en
-~----------~----~----~----~------~----~------~--~---