Current section
19 Versions
Jump to
Current section
19 Versions
Compare versions
5
files changed
+143
additions
-56
deletions
| @@ -20,5 +20,5 @@ | |
| 20 20 | {<<"zotonic_core">>, |
| 21 21 | [{<<"app">>,<<"zotonic_core">>}, |
| 22 22 | {<<"optional">>,false}, |
| 23 | - {<<"requirement">>,<<"1.0.0-rc.1">>}]}]}. |
| 24 | - {<<"version">>,<<"1.0.0-rc.1">>}. |
| 23 | + {<<"requirement">>,<<"1.0.0-rc.2">>}]}]}. |
| 24 | + {<<"version">>,<<"1.0.0-rc.2">>}. |
| @@ -9,7 +9,7 @@ | |
| 9 9 | |
| 10 10 | {deps, |
| 11 11 | [ |
| 12 | - {zotonic_core, "1.0.0-rc.1"}, |
| 12 | + {zotonic_core, "1.0.0-rc.2"}, |
| 13 13 | {gen_smtp, "1.1.1"} |
| 14 14 | ] |
| 15 15 | }. |
| @@ -6,7 +6,7 @@ | |
| 6 6 | {<<"cf">>,{pkg,<<"cf">>,<<"0.3.1">>},2}, |
| 7 7 | {<<"cowboy">>,{pkg,<<"cowboy">>,<<"2.9.0">>},2}, |
| 8 8 | {<<"cowlib">>,{pkg,<<"cowlib">>,<<"2.11.0">>},2}, |
| 9 | - {<<"cowmachine">>,{pkg,<<"cowmachine">>,<<"1.8.0">>},1}, |
| 9 | + {<<"cowmachine">>,{pkg,<<"cowmachine">>,<<"1.8.2">>},1}, |
| 10 10 | {<<"depcache">>,{pkg,<<"depcache">>,<<"1.7.1">>},1}, |
| 11 11 | {<<"dh_date">>,{pkg,<<"dh_date">>,<<"1.0.0">>},1}, |
| 12 12 | {<<"diffy">>,{pkg,<<"diffy">>,<<"1.1.2">>},1}, |
| @@ -43,7 +43,7 @@ | |
| 43 43 | {<<"qdate_localtime">>,{pkg,<<"qdate_localtime">>,<<"1.2.0">>},1}, |
| 44 44 | {<<"ranch">>,{pkg,<<"ranch">>,<<"2.1.0">>},1}, |
| 45 45 | {<<"recon">>,{pkg,<<"recon">>,<<"2.5.2">>},1}, |
| 46 | - {<<"ringbuffer">>,{pkg,<<"ringbuffer">>,<<"1.1.1">>},1}, |
| 46 | + {<<"ringbuffer">>,{pkg,<<"ringbuffer">>,<<"1.2.0">>},1}, |
| 47 47 | {<<"router">>,{pkg,<<"router">>,<<"1.0.4">>},2}, |
| 48 48 | {<<"s3filez">>,{pkg,<<"s3filez">>,<<"1.2.0">>},1}, |
| 49 49 | {<<"setup">>,{pkg,<<"setup">>,<<"2.1.0">>},1}, |
| @@ -54,17 +54,17 @@ | |
| 54 54 | {pkg,<<"tls_certificate_check">>,<<"1.11.0">>}, |
| 55 55 | 1}, |
| 56 56 | {<<"yamerl">>,{pkg,<<"yamerl">>,<<"0.8.1">>},1}, |
| 57 | - {<<"zotonic_core">>,{pkg,<<"zotonic_core">>,<<"1.0.0-rc.1">>},0}, |
| 57 | + {<<"zotonic_core">>,{pkg,<<"zotonic_core">>,<<"1.0.0-rc.2">>},0}, |
| 58 58 | {<<"zotonic_filehandler">>, |
| 59 | - {pkg,<<"zotonic_filehandler">>,<<"1.0.0-rc.1">>}, |
| 59 | + {pkg,<<"zotonic_filehandler">>,<<"1.0.0-rc.2">>}, |
| 60 60 | 1}, |
| 61 61 | {<<"zotonic_fileindexer">>, |
| 62 | - {pkg,<<"zotonic_fileindexer">>,<<"1.0.0-rc.1">>}, |
| 62 | + {pkg,<<"zotonic_fileindexer">>,<<"1.0.0-rc.2">>}, |
| 63 63 | 1}, |
| 64 64 | {<<"zotonic_filewatcher">>, |
| 65 | - {pkg,<<"zotonic_filewatcher">>,<<"1.0.0-rc.1">>}, |
| 65 | + {pkg,<<"zotonic_filewatcher">>,<<"1.0.0-rc.2">>}, |
| 66 66 | 1}, |
| 67 | - {<<"zotonic_notifier">>,{pkg,<<"zotonic_notifier">>,<<"1.0.0-rc.1">>},1}, |
| 67 | + {<<"zotonic_notifier">>,{pkg,<<"zotonic_notifier">>,<<"1.0.0-rc.2">>},1}, |
| 68 68 | {<<"zotonic_rdf">>,{pkg,<<"zotonic_rdf">>,<<"1.0.1">>},1}, |
| 69 69 | {<<"zotonic_ssl">>,{pkg,<<"zotonic_ssl">>,<<"1.1.0">>},1}, |
| 70 70 | {<<"zotonic_stdlib">>,{pkg,<<"zotonic_stdlib">>,<<"1.6.0">>},1}]}. |
| @@ -77,7 +77,7 @@ | |
| 77 77 | {<<"cf">>, <<"5CB902239476E141EA70A740340233782D363A31EEA8AD37049561542E6CD641">>}, |
| 78 78 | {<<"cowboy">>, <<"865DD8B6607E14CF03282E10E934023A1BD8BE6F6BACF921A7E2A96D800CD452">>}, |
| 79 79 | {<<"cowlib">>, <<"0B9FF9C346629256C42EBE1EEB769A83C6CB771A6EE5960BD110AB0B9B872063">>}, |
| 80 | - {<<"cowmachine">>, <<"38F40D72B04D89F05208646439A612B4E40693F23332B31496C7BD737528CC8A">>}, |
| 80 | + {<<"cowmachine">>, <<"75C97EC0C9D02D74EAA906FC338C7947596E40A4CEAB8D33AC28CB37D31DC0B4">>}, |
| 81 81 | {<<"depcache">>, <<"BB85FDD459FAF1374773EDA4249D2C1F037A32C509AC1E1C89654CAB3D4CC233">>}, |
| 82 82 | {<<"dh_date">>, <<"5B0C286665E160DE44132552931BEF06B5CB2244D5BD20E333A686E9D8BF92E3">>}, |
| 83 83 | {<<"diffy">>, <<"7060E34FD512F210056B7E66E8D315CB90D06B97A6656D92FC299EB91692E36E">>}, |
| @@ -114,7 +114,7 @@ | |
| 114 114 | {<<"qdate_localtime">>, <<"644ADE4C7F7EAC765E2048DFA714D78EA86BAF5255FE46279B2EAC5729760A07">>}, |
| 115 115 | {<<"ranch">>, <<"2261F9ED9574DCFCC444106B9F6DA155E6E540B2F82BA3D42B339B93673B72A3">>}, |
| 116 116 | {<<"recon">>, <<"CBA53FA8DB83AD968C9A652E09C3ED7DDCC4DA434F27C3EAA9CA47FFB2B1FF03">>}, |
| 117 | - {<<"ringbuffer">>, <<"BD33D3B091EB6E1DE6AB337AEA0B2676B1F2554C9DEC7D6C70D5A9E8F710FDC0">>}, |
| 117 | + {<<"ringbuffer">>, <<"A64CBAED172B0D75998732F09CDADDC289438E92DA8CB2849FE71D4F87A8F654">>}, |
| 118 118 | {<<"router">>, <<"E9311B9D296B41C9484FC933EFD847F87E7DCBAD94DEE1566FB77570CA59EF2C">>}, |
| 119 119 | {<<"s3filez">>, <<"86533C4A36820134279118FA53CC9CB84FDC3DE4A072181D91DD2E1BABDED1DF">>}, |
| 120 120 | {<<"setup">>, <<"05F69185A5EB71474C9BC6BA892565651EC7507791F85632B7B914DBFE130510">>}, |
| @@ -123,11 +123,11 @@ | |
| 123 123 | {<<"template_compiler">>, <<"DF70959D64AD5B541891D35C2E304E9D16859078183F54B2CE9224ECF1AB7A7E">>}, |
| 124 124 | {<<"tls_certificate_check">>, <<"609DCD503F31170F0799DAC380EB0E086388CF918FC769AAA60DDD6BBF575218">>}, |
| 125 125 | {<<"yamerl">>, <<"07DA13FFA1D8E13948943789665C62CCD679DFA7B324A4A2ED3149DF17F453A4">>}, |
| 126 | - {<<"zotonic_core">>, <<"8D5FB41B6B38C8CBC07D7E1CAC1502150D1E5DC9BC9154BE651DA9AFE6397AFB">>}, |
| 127 | - {<<"zotonic_filehandler">>, <<"705E09CBA10CF98E3231BFC2230F31C7813A06250127EBE04E2668A4CDC517F0">>}, |
| 128 | - {<<"zotonic_fileindexer">>, <<"025A825A2368AC369633D0E3BB39BEA4D24E98013CC387BB2BCBDAA157FC6F0C">>}, |
| 129 | - {<<"zotonic_filewatcher">>, <<"B21660D738FBC9903B5D678F974E6A960BF8511A877F140FEF5D9483A57A1244">>}, |
| 130 | - {<<"zotonic_notifier">>, <<"00638E6685EB3EC02AE9E1E79A1C9694914400EB85F80F3D96161F2786CA7FD6">>}, |
| 126 | + {<<"zotonic_core">>, <<"922F77F067C85BF79E49353491251EA0F6144F304526D280C78A9EB7EF1E0356">>}, |
| 127 | + {<<"zotonic_filehandler">>, <<"1D10CAC854061D9211F86990E43194831768B52C9C67DE8CBA60BD9C4AE36959">>}, |
| 128 | + {<<"zotonic_fileindexer">>, <<"FD1AA4F226956D4E4341D452CC627F370584240501BF8E03568E0C7237CFE496">>}, |
| 129 | + {<<"zotonic_filewatcher">>, <<"2FC2465E57F2AE19B7DE9B2BEAFE8236F1628CF7A6AA527882533997D0E1C603">>}, |
| 130 | + {<<"zotonic_notifier">>, <<"6B293A5E356D4CE848F025DEF5EC10AFA3CB2BF8ECDE8065CE0E6A4A661ABD3C">>}, |
| 131 131 | {<<"zotonic_rdf">>, <<"D0E72A13D179549E6520BFCCFFD25F4C93533098698EE77F73CFE5778345D708">>}, |
| 132 132 | {<<"zotonic_ssl">>, <<"16A96C8B9597F977EC12B179CB2ED6C635674BB1BA7CEC24C5999191C3C95BDD">>}, |
| 133 133 | {<<"zotonic_stdlib">>, <<"872E85BD2DC8A49A4DA255E4DF6C1B4DDC993E59024D02303BD6A5DF0868859B">>}]}, |
| @@ -139,7 +139,7 @@ | |
| 139 139 | {<<"cf">>, <<"315E8D447D3A4B02BCDBFA397AD03BBB988A6E0AA6F44D3ADD0F4E3C3BF97672">>}, |
| 140 140 | {<<"cowboy">>, <<"2C729F934B4E1AA149AFF882F57C6372C15399A20D54F65C8D67BEF583021BDE">>}, |
| 141 141 | {<<"cowlib">>, <<"2B3E9DA0B21C4565751A6D4901C20D1B4CC25CBB7FD50D91D2AB6DD287BC86A9">>}, |
| 142 | - {<<"cowmachine">>, <<"4CD30738036285071DFBA1FC0CAE87DA9FB269925F81BDD25E49E75E7FB8F828">>}, |
| 142 | + {<<"cowmachine">>, <<"7CB87D27D6532BBD213CF5A43FD889B08B03D718F6F176A3876FA22DD0D91129">>}, |
| 143 143 | {<<"depcache">>, <<"40A441A5B1B8E322263C4E6EF35A7D5BC75D080E7A4AAB0D02BCE6059DF53BC1">>}, |
| 144 144 | {<<"dh_date">>, <<"3F5D908383A0243A693147EA85A5654769B90078AC999A076ED6F0917F7614CF">>}, |
| 145 145 | {<<"diffy">>, <<"9A59BBDCAFB6B115B5099711F7F114EDB00BE11658CEF08EF26E04F8040C7149">>}, |
| @@ -176,7 +176,7 @@ | |
| 176 176 | {<<"qdate_localtime">>, <<"98A538A5B6046B8652DFC5630B030D0414A1B31D0130C81FA6B88B5C1E625109">>}, |
| 177 177 | {<<"ranch">>, <<"244EE3FA2A6175270D8E1FC59024FD9DBC76294A321057DE8F803B1479E76916">>}, |
| 178 178 | {<<"recon">>, <<"2C7523C8DEE91DFF41F6B3D63CBA2BD49EB6D2FE5BF1EEC0DF7F87EB5E230E1C">>}, |
| 179 | - {<<"ringbuffer">>, <<"E94020F8F5ADDDCF8AF87685FC97F90E33A48AF698C84A72E3239CF3BBDA37C2">>}, |
| 179 | + {<<"ringbuffer">>, <<"D3E575FD919751E80B4DF275C6A4710E394F998EDDD9281B4FC202DAD6C1E299">>}, |
| 180 180 | {<<"router">>, <<"C9F939968F8D8BCBEB03087829693E5BEEA6BFFD14A9717200FB57522A141838">>}, |
| 181 181 | {<<"s3filez">>, <<"2BF3BDFCED356C8581029D70385970F969CACB102AE179DDFFAAAF9B448D1F36">>}, |
| 182 182 | {<<"setup">>, <<"EFD072578F0CF85BEA96CAAFFC7ADB0992398272522660A136E10567377071C5">>}, |
| @@ -185,11 +185,11 @@ | |
| 185 185 | {<<"template_compiler">>, <<"7FFBA8312987BFB118248B7542EFFC15999DA06F3D48E7D7F211CA8D85FF71C8">>}, |
| 186 186 | {<<"tls_certificate_check">>, <<"4AB962212EF7C87482619CB298E1FE06E047B57F0BD58CC417B3B299EB8D036E">>}, |
| 187 187 | {<<"yamerl">>, <<"96CB30F9D64344FED0EF8A92E9F16F207DE6C04DFFF4F366752CA79F5BCEB23F">>}, |
| 188 | - {<<"zotonic_core">>, <<"43EB3734A4169B34F2976B80BAF6D01BE7215791EB1F1B5F2EFC762E74674ADE">>}, |
| 189 | - {<<"zotonic_filehandler">>, <<"9677AF0F80D6E1CDC6A641C280DCC87C6516ACDC813E694495422136524989B2">>}, |
| 190 | - {<<"zotonic_fileindexer">>, <<"D807B097A5B2415F0C818314D5F2271FF1D0D79AB023C90AD4FC1EA7B2B88CD7">>}, |
| 191 | - {<<"zotonic_filewatcher">>, <<"396D81D8B634473414BD775DE37A937B4220FB808A1E052A9D8A963C6903E4E1">>}, |
| 192 | - {<<"zotonic_notifier">>, <<"657F891004C2C518B96C4373EE00711E50955D8AA80E8322B719F5840971138E">>}, |
| 188 | + {<<"zotonic_core">>, <<"44AA1883D8573AAEDC580ACCC19822914F1F0C1A6850F52B6DB97C66294379A5">>}, |
| 189 | + {<<"zotonic_filehandler">>, <<"3852C69DE6A78F8EEAC884A07D855FEFD4893A9867EA81C4F0F104357523A7A3">>}, |
| 190 | + {<<"zotonic_fileindexer">>, <<"2315FFCC3FD6160BF5FCF53C472095B30864C5698085CB89C3819FA5485B0B9D">>}, |
| 191 | + {<<"zotonic_filewatcher">>, <<"D44454471A64E0B88EEBF9AA81125F90DA80BBC775DCF791C1A5D035235BDFCF">>}, |
| 192 | + {<<"zotonic_notifier">>, <<"9D787E6F0A1A319C8B25A4BFB3A4FEEA4CA1D1F21D6F479AAE88B7399A81B4A1">>}, |
| 193 193 | {<<"zotonic_rdf">>, <<"096C1E2E16582FE3F6253534068D22B39F246D84C01237C42A8B489B42BB7A16">>}, |
| 194 194 | {<<"zotonic_ssl">>, <<"FC8193CFA273956C2669F448102DD7A4F0E4AA8E3C81FA7EB46114911146CF4C">>}, |
| 195 195 | {<<"zotonic_stdlib">>, <<"9139167866615F226C3915B6082B317892E276F3A9C78C5A99CD497FA589444E">>}]} |
| @@ -1,6 +1,6 @@ | |
| 1 1 | {application,zotonic_listen_smtp, |
| 2 2 | [{description,"Zotonic SMTP Listener"}, |
| 3 | - {vsn,"1.0.0-rc.1"}, |
| 3 | + {vsn,"1.0.0-rc.2"}, |
| 4 4 | {registered,[]}, |
| 5 5 | {applications,[kernel,stdlib,gen_smtp,zotonic_core]}, |
| 6 6 | {env,[]}, |
| @@ -42,14 +42,25 @@ | |
| 42 42 | from :: binary() | undefined |
| 43 43 | }). |
| 44 44 | |
| 45 | + -define(SESSION_LIMIT, 20). |
| 45 46 | |
| 46 47 | child_spec() -> |
| 47 48 | case {z_config:get(smtp_listen_ip),z_config:get(smtp_listen_port)} of |
| 48 | - {none, _} -> |
| 49 | - ?LOG_WARNING("SMTP server disabled: 'smtp_listen_ip' is set to 'none'"), |
| 49 | + {none, Port} -> |
| 50 | + ?LOG_WARNING(#{ |
| 51 | + text => "SMTP server disabled: 'smtp_listen_ip' is set to 'none'", |
| 52 | + ip => none, |
| 53 | + port => Port, |
| 54 | + protocol => smtp |
| 55 | + }), |
| 50 56 | ignore; |
| 51 | - {_, none} -> |
| 52 | - ?LOG_WARNING("SMTP server disabled: 'smtp_listen_port' is set to 'none'"), |
| 57 | + {IP, none} -> |
| 58 | + ?LOG_WARNING(#{ |
| 59 | + text => "SMTP server disabled: 'smtp_listen_port' is set to 'none'", |
| 60 | + ip => ip_to_string(IP), |
| 61 | + port => none, |
| 62 | + protocol => smtp |
| 63 | + }), |
| 53 64 | ignore; |
| 54 65 | {IP, Port} -> |
| 55 66 | Args1 = case z_config:get(smtp_listen_domain) of |
| @@ -62,29 +73,41 @@ child_spec() -> | |
| 62 73 | _ when is_tuple(IP) -> |
| 63 74 | [{address, IP} | Args1] |
| 64 75 | end, |
| 65 | - case IP of |
| 66 | - any -> ?LOG_NOTICE("SMTP server listening on any:~p", [Port]); |
| 67 | - _ -> ?LOG_NOTICE("SMTP server listening on ~s:~p", [inet:ntoa(IP), Port]) |
| 68 | - end, |
| 76 | + ?LOG_NOTICE(#{ |
| 77 | + text => "SMTP server listening", |
| 78 | + ip => ip_to_string(IP), |
| 79 | + port => Port, |
| 80 | + protocol => smtp |
| 81 | + }), |
| 69 82 | Options = [{port, Port} | Args2], |
| 70 83 | gen_smtp_server:child_spec(?MODULE, ?MODULE, Options) |
| 71 84 | end. |
| 72 85 | |
| 86 | + ip_to_string(any) -> "any"; |
| 87 | + ip_to_string(IP) -> inet:ntoa(IP). |
| 73 88 | |
| 74 | - -spec init(Hostname :: atom() | string(), SessionCount :: non_neg_integer(), PeerName :: tuple(), Options :: list()) -> {'ok', iodata(), #state{}} | {'stop', any(), iodata()}. |
| 75 | - init(Hostname, SessionCount, PeerName, Options) -> |
| 89 | + |
| 90 | + -spec init(Hostname :: atom() | string(), SessionCount :: non_neg_integer(), Peer :: tuple(), Options :: list()) -> {'ok', iodata(), #state{}} | {'stop', any(), iodata()}. |
| 91 | + init(Hostname, SessionCount, Peer, Options) -> |
| 76 92 | HostnameB = z_convert:to_binary(Hostname), |
| 77 | - case SessionCount > 20 of |
| 93 | + case SessionCount > ?SESSION_LIMIT of |
| 78 94 | false -> |
| 79 95 | State = #state{ |
| 80 96 | options = Options, |
| 81 | - peer = PeerName, |
| 97 | + peer = Peer, |
| 82 98 | hostname = HostnameB, |
| 83 99 | banner = iolist_to_binary( io_lib:format("~s ESMTP Zotonic", [HostnameB]) ) |
| 84 100 | }, |
| 85 101 | {ok, State#state.banner, State}; |
| 86 102 | true -> |
| 87 | - ?LOG_WARNING("SMTP Connection limit exceeded (~p)", [SessionCount]), |
| 103 | + ?LOG_WARNING(#{ |
| 104 | + text => "SMTP Connection limit exceeded", |
| 105 | + limit => ?SESSION_LIMIT, |
| 106 | + session_count => SessionCount, |
| 107 | + src => inet:ntoa(Peer), |
| 108 | + hostname => Hostname, |
| 109 | + protocol => smtp |
| 110 | + }), |
| 88 111 | {stop, normal, io_lib:format("421 ~s is too busy to accept mail right now", [Hostname])} |
| 89 112 | end. |
| 90 113 | |
| @@ -121,8 +144,12 @@ check_dnsbl(State) -> | |
| 121 144 | {ok, allowed} -> |
| 122 145 | {ok, State}; |
| 123 146 | {ok, {blocked, Service}} -> |
| 124 | - ?LOG_NOTICE("SMTP DNSBL check for ~s blocked by ~p -- closing connection with a 451", |
| 125 | - [inet:ntoa(State#state.peer), Service]), |
| 147 | + ?LOG_NOTICE(#{ |
| 148 | + text => "SMTP DNSBL check: blocked -- closing connection with a 451", |
| 149 | + src => inet:ntoa(State#state.peer), |
| 150 | + dnsbl => Service, |
| 151 | + protocol => smtp |
| 152 | + }), |
| 126 153 | Error = io_lib:format("451 ~s has recently sent spam. If you are not a spammer, please try later. Listed at ~s", |
| 127 154 | [inet:ntoa(State#state.peer), Service]), |
| 128 155 | {error, Error, State} |
| @@ -141,14 +168,32 @@ handle_RCPT(To, State) -> | |
| 141 168 | % - To = <noreply+MSGID@example.org> |
| 142 169 | % - Return-Path header should be present and contains <> |
| 143 170 | case zotonic_listen_smtp_receive:get_site(To) of |
| 144 | - {ok, _} -> |
| 145 | - ?LOG_NOTICE("SMTP accepting incoming email for ~p", [To]), |
| 171 | + {ok, Site} -> |
| 172 | + ?LOG_INFO(#{ |
| 173 | + text => "SMTP accepting incoming email", |
| 174 | + recipient => To, |
| 175 | + site => Site, |
| 176 | + src => inet:ntoa(State#state.peer), |
| 177 | + protocol => smtp |
| 178 | + }), |
| 146 179 | {ok, State}; |
| 147 180 | {error, unknown_host} -> |
| 148 | - ?LOG_WARNING("SMTP not accepting mail for ~p: unknown host", [To]), |
| 181 | + ?LOG_WARNING(#{ |
| 182 | + text => "SMTP not accepting mail", |
| 183 | + reason => unknown_host, |
| 184 | + recipient => To, |
| 185 | + src => inet:ntoa(State#state.peer), |
| 186 | + protocol => smtp |
| 187 | + }), |
| 149 188 | {error, "551 User not local. Relay denied.", State}; |
| 150 189 | {error, not_running} -> |
| 151 | - ?LOG_WARNING("SMTP not accepting mail for ~p: site not running", [To]), |
| 190 | + ?LOG_WARNING(#{ |
| 191 | + text => "SMTP not accepting mail for site", |
| 192 | + reason => not_running, |
| 193 | + recipient => To, |
| 194 | + src => inet:ntoa(State#state.peer), |
| 195 | + protocol => smtp |
| 196 | + }), |
| 152 197 | {error, "453 System not accepting network messages.", State} |
| 153 198 | % {error, Reason} -> |
| 154 199 | % ?LOG_INFO("SMTP not accepting mail for ~p: ~p", [Reason]), |
| @@ -200,8 +245,14 @@ decode_and_receive(MsgId, From, To, DataRcvd, State) -> | |
| 200 245 | {ok, {Type, Subtype, Headers, _Params, Body} = Decoded} -> |
| 201 246 | case find_bounce_id({Type, Subtype}, To, Headers) of |
| 202 247 | {ok, MessageId} -> |
| 203 | - ?LOG_NOTICE("SMTP email to ~p is bounce of message id ~p", |
| 204 | - [ To, MessageId ]), |
| 248 | + ?LOG_NOTICE(#{ |
| 249 | + text => "SMTP email is bounce of previous message id", |
| 250 | + recipient => To, |
| 251 | + from => From, |
| 252 | + message_id => MessageId, |
| 253 | + src => inet:ntoa(State#state.peer), |
| 254 | + protocol => smtp |
| 255 | + }), |
| 205 256 | % The e-mail server knows about the messages sent from our system. |
| 206 257 | % Only report fatal bounces, silently ignore delivery warnings |
| 207 258 | case zotonic_listen_smtp_check:is_nonfatal_bounce({Type, Subtype}, Headers, Body) of |
| @@ -211,35 +262,71 @@ decode_and_receive(MsgId, From, To, DataRcvd, State) -> | |
| 211 262 | {ok, MsgId, reset_state(State)}; |
| 212 263 | bounce -> |
| 213 264 | % Bounced, but without a message id (accept & silently drop the message) |
| 214 | - ?LOG_NOTICE("SMTP email to ~p is bounce of unknown message id", |
| 215 | - [ To ]), |
| 265 | + ?LOG_NOTICE(#{ |
| 266 | + text => "SMTP email is bounce of unknown message id", |
| 267 | + recipient => To, |
| 268 | + from => From, |
| 269 | + src => inet:ntoa(State#state.peer), |
| 270 | + protocol => smtp |
| 271 | + }), |
| 216 272 | {ok, MsgId, reset_state(State)}; |
| 217 273 | maybe_autoreply -> |
| 218 274 | % Sent to a bounce address, but not a bounce (accept & silently drop the message) |
| 219 | - ?LOG_NOTICE("SMTP email to ~p is an autoreply, ignored", |
| 220 | - [ To ]), |
| 275 | + ?LOG_NOTICE(#{ |
| 276 | + text => "SMTP email is an autoreply, ignored", |
| 277 | + recipient => To, |
| 278 | + from => From, |
| 279 | + src => inet:ntoa(State#state.peer), |
| 280 | + protocol => smtp |
| 281 | + }), |
| 221 282 | {ok, MsgId, reset_state(State)}; |
| 222 283 | no_bounce -> |
| 223 284 | receive_data(zotonic_listen_smtp_spam:spam_check(DataRcvd), |
| 224 285 | Decoded, MsgId, From, To, DataRcvd, State) |
| 225 286 | end; |
| 226 287 | {error, Reason} -> |
| 227 | - ?LOG_ERROR("SMTP receive: Message decode FAILED with ~p", [Reason]), |
| 288 | + ?LOG_ERROR(#{ |
| 289 | + text => "SMTP receive: Message decode FAILED", |
| 290 | + reason => Reason, |
| 291 | + recipient => To, |
| 292 | + from => From, |
| 293 | + src => inet:ntoa(State#state.peer), |
| 294 | + protocol => smtp |
| 295 | + }), |
| 228 296 | {error, "550 Your email cannot be parsed", State} |
| 229 297 | end. |
| 230 298 | |
| 231 299 | receive_data({ok, {ham, SpamStatus, _SpamHeaders}}, {Type, Subtype, Headers, Params, Body}, MsgId, From, To, DataRcvd, State) -> |
| 232 | - ?LOG_NOTICE("SMTP email from ~s to ~p (id ~s) (peer ~s) [~p]", |
| 233 | - [From, To, MsgId, inet_parse:ntoa(State#state.peer), SpamStatus]), |
| 300 | + ?LOG_NOTICE(#{ |
| 301 | + text => "SMTP email received", |
| 302 | + recipient => To, |
| 303 | + from => From, |
| 304 | + message_id => MsgId, |
| 305 | + src => inet:ntoa(State#state.peer), |
| 306 | + spam_status => SpamStatus |
| 307 | + }), |
| 234 308 | Received = zotonic_listen_smtp_receive:received(To, From, State#state.peer, MsgId, |
| 235 309 | {Type, Subtype}, Headers, Params, Body, DataRcvd), |
| 236 310 | reply_handled_status(Received, MsgId, reset_state(State)); |
| 237 311 | receive_data({ok, {spam, SpamStatus, _SpamHeaders}}, _Decoded, MsgId, From, To, _DataRcvd, State) -> |
| 238 | - ?LOG_NOTICE("Refusing spam from ~s to ~p (id ~s) (peer ~s) [~p]", |
| 239 | - [From, To, MsgId, inet_parse:ntoa(State#state.peer), SpamStatus]), |
| 312 | + ?LOG_NOTICE(#{ |
| 313 | + text => "SMTP Refusing spam", |
| 314 | + recipient => To, |
| 315 | + from => From, |
| 316 | + message_id => MsgId, |
| 317 | + src => inet:ntoa(State#state.peer), |
| 318 | + spam_status => SpamStatus |
| 319 | + }), |
| 240 320 | {error, zotonic_listen_smtp_spam:smtp_status(SpamStatus, From, To, State#state.peer), reset_state(State)}; |
| 241 321 | receive_data({error, Reason}, Decoded, MsgId, From, To, DataRcvd, State) -> |
| 242 | - ?LOG_NOTICE("SMTP receive: passing erronous spam check (~p) as ham for msg-id ~p", [Reason, MsgId]), |
| 322 | + ?LOG_WARNING(#{ |
| 323 | + text => "SMTP receive: passing erronous spam check as ham", |
| 324 | + reason => Reason, |
| 325 | + recipient => To, |
| 326 | + from => From, |
| 327 | + message_id => MsgId, |
| 328 | + src => inet:ntoa(State#state.peer) |
| 329 | + }), |
| 243 330 | receive_data({ok, {ham, [], []}}, Decoded, MsgId, From, To, DataRcvd, State). |
| 244 331 | |
| 245 332 | reply_handled_status(Received, MsgId, State) -> |