diff --git a/modules/mod_mailinglist/mod_mailinglist.erl b/modules/mod_mailinglist/mod_mailinglist.erl index acf47f312d..55bfc8cee8 100644 --- a/modules/mod_mailinglist/mod_mailinglist.erl +++ b/modules/mod_mailinglist/mod_mailinglist.erl @@ -3,7 +3,7 @@ %% @date 2009-11-23 %% @doc Mailinglist implementation. Enables to send pages to a list of recipients. -%% Copyright 2009 Marc Worrell +%% Copyright 2009-2011 Marc Worrell %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -267,14 +267,15 @@ send_mailing(ListId, PageId, Context) -> end. send_mailing_process(ListId, PageId, Context) -> - Recipients = m_mailinglist:get_enabled_recipients(ListId, Context), - {Direct,Queued} = split_list(20, Recipients), - FromEmail = case m_rsc:p(ListId, mailinglist_reply_to, Context) of - Empty when Empty =:= undefined; Empty =:= <<>> -> - z_convert:to_list(m_config:get_value(mod_emailer, email_from, Context)); - RT -> - z_convert:to_list(RT) - end, + Recipients = m_mailinglist:get_enabled_recipients(ListId, Context), + SubscribersOf = m_edge:subjects(ListId, subscriberof, Context), + {Direct,Queued} = split_list(20, Recipients ++ SubscribersOf), + FromEmail = case m_rsc:p(ListId, mailinglist_reply_to, Context) of + Empty when Empty =:= undefined; Empty =:= <<>> -> + z_convert:to_list(m_config:get_value(mod_emailer, email_from, Context)); + RT -> + z_convert:to_list(RT) + end, FromName = case m_rsc:p(ListId, mailinglist_sender_name, Context) of undefined -> []; <<>> -> []; @@ -285,15 +286,26 @@ send_mailing_process(ListId, PageId, Context) -> {id,PageId}, {list_id, ListId}, {email_from, From} ], - [ - z_email:send_render(Email, {cat, "mailing_page.tpl"}, [{email,Email}|Options], Context) - || Email <- Direct - ], - [ - z_email:sendq_render(Email, {cat, "mailing_page.tpl"}, [{email,Email}|Options], Context) - || Email <- Queued - ], - ok. + [ send(true, Email, Options, Context) || Email <- Direct ], + [ send(false, Email, Options, Context) || Email <- Queued ], + ok. + + + send(_IsDirect, undefined, _Options, _Context) -> + skip; + send(IsDirect, Id, Options, Context) when is_integer(Id) -> + send(IsDirect, m_rsc:p_no_acl(Id, email, Context), [{recipient_id,Id}|Options], Context); + send(IsDirect, Email, Options, Context) -> + case z_convert:to_list(z_string:trim(Email)) of + [] -> skip; + Email1 -> + Options1 = [{email,Email1}|Options], + case IsDirect of + true -> z_email:send_render(Email, {cat, "mailing_page.tpl"}, Options1, Context); + false -> z_email:send_qrender(Email, {cat, "mailing_page.tpl"}, Options1, Context) + end + end. + split_list(N, List) -> split_list(N, List, []). diff --git a/modules/mod_mailinglist/models/m_mailinglist.erl b/modules/mod_mailinglist/models/m_mailinglist.erl index b061e318d1..c1775e7e40 100644 --- a/modules/mod_mailinglist/models/m_mailinglist.erl +++ b/modules/mod_mailinglist/models/m_mailinglist.erl @@ -184,7 +184,7 @@ get_confirm_key(ConfirmKey, Context) -> %% @doc Insert a recipient in the mailing list, send a message to the recipient when needed. insert_recipient(ListId, Email, WelcomeMessageType, Context) -> - insert_recipient(ListId, Email, [{user_id, undefined}], WelcomeMessageType, Context). + insert_recipient(ListId, Email, [], WelcomeMessageType, Context). insert_recipient(ListId, Email, Props, WelcomeMessageType, Context) -> true = z_acl:rsc_visible(ListId, Context), @@ -369,22 +369,21 @@ install(Context) -> true -> case z_db:column_names(mailinglist_recipient, Context) of [confirm_key,email,id,is_enabled,mailinglist_id,timestamp] -> - z_db:q("alter table mailinglist_recipient - add column user_id int default null, - add column props bytea, - add constraint fk_mailinglist_user_id FOREIGN KEY (user_id) REFERENCES rsc (id) ON UPDATE CASCADE ON DELETE CASCADE", - Context), - z_db:equery("create index fk_mailinglist_recipient_user_id on mailinglist_recipient(user_id)", Context), + z_db:q("alter table mailinglist_recipient + add column props bytea", Context), z_db:flush(Context), ok; [confirm_key,email,id,is_enabled,mailinglist_id,props,timestamp,user_id] -> + z_db:q("alter table mailinglist_recipient + drop column user_id int default null", Context), + z_db:flush(Context); + [confirm_key,email,id,is_enabled,mailinglist_id,props,timestamp] -> ok end; false -> z_db:q(" CREATE TABLE mailinglist_recipient ( id serial NOT NULL, - user_id int default NULL, mailinglist_id INT NOT NULL, email character varying (200) NOT NULL, is_enabled boolean NOT NULL default true, @@ -397,14 +396,9 @@ install(Context) -> CONSTRAINT confirm_key_key UNIQUE (confirm_key), CONSTRAINT fk_mailinglist_id FOREIGN KEY (mailinglist_id) REFERENCES rsc (id) - ON UPDATE CASCADE ON DELETE CASCADE, - CONSTRAINT fk_mailinglist_user_id FOREIGN KEY (user_id) - REFERENCES rsc (id) - ON UPDATE CASCADE ON DELETE CASCADE + ON UPDATE CASCADE ON DELETE CASCADE )", Context), - z_db:equery("create index fki_mailinglist_recipient_usr_id on mailinglist_recipient(user_id)", Context), - z_db:q(" CREATE TABLE mailinglist_scheduled ( page_id INT NOT NULL, @@ -428,6 +422,16 @@ datamodel() -> {summary, "Mailing lists are used to send pages to groups of people."} ]} ]}, + + % Any resource with an e-mail address can be a subscriber of a mailinglist + {predicates, [ + {subscriberof, + [{title, <<"Subscriber of">>}], + [{person, mailinglist}, {location, mailinglist}]}, + {exsubscriberof, + [{title, <<"Ex-subscriber of">>}], + [{person, mailinglist}, {location, mailinglist}]} + ]}, {resources, [ {mailinglist_test, mailinglist, [ diff --git a/modules/mod_mailinglist/templates/admin_mailinglist.tpl b/modules/mod_mailinglist/templates/admin_mailinglist.tpl index 1b26bba8a8..4b9f1a53b3 100644 --- a/modules/mod_mailinglist/templates/admin_mailinglist.tpl +++ b/modules/mod_mailinglist/templates/admin_mailinglist.tpl @@ -11,9 +11,8 @@ {% button text=_"New mailing list" action={dialog_new_rsc cat="mailinglist"} %}
-

- {_ Any page can be send as a mailing. You can send a mailing from any edit page, here you can add or remove mailing lists and recipients. _} -

+

{_ Any page can be send as a mailing. You can send a mailing from any edit page, here you can add or remove mailing lists and recipients. _}
+ {_ Recipients can be e-mail only via a simple signup form, or subscribed person pages in the system. _}

{_ Mailing list overview _}