#!/usr/bin/env python3
|
# pymilter 1.0.3
|
# mariadb 0.9.58
|
|
import Milter
|
import mariadb
|
|
MAIL_RATE_DB = 'mail_rate_statistics'
|
MAIL_RATE_TBL = 'mail_counter'
|
|
def main():
|
dbconn = initialize_database()
|
socketname = "/var/run/milters/mail_rate_milter.sock"
|
timeout = 300
|
Milter.factory = MailRateMilter
|
Milter.factory.dbconn = dbconn
|
Milter.set_exception_policy(Milter.CONTINUE)
|
Milter.runmilter("mail_rate_milter", socketname, timeout)
|
|
def initialize_database():
|
dbconn = mariadb.connect(host='localhost', database='{}'.format(MAIL_RATE_DB))
|
dbconn.auto_reconnect = True
|
return dbconn
|
|
class MailRateMilter(Milter.Base):
|
def __init__(self):
|
self.id = Milter.uniqueID()
|
self.server = str()
|
|
@Milter.noreply
|
def hello(self, hostname):
|
self.server = hostname
|
return Milter.CONTINUE
|
|
@Milter.noreply
|
def envfrom(self, f, *str):
|
self.add_addr_to_rate_db(f)
|
return Milter.ACCEPT
|
|
def add_addr_to_rate_db(self, mail_from):
|
self.dbconn.ping()
|
account = mail_from.strip('<>').partition('@')[0]
|
domain = mail_from.strip('<>').partition('@')[2]
|
dbcurs = self.dbconn.cursor()
|
sql = "INSERT INTO {} VALUES (CURRENT_TIMESTAMP(3), ?, ?, ?, ?)".format(MAIL_RATE_TBL)
|
dbcurs.execute(sql, (mail_from.strip('<>'), account, domain, self.server))
|
|
if __name__=="__main__":
|
main()
|