1
0
mirror of https://github.com/mail-in-a-box/mailinabox.git synced 2025-04-03 00:07:05 +00:00
mailinabox/management/reporting/uidata/messages_received.py
2022-09-19 14:45:11 -04:00

120 lines
3.3 KiB
Python

#####
##### This file is part of Mail-in-a-Box-LDAP which is released under the
##### terms of the GNU Affero General Public License as published by the
##### Free Software Foundation, either version 3 of the License, or (at
##### your option) any later version. See file LICENSE or go to
##### https://github.com/downtownallday/mailinabox-ldap for full license
##### details.
#####
from .Timeseries import Timeseries
from .exceptions import InvalidArgsError
from .top import select_top
with open(__file__.replace('.py','.1.sql')) as fp:
select_1 = fp.read()
with open(__file__.replace('.py','.2.sql')) as fp:
select_2 = fp.read()
with open(__file__.replace('.py','.3.sql')) as fp:
select_3 = fp.read()
with open(__file__.replace('.py','.4.sql')) as fp:
select_4 = fp.read()
with open(__file__.replace('.py','.5.sql')) as fp:
select_5 = fp.read()
def messages_received(conn, args):
'''
messages recived from the internet
'''
try:
ts = Timeseries(
"Messages received from the internet",
args['start'],
args['end'],
args['binsize']
)
except KeyError:
raise InvalidArgsError()
s_received = ts.add_series('received', 'messages received')
c = conn.cursor()
try:
for row in c.execute(select_1.format(timefmt=ts.timefmt), {
'start_date':ts.start,
'end_date':ts.end,
'start_unixepoch':ts.start_unixepoch,
'binsize':ts.binsize
}):
idx = ts.insert_date(row['bin'])
s_received['values'][idx] = row['count']
# top 10 senders (envelope_from) by message count
top_senders_by_count = select_top(
c,
select_2,
ts.start,
ts.end,
"Top 10 senders by count",
[ 'email', 'count' ],
[ 'text/email', 'number/plain' ]
)
# top 10 senders (envelope_from) by message size
top_senders_by_size = select_top(
c,
select_3,
ts.start,
ts.end,
"Top 10 senders by size",
[ 'email', 'size' ],
[ 'text/email', 'number/size' ]
)
# top 10 remote servers/domains (remote hosts) by average spam score
top_hosts_by_spam_score = select_top(
c,
select_4,
ts.start,
ts.end,
"Top servers by average spam score",
[ 'remote_host', 'avg_spam_score' ],
[ 'text/hostname', { 'type':'decimal', 'places':2} ]
)
# top 10 users receiving the most spam
top_user_receiving_spam = select_top(
c,
select_5,
ts.start,
ts.end,
"Top 10 users receiving spam",
[
'rcpt_to',
'count'
],
[
{ 'type': 'text', 'subtype':'email', 'label':'User' },
'number/plain'
]
)
finally:
c.close()
return {
'top_senders_by_count': top_senders_by_count,
'top_senders_by_size': top_senders_by_size,
'top_hosts_by_spam_score': top_hosts_by_spam_score,
'top_user_receiving_spam': top_user_receiving_spam,
'ts_received': ts.asDict(),
}