Erlang Mailing Lists

Author Message

<  Erlyweb mailing list  ~  Sending email

Guest
Posted: Tue Oct 14, 2008 2:55 am Reply with quote
Guest
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

Nii Amon
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "erlyweb" group.
To post to this group, send email to erlyweb@googlegroups.com
To unsubscribe from this group, send email to erlyweb+unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/erlyweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Post received from mailinglist
ketralnis
Posted: Tue Oct 14, 2008 6:36 pm Reply with quote
User Joined: 20 Jul 2007 Posts: 151 Location: San Francisco, CA
> 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 erlyweb@googlegroups.com
To unsubscribe from this group, send email to erlyweb+unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/erlyweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Post received from mailinglist
View user's profile Send private message AIM Address
Guest
Posted: Wed Oct 15, 2008 11:29 am Reply with quote
Guest
Cool. I'll try it out.

On Oct 14, 6:35 pm, David King <dk...@ketralnis.com> 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 erlyweb@googlegroups.com
To unsubscribe from this group, send email to erlyweb+unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/erlyweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Post received from mailinglist

Display posts from previous:  

All times are GMT
Page 1 of 1
This forum is locked: you cannot post, reply to, or edit topics.

Jump to:  

You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You cannot download files in this forum