From 59c2434bf31778e07a83c93260f9fdb99d9e4a4b Mon Sep 17 00:00:00 2001 From: Israel Figueroa Date: Sat, 16 Jul 2022 00:00:13 -0400 Subject: [PATCH] DKIM Support v1 --- docker-compose.yml | 1 + mayordomo/__init__.py | 21 ++++++++++++++++++++- mayordomo/requirements.txt | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3170373..b3097d6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,6 +32,7 @@ services: restart: unless-stopped environment: - DEBUG=False + - DKIM_PRIVKEY=myPricKey.pem - DNS_RELAY=192.168.0.1 # - DNS_RELAY=200.1.21.80 - SQLALCHEMY_DATABASE_URI=postgresql+asyncpg://docker:docker@db/docker diff --git a/mayordomo/__init__.py b/mayordomo/__init__.py index f61ef73..6a23657 100644 --- a/mayordomo/__init__.py +++ b/mayordomo/__init__.py @@ -6,6 +6,9 @@ import sys import os import aiosmtplib import traceback +import dkim +from email.parser import Parser +from email.policy import default from aiosmtpd.controller import Controller from sqlalchemy.future import select from .model import db, update_mx, update_a, FQDN, MXRecord, ARecord, IPV4Addr, Direccion, Destinatario, Carta @@ -17,6 +20,7 @@ from .resolver import updateDNS smtprelayport = '10025' bindip = '0.0.0.0' +dkimKey = None # cacerts = '/etc/ssl/certs/ca-certificates.crt' # keyfile = '/var/run/secrets/keyfile' @@ -27,6 +31,12 @@ if not os.environ.get('SMTP_HOSTNAME'): else: banner_hostname = os.environ.get('SMTP_HOSTNAME') +if os.environ.get('DKIM_PRIVKEY'): + try: + dkimKey = open(os.environ.get('DKIM_PRIVKEY'), 'r').read() + except: + pass + async def enviarCorreosDominio(dominioid): valido = int(time.time()) @@ -117,7 +127,16 @@ async def enviarCorreosDominio(dominioid): await log.info("Carta Rte '{}' => Destinatarios '{}' ".format(remitente.direccion, ', '.join(rcpt_to))) try: - await smtp.sendmail(remitente.direccion, rcpt_to, carta.contenido.encode('utf-8')) + + if dkimKey is not None: + mail2send = Parser(policy=default).parsestr(carta.contenido) + mail2send['DKIM-Signature'] = dkim.sign(carta.contenido, b'mayordomo', b'ilab.cl', dkimKey, include_headers=[b'from', b'to', b'subject', b'message-id']).decode()[len("DKIM-Signature: "):] + + await smtp.sendmail(remitente.direccion, rcpt_to, mail2send.encode('utf-8')) + + else: + await smtp.sendmail(remitente.direccion, rcpt_to, carta.contenido.encode('utf-8')) + for destinatario in rdest.scalars(): destinatario.enviado = 1 diff --git a/mayordomo/requirements.txt b/mayordomo/requirements.txt index b2129e7..b47bdd5 100644 --- a/mayordomo/requirements.txt +++ b/mayordomo/requirements.txt @@ -6,3 +6,4 @@ asyncpg python-daemon async_dns aiosmtplib +dkimpy \ No newline at end of file