Haraka 3.0.3 → 3.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.yaml +5 -9
- package/.prettierrc.yml +1 -0
- package/CONTRIBUTORS.md +11 -0
- package/Changes.md +1365 -1214
- package/Plugins.md +117 -105
- package/README.md +4 -13
- package/bin/haraka +197 -298
- package/config/auth_flat_file.ini +1 -0
- package/config/dhparams.pem +8 -0
- package/config/mail_from.is_resolvable.ini +4 -2
- package/config/me +1 -0
- package/config/outbound.ini +0 -2
- package/config/plugins +36 -35
- package/config/smtp.ini +0 -1
- package/config/smtp.json +17 -0
- package/config/tls_cert.pem +23 -0
- package/config/tls_key.pem +28 -0
- package/connection.js +46 -73
- package/contrib/bsd-rc.d/haraka +3 -1
- package/contrib/plugin2npm.sh +6 -36
- package/docs/CoreConfig.md +2 -2
- package/docs/Logging.md +7 -21
- package/docs/Outbound.md +104 -201
- package/docs/Plugins.md +2 -2
- package/docs/Transaction.md +59 -82
- package/docs/plugins/queue/smtp_proxy.md +5 -10
- package/docs/plugins/tls.md +29 -9
- package/endpoint.js +16 -13
- package/haraka.js +10 -14
- package/host_pool.js +5 -5
- package/line_socket.js +3 -4
- package/logger.js +44 -28
- package/outbound/client_pool.js +27 -23
- package/outbound/config.js +4 -6
- package/outbound/fsync_writestream.js +1 -1
- package/outbound/hmail.js +178 -218
- package/outbound/index.js +86 -99
- package/outbound/qfile.js +1 -1
- package/outbound/queue.js +51 -44
- package/outbound/timer_queue.js +3 -2
- package/outbound/tls.js +19 -7
- package/package.json +59 -48
- package/plugins/.eslintrc.yaml +0 -6
- package/plugins/auth/auth_base.js +4 -2
- package/plugins/auth/auth_proxy.js +14 -12
- package/plugins/auth/auth_vpopmaild.js +1 -1
- package/plugins/block_me.js +1 -1
- package/plugins/data.signatures.js +2 -4
- package/plugins/early_talker.js +2 -1
- package/plugins/mail_from.is_resolvable.js +65 -135
- package/plugins/queue/deliver.js +4 -5
- package/plugins/queue/lmtp.js +11 -14
- package/plugins/queue/qmail-queue.js +2 -2
- package/plugins/queue/quarantine.js +2 -2
- package/plugins/queue/rabbitmq.js +16 -17
- package/plugins/queue/smtp_forward.js +3 -3
- package/plugins/queue/smtp_proxy.js +10 -1
- package/plugins/queue/test.js +2 -2
- package/plugins/rcpt_to.host_list_base.js +5 -5
- package/plugins/rcpt_to.in_host_list.js +2 -2
- package/plugins/relay.js +6 -7
- package/plugins/reseed_rng.js +1 -1
- package/plugins/status.js +37 -33
- package/plugins/tls.js +2 -2
- package/plugins/xclient.js +3 -2
- package/plugins.js +50 -54
- package/run_tests +3 -30
- package/server.js +190 -190
- package/smtp_client.js +30 -23
- package/{tests → test}/config/plugins +0 -2
- package/{tests → test}/config/smtp.ini +1 -1
- package/test/config/tls/example.com/_.example.com.key +28 -0
- package/test/config/tls/example.com/example.com.crt +25 -0
- package/test/connection.js +302 -0
- package/test/endpoint.js +94 -0
- package/{tests → test}/fixtures/line_socket.js +1 -1
- package/{tests → test}/fixtures/util_hmailitem.js +19 -25
- package/{tests → test}/host_pool.js +42 -57
- package/test/logger.js +258 -0
- package/test/outbound/hmail.js +141 -0
- package/test/outbound/index.js +220 -0
- package/test/outbound/qfile.js +126 -0
- package/test/outbound_bounce_net_errors.js +142 -0
- package/{tests → test}/outbound_bounce_rfc3464.js +110 -122
- package/test/plugins/auth/auth_base.js +484 -0
- package/test/plugins/auth/auth_vpopmaild.js +83 -0
- package/test/plugins/early_talker.js +104 -0
- package/test/plugins/mail_from.is_resolvable.js +35 -0
- package/test/plugins/queue/smtp_forward.js +206 -0
- package/test/plugins/rcpt_to.host_list_base.js +122 -0
- package/test/plugins/rcpt_to.in_host_list.js +193 -0
- package/test/plugins/relay.js +303 -0
- package/test/plugins/status.js +130 -0
- package/test/plugins/tls.js +70 -0
- package/test/plugins.js +228 -0
- package/test/rfc1869.js +73 -0
- package/test/server.js +491 -0
- package/test/smtp_client.js +299 -0
- package/test/tls_socket.js +273 -0
- package/test/transaction.js +270 -0
- package/tls_socket.js +202 -252
- package/transaction.js +8 -23
- package/CONTRIBUTING.md +0 -1
- package/bin/dkimverify +0 -40
- package/config/access.domains +0 -13
- package/config/attachment.ctype.regex +0 -2
- package/config/attachment.filename.regex +0 -1
- package/config/avg.ini +0 -5
- package/config/bounce.ini +0 -15
- package/config/data.headers.ini +0 -61
- package/config/dkim/dkim_key_gen.sh +0 -78
- package/config/dkim_sign.ini +0 -4
- package/config/dkim_verify.ini +0 -7
- package/config/dnsbl.ini +0 -23
- package/config/greylist.ini +0 -43
- package/config/helo.checks.ini +0 -52
- package/config/messagesniffer.ini +0 -18
- package/config/spamassassin.ini +0 -56
- package/dkim.js +0 -614
- package/docs/plugins/avg.md +0 -35
- package/docs/plugins/bounce.md +0 -69
- package/docs/plugins/clamd.md +0 -147
- package/docs/plugins/esets.md +0 -8
- package/docs/plugins/greylist.md +0 -90
- package/docs/plugins/helo.checks.md +0 -135
- package/docs/plugins/messagesniffer.md +0 -163
- package/docs/plugins/spamassassin.md +0 -180
- package/outbound/mx_lookup.js +0 -70
- package/plugins/auth/auth_ldap.js +0 -3
- package/plugins/avg.js +0 -162
- package/plugins/backscatterer.js +0 -25
- package/plugins/bounce.js +0 -381
- package/plugins/clamd.js +0 -382
- package/plugins/data.uribl.js +0 -4
- package/plugins/dkim_sign.js +0 -395
- package/plugins/dkim_verify.js +0 -62
- package/plugins/dns_list_base.js +0 -221
- package/plugins/dnsbl.js +0 -146
- package/plugins/dnswl.js +0 -58
- package/plugins/esets.js +0 -71
- package/plugins/graph.js +0 -5
- package/plugins/greylist.js +0 -645
- package/plugins/helo.checks.js +0 -533
- package/plugins/messagesniffer.js +0 -381
- package/plugins/rcpt_to.ldap.js +0 -3
- package/plugins/rcpt_to.max_count.js +0 -24
- package/plugins/spamassassin.js +0 -384
- package/tests/config/dkim/example.com/dns +0 -29
- package/tests/config/dkim/example.com/private +0 -6
- package/tests/config/dkim/example.com/public +0 -4
- package/tests/config/dkim/example.com/selector +0 -1
- package/tests/config/dkim.private.key +0 -6
- package/tests/config/dkim_sign.ini +0 -4
- package/tests/config/helo.checks.ini +0 -52
- package/tests/connection.js +0 -327
- package/tests/endpoint.js +0 -128
- package/tests/fixtures/vm_harness.js +0 -59
- package/tests/logger.js +0 -327
- package/tests/outbound/hmail.js +0 -112
- package/tests/outbound/index.js +0 -324
- package/tests/outbound/qfile.js +0 -67
- package/tests/outbound_bounce_net_errors.js +0 -173
- package/tests/plugins/auth/auth_base.js +0 -463
- package/tests/plugins/auth/auth_vpopmaild.js +0 -91
- package/tests/plugins/bounce.js +0 -307
- package/tests/plugins/clamd.js +0 -224
- package/tests/plugins/deprecated/relay_acl.js +0 -140
- package/tests/plugins/deprecated/relay_all.js +0 -59
- package/tests/plugins/dkim_sign.js +0 -315
- package/tests/plugins/dkim_signer.js +0 -108
- package/tests/plugins/dns_list_base.js +0 -259
- package/tests/plugins/dnsbl.js +0 -101
- package/tests/plugins/early_talker.js +0 -115
- package/tests/plugins/greylist.js +0 -58
- package/tests/plugins/helo.checks.js +0 -525
- package/tests/plugins/mail_from.is_resolvable.js +0 -116
- package/tests/plugins/queue/smtp_forward.js +0 -221
- package/tests/plugins/rcpt_to.host_list_base.js +0 -132
- package/tests/plugins/rcpt_to.in_host_list.js +0 -218
- package/tests/plugins/relay.js +0 -339
- package/tests/plugins/spamassassin.js +0 -171
- package/tests/plugins/status.js +0 -138
- package/tests/plugins/tls.js +0 -84
- package/tests/plugins.js +0 -247
- package/tests/rfc1869.js +0 -61
- package/tests/server.js +0 -510
- package/tests/smtp_client/auth.js +0 -105
- package/tests/smtp_client/basic.js +0 -101
- package/tests/smtp_client.js +0 -80
- package/tests/tls_socket.js +0 -333
- package/tests/transaction.js +0 -284
- /package/docs/{plugins → deprecated}/dkim_sign.md +0 -0
- /package/docs/{plugins → deprecated}/dkim_verify.md +0 -0
- /package/docs/{plugins → deprecated}/dnsbl.md +0 -0
- /package/docs/{plugins → deprecated}/dnswl.md +0 -0
- /package/{tests → test}/.eslintrc.yaml +0 -0
- /package/{tests → test}/config/auth_flat_file.ini +0 -0
- /package/{tests → test}/config/dhparams.pem +0 -0
- /package/{tests → test}/config/host_list +0 -0
- /package/{tests → test}/config/outbound_tls_cert.pem +0 -0
- /package/{tests → test}/config/outbound_tls_key.pem +0 -0
- /package/{tests → test}/config/smtp_forward.ini +0 -0
- /package/{tests → test}/config/tls/ec.pem +0 -0
- /package/{tests → test}/config/tls/haraka.local.pem +0 -0
- /package/{tests → test}/config/tls/mismatched.pem +0 -0
- /package/{tests → test}/config/tls.ini +0 -0
- /package/{tests → test}/config/tls_cert.pem +0 -0
- /package/{tests → test}/config/tls_key.pem +0 -0
- /package/{tests → test}/fixtures/todo_qfile.txt +0 -0
- /package/{tests → test}/installation/config/test-plugin-flat +0 -0
- /package/{tests → test}/installation/config/test-plugin.ini +0 -0
- /package/{tests → test}/installation/config/tls.ini +0 -0
- /package/{tests → test}/installation/node_modules/load_first/index.js +0 -0
- /package/{tests → test}/installation/node_modules/load_first/package.json +0 -0
- /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin-flat +0 -0
- /package/{tests → test}/installation/node_modules/test-plugin/config/test-plugin.ini +0 -0
- /package/{tests → test}/installation/node_modules/test-plugin/package.json +0 -0
- /package/{tests → test}/installation/node_modules/test-plugin/test-plugin.js +0 -0
- /package/{tests → test}/installation/plugins/base_plugin.js +0 -0
- /package/{tests → test}/installation/plugins/folder_plugin/index.js +0 -0
- /package/{tests → test}/installation/plugins/folder_plugin/package.json +0 -0
- /package/{tests → test}/installation/plugins/inherits.js +0 -0
- /package/{tests → test}/installation/plugins/load_first.js +0 -0
- /package/{tests → test}/installation/plugins/plugin.js +0 -0
- /package/{tests → test}/installation/plugins/tls.js +0 -0
- /package/{tests → test}/loud/config/dhparams.pem +0 -0
- /package/{tests → test}/loud/config/tls/goobered.pem +0 -0
- /package/{tests → test}/loud/config/tls.ini +0 -0
- /package/{tests → test}/mail_specimen/base64-root-part.txt +0 -0
- /package/{tests → test}/mail_specimen/varied-fold-lengths-preserve-data.txt +0 -0
- /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_fixed +0 -0
- /package/{tests → test}/queue/1507509981169_1507509981169_0_61403_e0Y0Ym_1_haraka +0 -0
- /package/{tests → test}/queue/1508269674999_1508269674999_0_34002_socVUF_1_haraka +0 -0
- /package/{tests → test}/queue/1508455115683_1508455115683_0_90253_9Q4o4V_1_haraka +0 -0
- /package/{tests → test}/queue/multibyte +0 -0
- /package/{tests → test}/queue/plain +0 -0
- /package/{tests → test}/queue/zero-length +0 -0
- /package/{tests → test}/test-queue/delete-me +0 -0
package/config/me
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
home.simerson.net
|
package/config/outbound.ini
CHANGED
package/config/plugins
CHANGED
|
@@ -1,71 +1,72 @@
|
|
|
1
1
|
# This file lists plugins that Haraka will run
|
|
2
2
|
#
|
|
3
3
|
# Plugin ordering often matters, run 'haraka -o -c /path/to/haraka/config'
|
|
4
|
-
# to see the order plugins (and their hooks) will run
|
|
4
|
+
# to see the order plugins (and their hooks) will run.
|
|
5
5
|
#
|
|
6
|
-
# To see a list of
|
|
6
|
+
# To see a list of installed plugins, run 'haraka -l'
|
|
7
7
|
#
|
|
8
|
-
#
|
|
8
|
+
# The plugin registry: https://github.com/haraka/Haraka/blob/master/Plugins.md
|
|
9
|
+
#
|
|
10
|
+
# To see the docs for a plugin, run 'haraka -h plugin.name'
|
|
9
11
|
|
|
10
|
-
#status
|
|
11
|
-
#process_title
|
|
12
|
-
# Log to syslog (see 'haraka -h syslog')
|
|
12
|
+
# status
|
|
13
|
+
# process_title
|
|
13
14
|
# syslog
|
|
15
|
+
# watch
|
|
14
16
|
|
|
15
17
|
# CONNECT
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
# RCPT TO address you accept mail from. See 'haraka -h access'.
|
|
18
|
+
# ----------
|
|
19
|
+
# toobusy
|
|
20
|
+
# karma
|
|
21
|
+
# relay
|
|
21
22
|
# access
|
|
22
23
|
# p0f
|
|
23
24
|
# geoip
|
|
24
25
|
# asn
|
|
25
26
|
# fcrdns
|
|
26
|
-
#
|
|
27
|
-
dnsbl
|
|
27
|
+
# dns-list
|
|
28
28
|
|
|
29
29
|
# HELO
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
helo.checks
|
|
33
|
-
# see 'haraka -h tls'
|
|
30
|
+
# ----------
|
|
31
|
+
# early_talker
|
|
32
|
+
# helo.checks
|
|
33
|
+
# see 'haraka -h tls' before enabling!
|
|
34
34
|
# tls
|
|
35
35
|
#
|
|
36
36
|
# AUTH plugins require TLS before AUTH is advertised, see
|
|
37
37
|
# https://github.com/haraka/Haraka/wiki/Require-SSL-TLS
|
|
38
|
+
# ----------
|
|
38
39
|
# auth/flat_file
|
|
39
40
|
# auth/auth_proxy
|
|
40
41
|
# auth/auth_ldap
|
|
41
42
|
|
|
42
43
|
# MAIL FROM
|
|
43
|
-
#
|
|
44
|
+
# ----------
|
|
44
45
|
mail_from.is_resolvable
|
|
45
|
-
#spf
|
|
46
|
+
# spf
|
|
46
47
|
|
|
47
48
|
# RCPT TO
|
|
48
|
-
#
|
|
49
|
-
#
|
|
49
|
+
# ----------
|
|
50
|
+
# At least one rcpt_to plugin is REQUIRED for inbound email.
|
|
50
51
|
rcpt_to.in_host_list
|
|
51
|
-
#qmail-deliverable
|
|
52
|
-
#rcpt_to.ldap
|
|
53
|
-
#rcpt_to.routes
|
|
52
|
+
# qmail-deliverable
|
|
53
|
+
# rcpt_to.ldap
|
|
54
|
+
# rcpt_to.routes
|
|
54
55
|
|
|
55
56
|
# DATA
|
|
56
|
-
#
|
|
57
|
-
#
|
|
58
|
-
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
#
|
|
57
|
+
# ----------
|
|
58
|
+
# attachment
|
|
59
|
+
# bounce
|
|
60
|
+
# clamd
|
|
61
|
+
# dkim
|
|
62
|
+
# headers
|
|
63
|
+
# limit
|
|
64
|
+
# rspamd
|
|
65
|
+
# spamassassin
|
|
66
|
+
# uribl
|
|
65
67
|
|
|
66
68
|
# QUEUE
|
|
69
|
+
# ----------
|
|
67
70
|
# queues: discard qmail-queue quarantine smtp_forward smtp_proxy
|
|
68
71
|
# Queue mail via smtp - see config/smtp_forward.ini for where your mail goes
|
|
69
72
|
queue/smtp_forward
|
|
70
|
-
|
|
71
|
-
#watch
|
package/config/smtp.ini
CHANGED
package/config/smtp.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIID3zCCAsegAwIBAgIULzqgBA7/eKhkpsSvZ3OzpAWLkYEwDQYJKoZIhvcNAQEL
|
|
3
|
+
BQAwfzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEjAQBgNVBAcM
|
|
4
|
+
CVNob3JlbGluZTENMAsGA1UECgwEVE5QSTEaMBgGA1UEAwwRaG9tZS5zaW1lcnNv
|
|
5
|
+
bi5uZXQxHDAaBgkqhkiG9w0BCQEWDW1hdHRAdG5waS5uZXQwHhcNMjQwNDI3MDM1
|
|
6
|
+
MzI2WhcNMzAwNDI2MDM1MzI2WjB/MQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz
|
|
7
|
+
aGluZ3RvbjESMBAGA1UEBwwJU2hvcmVsaW5lMQ0wCwYDVQQKDARUTlBJMRowGAYD
|
|
8
|
+
VQQDDBFob21lLnNpbWVyc29uLm5ldDEcMBoGCSqGSIb3DQEJARYNbWF0dEB0bnBp
|
|
9
|
+
Lm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKotMDxPuAU+ygZy
|
|
10
|
+
82wBMmzo7bFuM4sV1jKTuoNpIus4j98Y/uIHVc0v0A9nGYkwb4Emo5vmcF6MntHH
|
|
11
|
+
ICUTgN31W8YT0gDyyU4JdB+QHIxdMLtspDildH9wJKDxz43orOv6dsU4m542Fbk0
|
|
12
|
+
E7lnh9GV1CoHlYRcmA8KGH9jfCjfyBuW8rLRF5QLE13pFDJkJl11GKm71w8XPk9h
|
|
13
|
+
YuFvDsxhMDXDqaYdaLLQnE6NL7/fBF+31A/5+6VsHst0S8/WMvua67vxHbzGrw2i
|
|
14
|
+
zAVkyciZ/peA132krkNXNgkjKusOfJheZYpYqzPSjEmsSvKayfuf1YByz060osXC
|
|
15
|
+
0Tcd4usCAwEAAaNTMFEwHQYDVR0OBBYEFB7paKGFiG7kJfH4VljMNUa9+VURMB8G
|
|
16
|
+
A1UdIwQYMBaAFB7paKGFiG7kJfH4VljMNUa9+VURMA8GA1UdEwEB/wQFMAMBAf8w
|
|
17
|
+
DQYJKoZIhvcNAQELBQADggEBAJBhuhIi36wfDbDn0DvJXKEgukUv5dnxc8HYf8CN
|
|
18
|
+
ep51uOXQ2zBdd5A7+QNW52z29GlaLkMWgZJLUvk3v98dmGFv1DUMmAMVQeAuufDx
|
|
19
|
+
VIdRE/d6W/ynDqJ4l+IBmcczGEK0FXYh2qoLmmwybD3G0eGgSdPFICZv6eJTsBAz
|
|
20
|
+
X7F1MSORPSSVLdqP87O3Z2bR9TCSnIbie9sR8R7+ux62lbRiKR4qjcT0u4yn4z9q
|
|
21
|
+
0iqd4JC/m9YlgHNeSX0mZFT/oym4bdgPgkG/whjjDw5YpixYh5DVyEd8TeVQoNuV
|
|
22
|
+
+8XoYYcTscSeMzu/DXs9kP87u03uJzq3qjz+T5GZ6bAQsMw=
|
|
23
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCqLTA8T7gFPsoG
|
|
3
|
+
cvNsATJs6O2xbjOLFdYyk7qDaSLrOI/fGP7iB1XNL9APZxmJMG+BJqOb5nBejJ7R
|
|
4
|
+
xyAlE4Dd9VvGE9IA8slOCXQfkByMXTC7bKQ4pXR/cCSg8c+N6Kzr+nbFOJueNhW5
|
|
5
|
+
NBO5Z4fRldQqB5WEXJgPChh/Y3wo38gblvKy0ReUCxNd6RQyZCZddRipu9cPFz5P
|
|
6
|
+
YWLhbw7MYTA1w6mmHWiy0JxOjS+/3wRft9QP+fulbB7LdEvP1jL7muu78R28xq8N
|
|
7
|
+
oswFZMnImf6XgNd9pK5DVzYJIyrrDnyYXmWKWKsz0oxJrErymsn7n9WAcs9OtKLF
|
|
8
|
+
wtE3HeLrAgMBAAECggEAEZrzLoogw4onZFtoC3hkOxgt3vlDo9PygPD/jrDFyAfl
|
|
9
|
+
+nKfi8quebfEkpNb9PFp17ajnnFMlrt9gr5S+QL3hf7oK6nJRAfaA5S+yrUh/vN1
|
|
10
|
+
Iy6uHp4fWz/CylO54Th9CzyyJN0iXE/EF5DnqXqodmpFtMNsGHFr2cJ1nlgwdBnn
|
|
11
|
+
PN+ZVj/EhEoq0gzp5UI/tkheKlPFV+QNcNsfduFORxNybEWCujb5FhOUyCBxFvcZ
|
|
12
|
+
SrWGicEKsufxkW6jwI5gfrbZ/10jmBRkfb/1uQtgqUhyQeOLaE9YxSx0kk+4JeHy
|
|
13
|
+
2YlZhIMrQgOBn5+tBptucrHNJzbMowg2CUEmhiFFwQKBgQDlW6Hl1Rjw/orj4m1e
|
|
14
|
+
RjtprS37qSjuZoTSUeAC51W4WUobBYLdARkSEacQ4wBmf2j4Ax6aXV9L1hHdv3L8
|
|
15
|
+
Oc3m0mow7LLvyYNOMlNoiWPRRR0BHmpY8JnlhUSKNitfL3NUt3Ct9xOAbrKS0whG
|
|
16
|
+
wz1hyYljd1s/cHaCXUHMvZyPCQKBgQC98bDZ5fwCyYFtZb6eu4VvMFmsYZ1XrhuC
|
|
17
|
+
TwqmvEwxIVEFyzcFJB8/ogsURDw9awuPimfxFAk5tF53EIc7YMnhpE50zEE9Tz4S
|
|
18
|
+
Fn9v1MTyS93RvIgFlFa2cqlV7uXhknIyxbw200gyRuiPK2ChoCs5ckRddO5V9BxB
|
|
19
|
+
RygRVu0rUwKBgQCCQ8bx6FQgHBH6WBHR54W7AXcKZgsvS97ILWRTgdw3tc7XBgxL
|
|
20
|
+
RWJd1tTSTHtfu6F8qxjoh3umcND45tGB27rMDFnvq5/9fLAs63xf9RhSNTTB++pe
|
|
21
|
+
1Vgy+bvx285KY4LXbNB8ncXfvf+CUIV021KzhWmYqqOSpmdIp3rFtDOFMQKBgQCP
|
|
22
|
+
jqfXSBccFCgaApf7aEcFLknYGz7MEe8AobSvKAl96GxQMLK41AA6G8K74oaU9N6b
|
|
23
|
+
8kN01WvTjRsIahmLKy/ptkEFzYpRSB7llNNkNi9T4TsZVaCIdwDCjA6nwBNGVWSy
|
|
24
|
+
Mvh5h149gZIrAuHZxjBlDpPU/pdTp1fjjmAeGtDNuQKBgHuKQaE5AYqBmeZUoGPP
|
|
25
|
+
AsvnSvBt9ZY+vCjUK255s7CPWrA5kN4EZWXGB9EBYNit80CvkaNAK1jsR5qErNA0
|
|
26
|
+
HGUfBIIsUAoOV9VdeN5PoYsE4dqxlpRvuEJpgXzk4KATSdBxP7jAs2SepVlBExa9
|
|
27
|
+
yLRsVL/PYvEykaKHAyS2dwp4
|
|
28
|
+
-----END PRIVATE KEY-----
|
package/connection.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
// a single connection
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const net = require('net');
|
|
8
|
-
const os = require('os');
|
|
9
|
-
const path = require('path');
|
|
4
|
+
const dns = require('node:dns');
|
|
5
|
+
const net = require('node:net');
|
|
6
|
+
const os = require('node:os');
|
|
10
7
|
|
|
11
8
|
// npm libs
|
|
12
9
|
const ipaddr = require('ipaddr.js');
|
|
@@ -55,36 +52,36 @@ class Connection {
|
|
|
55
52
|
this.server = server;
|
|
56
53
|
this.cfg = cfg;
|
|
57
54
|
|
|
58
|
-
this.local = {
|
|
59
|
-
ip: null,
|
|
60
|
-
port: null,
|
|
55
|
+
this.local = {
|
|
56
|
+
ip: null,
|
|
57
|
+
port: null,
|
|
61
58
|
host: net_utils.get_primary_host_name(),
|
|
62
59
|
info: 'Haraka',
|
|
63
60
|
};
|
|
64
61
|
this.remote = {
|
|
65
|
-
ip: null,
|
|
66
|
-
port: null,
|
|
67
|
-
host: null,
|
|
68
|
-
info: null,
|
|
69
|
-
closed: false,
|
|
62
|
+
ip: null,
|
|
63
|
+
port: null,
|
|
64
|
+
host: null,
|
|
65
|
+
info: null,
|
|
66
|
+
closed: false,
|
|
70
67
|
is_private: false,
|
|
71
68
|
is_local: false,
|
|
72
69
|
};
|
|
73
70
|
this.hello = {
|
|
74
|
-
host: null,
|
|
75
|
-
verb: null,
|
|
71
|
+
host: null,
|
|
72
|
+
verb: null,
|
|
76
73
|
};
|
|
77
74
|
this.tls = {
|
|
78
|
-
enabled: false,
|
|
79
|
-
advertised: false,
|
|
75
|
+
enabled: false,
|
|
76
|
+
advertised: false,
|
|
80
77
|
verified: false,
|
|
81
78
|
cipher: {},
|
|
82
79
|
};
|
|
83
80
|
this.proxy = {
|
|
84
|
-
allowed: false,
|
|
85
|
-
ip: null,
|
|
81
|
+
allowed: false,
|
|
82
|
+
ip: null,
|
|
86
83
|
type: null,
|
|
87
|
-
timer: null,
|
|
84
|
+
timer: null,
|
|
88
85
|
};
|
|
89
86
|
this.set('tls', 'enabled', (!!server.has_tls));
|
|
90
87
|
|
|
@@ -132,8 +129,7 @@ class Connection {
|
|
|
132
129
|
this.last_rcpt_msg = null;
|
|
133
130
|
this.hook = null;
|
|
134
131
|
if (this.cfg.headers.show_version) {
|
|
135
|
-
|
|
136
|
-
this.local.info += `/${hpj.version}`;
|
|
132
|
+
this.local.info += `/${utils.getVersion(__dirname)}`;
|
|
137
133
|
}
|
|
138
134
|
Connection.setupClient(this);
|
|
139
135
|
}
|
|
@@ -223,11 +219,10 @@ class Connection {
|
|
|
223
219
|
setTLS (obj) {
|
|
224
220
|
this.set('hello', 'host', undefined);
|
|
225
221
|
this.set('tls', 'enabled', true);
|
|
226
|
-
const
|
|
227
|
-
options.forEach(t => {
|
|
222
|
+
for (const t of ['cipher','verified','verifyError','peerCertificate']) {
|
|
228
223
|
if (obj[t] === undefined) return;
|
|
229
224
|
this.set('tls', t, obj[t]);
|
|
230
|
-
}
|
|
225
|
+
}
|
|
231
226
|
// prior to 2017-07, authorized and verified were both used. Verified
|
|
232
227
|
// seems to be the more common and has the property updated in the
|
|
233
228
|
// tls object. However, authorized has been up-to-date in the notes. Store
|
|
@@ -269,25 +264,9 @@ class Connection {
|
|
|
269
264
|
this.set('remote.is_private', true);
|
|
270
265
|
}
|
|
271
266
|
else {
|
|
272
|
-
this.set('remote.is_private', net_utils.
|
|
267
|
+
this.set('remote.is_private', net_utils.is_private_ip(this.remote.ip));
|
|
273
268
|
}
|
|
274
269
|
}
|
|
275
|
-
|
|
276
|
-
// sunset 3.0.0
|
|
277
|
-
if (prop_str === 'hello.verb') {
|
|
278
|
-
this.greeting = val;
|
|
279
|
-
}
|
|
280
|
-
else if (prop_str === 'tls.enabled') {
|
|
281
|
-
this.using_tls = val;
|
|
282
|
-
}
|
|
283
|
-
else if (prop_str === 'proxy.ip') {
|
|
284
|
-
this.haproxy_ip = val;
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
const legacy_name = prop_str.split('.').join('_');
|
|
288
|
-
this[legacy_name] = val;
|
|
289
|
-
}
|
|
290
|
-
// /sunset
|
|
291
270
|
}
|
|
292
271
|
get (prop_str) {
|
|
293
272
|
return prop_str.split('.').reduce((prev, curr) => {
|
|
@@ -395,7 +374,7 @@ class Connection {
|
|
|
395
374
|
}
|
|
396
375
|
process_data (data) {
|
|
397
376
|
if (this.state >= states.DISCONNECTING) {
|
|
398
|
-
this.
|
|
377
|
+
this.loginfo(`data after disconnect from ${this.remote.ip}`);
|
|
399
378
|
return;
|
|
400
379
|
}
|
|
401
380
|
|
|
@@ -538,6 +517,7 @@ class Connection {
|
|
|
538
517
|
code = msg.code;
|
|
539
518
|
msg = msg.reply;
|
|
540
519
|
}
|
|
520
|
+
|
|
541
521
|
if (!Array.isArray(msg)) {
|
|
542
522
|
messages = msg.toString().split(/\n/);
|
|
543
523
|
}
|
|
@@ -574,6 +554,8 @@ class Connection {
|
|
|
574
554
|
buf = `${buf}${line}\r\n`;
|
|
575
555
|
}
|
|
576
556
|
|
|
557
|
+
if (this.client.write === undefined) return buf; // testing
|
|
558
|
+
|
|
577
559
|
try {
|
|
578
560
|
this.client.write(buf);
|
|
579
561
|
}
|
|
@@ -635,7 +617,6 @@ class Connection {
|
|
|
635
617
|
this.client.end();
|
|
636
618
|
}
|
|
637
619
|
get_capabilities () {
|
|
638
|
-
|
|
639
620
|
return [];
|
|
640
621
|
}
|
|
641
622
|
tran_uuid () {
|
|
@@ -869,7 +850,7 @@ class Connection {
|
|
|
869
850
|
default:
|
|
870
851
|
// RFC5321 section 4.1.1.1
|
|
871
852
|
// Hostname/domain should appear after 250
|
|
872
|
-
this.respond(250, `${this.local.host} Hello ${this.get_remote('host')}${this.ehlo_hello_message}`);
|
|
853
|
+
this.respond(250, `${this.local.host} Hello ${this.get_remote('host')}, ${this.ehlo_hello_message}`);
|
|
873
854
|
}
|
|
874
855
|
}
|
|
875
856
|
ehlo_respond (retval, msg) {
|
|
@@ -902,7 +883,7 @@ class Connection {
|
|
|
902
883
|
// Hostname/domain should appear after 250
|
|
903
884
|
|
|
904
885
|
const response = [
|
|
905
|
-
`${this.local.host} Hello ${this.get_remote('host')}${this.ehlo_hello_message}`,
|
|
886
|
+
`${this.local.host} Hello ${this.get_remote('host')}, ${this.ehlo_hello_message}`,
|
|
906
887
|
"PIPELINING",
|
|
907
888
|
"8BITMIME",
|
|
908
889
|
];
|
|
@@ -977,7 +958,6 @@ class Connection {
|
|
|
977
958
|
})
|
|
978
959
|
}
|
|
979
960
|
mail_respond (retval, msg) {
|
|
980
|
-
const self = this;
|
|
981
961
|
if (!this.transaction) {
|
|
982
962
|
this.logerror("mail_respond found no transaction!");
|
|
983
963
|
return;
|
|
@@ -992,12 +972,12 @@ class Connection {
|
|
|
992
972
|
}
|
|
993
973
|
);
|
|
994
974
|
|
|
995
|
-
|
|
975
|
+
const store_results = (action) => {
|
|
996
976
|
let addr = sender.format();
|
|
997
977
|
if (addr.length > 2) { // all but null sender
|
|
998
978
|
addr = addr.substr(1, addr.length -2); // trim off < >
|
|
999
979
|
}
|
|
1000
|
-
|
|
980
|
+
this.transaction.results.add({name: 'mail_from'}, {
|
|
1001
981
|
action,
|
|
1002
982
|
code: constants.translate(retval),
|
|
1003
983
|
address: addr,
|
|
@@ -1008,25 +988,25 @@ class Connection {
|
|
|
1008
988
|
case constants.deny:
|
|
1009
989
|
this.respond(550, msg || `${dmsg} denied`, () => {
|
|
1010
990
|
store_results('reject');
|
|
1011
|
-
|
|
991
|
+
this.reset_transaction();
|
|
1012
992
|
});
|
|
1013
993
|
break;
|
|
1014
994
|
case constants.denydisconnect:
|
|
1015
995
|
this.respond(550, msg || `${dmsg} denied`, () => {
|
|
1016
996
|
store_results('reject');
|
|
1017
|
-
|
|
997
|
+
this.disconnect();
|
|
1018
998
|
});
|
|
1019
999
|
break;
|
|
1020
1000
|
case constants.denysoft:
|
|
1021
1001
|
this.respond(450, msg || `${dmsg} denied`, () => {
|
|
1022
1002
|
store_results('tempfail');
|
|
1023
|
-
|
|
1003
|
+
this.reset_transaction();
|
|
1024
1004
|
});
|
|
1025
1005
|
break;
|
|
1026
1006
|
case constants.denysoftdisconnect:
|
|
1027
1007
|
this.respond(450, msg || `${dmsg} denied`, () => {
|
|
1028
1008
|
store_results('tempfail');
|
|
1029
|
-
|
|
1009
|
+
this.disconnect();
|
|
1030
1010
|
});
|
|
1031
1011
|
break;
|
|
1032
1012
|
default:
|
|
@@ -1469,7 +1449,7 @@ class Connection {
|
|
|
1469
1449
|
return received_header;
|
|
1470
1450
|
}
|
|
1471
1451
|
auth_results (message) {
|
|
1472
|
-
//
|
|
1452
|
+
// https://datatracker.ietf.org/doc/rfc7001/
|
|
1473
1453
|
const has_tran = !!((this.transaction?.notes));
|
|
1474
1454
|
|
|
1475
1455
|
// initialize connection note
|
|
@@ -1719,7 +1699,12 @@ class Connection {
|
|
|
1719
1699
|
});
|
|
1720
1700
|
}
|
|
1721
1701
|
queue_msg (retval, msg) {
|
|
1722
|
-
if (msg)
|
|
1702
|
+
if (msg) {
|
|
1703
|
+
if (typeof msg === 'object' && msg.constructor.name === 'DSN') {
|
|
1704
|
+
return msg.reply
|
|
1705
|
+
}
|
|
1706
|
+
return msg;
|
|
1707
|
+
}
|
|
1723
1708
|
|
|
1724
1709
|
switch (retval) {
|
|
1725
1710
|
case constants.ok:
|
|
@@ -1754,7 +1739,8 @@ class Connection {
|
|
|
1754
1739
|
}
|
|
1755
1740
|
}
|
|
1756
1741
|
queue_outbound_respond (retval, msg) {
|
|
1757
|
-
if (
|
|
1742
|
+
if (this.remote.closed) return;
|
|
1743
|
+
msg = this.queue_msg(retval, msg) || 'Message Queued';
|
|
1758
1744
|
this.store_queue_result(retval, msg);
|
|
1759
1745
|
msg = `${msg} (${this.transaction.uuid})`;
|
|
1760
1746
|
if (retval !== constants.ok) {
|
|
@@ -1799,7 +1785,7 @@ class Connection {
|
|
|
1799
1785
|
});
|
|
1800
1786
|
break;
|
|
1801
1787
|
default:
|
|
1802
|
-
outbound.
|
|
1788
|
+
outbound.send_trans_email(this.transaction, (retval2, msg2) => {
|
|
1803
1789
|
if (!msg2) msg2 = this.queue_msg(retval2, msg);
|
|
1804
1790
|
switch (retval2) {
|
|
1805
1791
|
case constants.ok:
|
|
@@ -1830,7 +1816,7 @@ class Connection {
|
|
|
1830
1816
|
}
|
|
1831
1817
|
}
|
|
1832
1818
|
queue_respond (retval, msg) {
|
|
1833
|
-
|
|
1819
|
+
msg = this.queue_msg(retval, msg);
|
|
1834
1820
|
this.store_queue_result(retval, msg);
|
|
1835
1821
|
msg = `${msg} (${this.transaction.uuid})`;
|
|
1836
1822
|
|
|
@@ -1910,17 +1896,4 @@ exports.createConnection = (client, server, cfg) => {
|
|
|
1910
1896
|
return new Connection(client, server, cfg);
|
|
1911
1897
|
}
|
|
1912
1898
|
|
|
1913
|
-
|
|
1914
|
-
for (const key in logger) {
|
|
1915
|
-
if (!/^log\w/.test(key)) continue;
|
|
1916
|
-
Connection.prototype[key] = (function (level) {
|
|
1917
|
-
return function () {
|
|
1918
|
-
// pass the connection instance to logger
|
|
1919
|
-
const args = [ this ];
|
|
1920
|
-
for (let i=0, l=arguments.length; i<l; i++) {
|
|
1921
|
-
args.push(arguments[i]);
|
|
1922
|
-
}
|
|
1923
|
-
logger[level].apply(logger, args);
|
|
1924
|
-
};
|
|
1925
|
-
})(key);
|
|
1926
|
-
}
|
|
1899
|
+
logger.add_log_methods(Connection)
|
package/contrib/bsd-rc.d/haraka
CHANGED
|
@@ -14,6 +14,8 @@ rcvar="haraka_enable"
|
|
|
14
14
|
command="/usr/local/bin/haraka"
|
|
15
15
|
pidfile="/var/run/${name}.pid"
|
|
16
16
|
|
|
17
|
+
haraka_flags=${haraka_flags:="-c /data"}
|
|
18
|
+
|
|
17
19
|
start_cmd="start"
|
|
18
20
|
status_cmd="status"
|
|
19
21
|
stop_cmd="stop"
|
|
@@ -30,7 +32,7 @@ status()
|
|
|
30
32
|
if [ -f $pidfile ];
|
|
31
33
|
then
|
|
32
34
|
LPID=`cat $pidfile`
|
|
33
|
-
LPROC=`/bin/ps
|
|
35
|
+
LPROC=`/bin/ps -p $PID`
|
|
34
36
|
if [ -n $LPROC ];
|
|
35
37
|
then
|
|
36
38
|
echo "$name is running as $LPID"
|
package/contrib/plugin2npm.sh
CHANGED
|
@@ -32,7 +32,8 @@ if grep template "$PLUGIN_REPO/README.md"; then
|
|
|
32
32
|
-e "s/template\.ini/$1.ini/" \
|
|
33
33
|
"$PLUGIN_REPO/test/index.js"
|
|
34
34
|
|
|
35
|
-
sed -i '' -e "s/template/${1}/g" package.json
|
|
35
|
+
sed -i '' -e "s/template/${1}/g" "$PLUGIN_REPO/package.json"
|
|
36
|
+
|
|
36
37
|
sed -i '' \
|
|
37
38
|
-e "s/_template/_${1}/g" \
|
|
38
39
|
-e "s/template\.ini/$1.ini/" \
|
|
@@ -73,39 +74,8 @@ DEPRECATED
|
|
|
73
74
|
$GIT_CMD add index.js
|
|
74
75
|
fi
|
|
75
76
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
git rm "tests/plugins/$1.js"
|
|
81
|
-
if [ ! -f "$PLUGIN_REPO/run_tests" ]; then
|
|
82
|
-
tee "$PLUGIN_REPO/run_tests" <<'EO_TEST_RUN'
|
|
83
|
-
#!/usr/bin/env node
|
|
84
|
-
'use strict'
|
|
85
|
-
try {
|
|
86
|
-
var reporter = require('nodeunit-x').reporters.default;
|
|
87
|
-
}
|
|
88
|
-
catch (e) {
|
|
89
|
-
console.log(`
|
|
90
|
-
Error: ${e.message}
|
|
91
|
-
|
|
92
|
-
Cannot find nodeunit. Did you run 'npm install'?
|
|
93
|
-
`)
|
|
94
|
-
process.exit()
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
process.chdir(__dirname);
|
|
98
|
-
|
|
99
|
-
reporter.run([ 'test' ], undefined, (err) => {
|
|
100
|
-
process.exit(((err) ? 1 : 0));
|
|
101
|
-
});
|
|
102
|
-
EO_TEST_RUN
|
|
103
|
-
|
|
104
|
-
sed -i '' \
|
|
105
|
-
-e 's/"_mocha"/"nodeunit-x"/' \
|
|
106
|
-
-e 's/"mocha"/"nodeunit-x"/' \
|
|
107
|
-
"$PLUGIN_REPO/package.json"
|
|
108
|
-
|
|
109
|
-
$GIT_CMD add package.json
|
|
110
|
-
fi
|
|
77
|
+
if [ -f "test/plugins/$1.js" ]; then
|
|
78
|
+
echo "copying test/plugins/$1.js"
|
|
79
|
+
cp "test/plugins/$1.js" "$PLUGIN_REPO/test/index.js"
|
|
80
|
+
git rm "test/plugins/$1.js"
|
|
111
81
|
fi
|
package/docs/CoreConfig.md
CHANGED
|
@@ -7,9 +7,9 @@ The Haraka core reads some configuration files to determine a few actions:
|
|
|
7
7
|
|
|
8
8
|
* smtp.yaml or smtp.json
|
|
9
9
|
|
|
10
|
-
If either of these files exist then they are loaded first
|
|
10
|
+
If either of these files exist then they are loaded first.
|
|
11
11
|
This file is designed to use the JSON/YAML file overrides documented in
|
|
12
|
-
|
|
12
|
+
[haraka-config](https://github.com/haraka/haraka-config) to optionally provide the entire configuration in a single file.
|
|
13
13
|
|
|
14
14
|
* databytes
|
|
15
15
|
|
package/docs/Logging.md
CHANGED
|
@@ -17,20 +17,13 @@ Logging conventions within Haraka
|
|
|
17
17
|
|
|
18
18
|
This section pertains to the built in logging. For log plugins like ([haraka-plugin-syslog](https://github.com/haraka/haraka-plugin-syslog)), refer to the plugin's docs.
|
|
19
19
|
|
|
20
|
-
See also
|
|
21
|
-
------------------
|
|
22
|
-
[https://github.com/haraka/Haraka/pull/119](https://github.com/haraka/Haraka/pull/119)
|
|
23
|
-
|
|
24
20
|
The logline by default will be in the form of:
|
|
25
21
|
|
|
26
22
|
[level] [uuid] [origin] message
|
|
27
23
|
|
|
28
|
-
Where origin is "core" or the name of the plugin which
|
|
29
|
-
triggered the message, and "uuid" is the ID of the
|
|
30
|
-
connection associated with the message.
|
|
24
|
+
Where origin is "core" or the name of the plugin which triggered the message, and "uuid" is the ID of the connection associated with the message.
|
|
31
25
|
|
|
32
|
-
When calling a log method on logger, you should provide the
|
|
33
|
-
plugin object and the connection object anywhere in the arguments
|
|
26
|
+
When calling a log method on logger, you should provide the plugin object and the connection object anywhere in the arguments
|
|
34
27
|
to the log method.
|
|
35
28
|
|
|
36
29
|
logger.logdebug("i like turtles", plugin, connection);
|
|
@@ -39,8 +32,7 @@ Will yield, for example,
|
|
|
39
32
|
|
|
40
33
|
[DEBUG] [7F1C820F-DC79-4192-9AA6-5307354B20A6] [dnsbl] i like turtles
|
|
41
34
|
|
|
42
|
-
If you call the log method on the connection object, you can
|
|
43
|
-
forego the connection as argument:
|
|
35
|
+
If you call the log method on the connection object, you can forego the connection as argument:
|
|
44
36
|
|
|
45
37
|
connection.logdebug("turtles all the way down", plugin);
|
|
46
38
|
|
|
@@ -48,18 +40,13 @@ and similarly for the log methods on the plugin object:
|
|
|
48
40
|
|
|
49
41
|
plugin.logdebug("he just really likes turtles", connection);
|
|
50
42
|
|
|
51
|
-
failing to provide a connection and/or plugin object will
|
|
52
|
-
the default values in the log (currently "core").
|
|
43
|
+
failing to provide a connection and/or plugin object will leavethe default values in the log (currently "core").
|
|
53
44
|
|
|
54
|
-
This is implemented by testing for argument type in
|
|
55
|
-
the logger.js log\* method. objects-as-arguments are then sniffed
|
|
56
|
-
to try to determine if they're a connection or plugin instance.
|
|
45
|
+
This is implemented by testing for argument type in the logger.js log\* method. objects-as-arguments are then sniffed to try to determine if they're a connection or plugin instance.
|
|
57
46
|
|
|
58
47
|
### Log formats
|
|
59
48
|
|
|
60
|
-
Apart from the default log format described above, Haraka also supports logging
|
|
61
|
-
as [`logfmt`](https://brandur.org/logfmt) and JSON. These can be used by
|
|
62
|
-
changing the `format` attribute in `log.ini` to the desired format, e.g.:
|
|
49
|
+
Apart from the default log format described above, Haraka also supports logging as [`logfmt`](https://brandur.org/logfmt) and JSON. These can be used by changing the `format` attribute in `log.ini` to the desired format, e.g.:
|
|
63
50
|
|
|
64
51
|
```ini
|
|
65
52
|
; format=default
|
|
@@ -77,8 +64,7 @@ And the same line formatted as JSON:
|
|
|
77
64
|
{"level":"PROTOCOL","uuid":"9FF7F70E-5D57-435A-AAD9-EA069B6159D9.1","source":"core","message":"S: 354 go ahead, make my day"}
|
|
78
65
|
```
|
|
79
66
|
|
|
80
|
-
Any objects passed to the log methods will also have their properties included
|
|
81
|
-
in the log line. For example, using `logfmt`:
|
|
67
|
+
Any objects passed to the log methods will also have their properties included in the log line. For example, using `logfmt`:
|
|
82
68
|
|
|
83
69
|
level=NOTICE uuid=9FF7F70E-5D57-435A-AAD9-EA069B6159D9.1 source=core message=disconnect ip=127.0.0.1 rdns=Unknown helo=3h2dnz8a0if relay=N early=N esmtp=N tls=N pipe=N errors=0 txns=1 rcpts=1/0/0 msgs=1/0/0 bytes=222 lr="" time=0.052
|
|
84
70
|
|