> 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
-~----------~----~----~----~------~----~------~--~---

Reply via email to