Cool. I'll try it out.
On Oct 14, 6:35 pm, David King <[EMAIL PROTECTED]> wrote:
> > 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
-~----------~----~----~----~------~----~------~--~---