Hi all,

i had a task to implement dkim, cc and bcc with boss_mail. Below is a 
solution.

1. Update gen_smtp to the latest version. You will need mimemail:encode\2;
2. Run Mimeail with your app or each time with boss_mail. I 
added code:ensure_loaded(mimemail), in init\0 in main_init;
3. Change boss_mail and recompile CB

%depricated by can2nac Jun 24 2014
%send_message(App, FromAddress, ToAddress, Action, HeaderFields, Variables, 
Options, Callback) ->
%    BodyFun = fun() -> build_message(App, Action, HeaderFields, Variables, 
Options) end,
%    gen_server:call(boss_mail, {deliver, FromAddress, ToAddress, BodyFun, 
Callback}).

%proper cc and bcc processing, added by can2nac Jun 24 2014
send_message(App,FromAddress,ToAddress,Action,HeaderFields,Variables,Options,Callback)
 
->    
    
Recipients=[ToAddress]++lists:flatmap(fun(T)->string:tokens(proplists:get_value(T,HeaderFields,[]),";")end,["Cc","Bcc"]),
    _HeaderFields=lists:keydelete("Bcc",1,HeaderFields),
    
BodyFun=fun()->build_message(App,Action,_HeaderFields,Variables,Options)end,
    
lists:foreach(fun(_ToAddress)->gen_server:call(boss_mail,{deliver,FromAddress,_ToAddress,BodyFun,Callback})end,Recipients).

build_message(App, Action, HeaderFields, Variables, Options) ->
    ContentLanguage = proplists:get_value("Content-Language", HeaderFields),
    EffectiveAction = proplists:get_value(template, Options, Action),
    Attachments = proplists:get_value(attachments, Options, []),
    {MimeType, MessageBody} = build_message_body_attachments(App, 
EffectiveAction, Variables, Attachments, ContentLanguage),
    MessageHeader = build_message_header(HeaderFields, MimeType),
    %added by can2nac Jun 24 2014 START
    DKIMOptions=
      case 
file:read_file(boss_env:get_env(dkim_certificate_file,undefined)) of
    
{ok,PemBin}->[{dkim,boss_env:get_env(dkim_options,[])++[{private_key,{pem_plain,PemBin}}]}];
        {error,_}->[]
      end,
    %added by can2nac Jun 24 2014 END
    %[MessageHeader, "\r\n", convert_unix_newlines_to_dos(MessageBody)]. 
%removed by can2nac Jun 24 2014
    mimemail:encode({list_to_binary(MimeType),<<>>,MessageHeader,[]
,list_to_binary(convert_unix_newlines_to_dos(MessageBody))},DKIMOptions).%added 
by can2nac Jun 24 2014

build_message_header(HeaderFields, DefaultMimeType) ->
    MessageID = case proplists:get_value("Message-ID", HeaderFields) of
        undefined -> smtp_util:generate_message_id();
        Other -> Other
    end,
    ContentType = proplists:get_value("Content-Type", HeaderFields, 
DefaultMimeType),
    Date = proplists:get_value("Date", HeaderFields, 
erlydtl_dateformat:format("r")),
    AllHeaders = [{"Date", Date}, {"Content-Type", ContentType},
        {"MIME-Version", "1.0"}, {"Message-ID", MessageID} | HeaderFields],
    [{list_to_binary(K),list_to_binary(V)}||{K,V}<-AllHeaders].%added by 
can2nac Jun 24 2014
    %add_fields(AllHeaders, [], []).%removed by can2nac Jun 24 2014

%depricated by can2nac Jun 24 2014 END
%add_fields([], _, Acc) ->
%    lists:reverse(Acc);
%add_fields([{Key, Value}|Rest], Seen, Acc) ->
%    case proplists:get_value(Key, Seen) of
%        undefined ->
%            add_fields(Rest, [Key|Seen], [[Key, ": ", Value, "\r\n"] | 
Acc]);
%        _ ->
%            add_fields(Rest, Seen, Acc)
%    end.

4. Add in boss_config following lines
{dkim_certificate_file,"priv/dkim.pem"},
    
{dkim_options,[{s,<<"some_txt_record_prefix">>},{d,<<"domain.com.">>}]}, 
%TXT some_txt_record_refix._dkim.domain.com

Only open certificates were implemented, password protected were not 
implemented.
You can generate DKIM 
here %%http://www.port25.com/support/domainkeysdkim-wizard/

-- 
You received this message because you are subscribed to the Google Groups 
"ChicagoBoss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
Visit this group at http://groups.google.com/group/chicagoboss.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/chicagoboss/b88fa990-46a7-4c91-bfc4-5b8f75c2795c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to