pysmtp/mayordomo/smtpd.py

74 lines
2.1 KiB
Python
Raw Normal View History

2021-12-28 03:01:00 -03:00
# coding: utf-8
import traceback
import asyncio
import time
import re
import sys
import os
from sqlalchemy.future import select
from .model import db, validate_direccion, get_origen, Direccion, Destinatario, Carta
from .registro import log
class ilabHandler:
async def handle_HELO(self, server, session, envelope, hostname):
ip, port = session.peer
await log.info(u"HELO '{}'".format(hostname))
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
origen = await get_origen(ip, hostname)
origen.sesiones = origen.sesiones + 1
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
await log.info(u"Cliente '{}' en su {} visita".format(hostname, origen.sesiones))
await db.commit()
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
session.host_name = 'smtp.vpc.ilab.cl'
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
return '250 smtp.vpc.ilab.cl'
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
async def handle_RCPT(self, server, session, envelope, address, rcpt_options):
await log.info(u"RCPT '{}'".format(address))
2023-10-02 16:38:46 -03:00
valid = await validate_direccion(address)
2021-12-28 03:01:00 -03:00
if valid is None:
await log.error(u"RCPT ERROR '{}' inválido".format(address))
return '501 5.5.4 destinatario invalido'
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
envelope.rcpt_tos.append(address)
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
return '250 OK'
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
async def handle_DATA(self, server, session, envelope):
# await log.debug(u"DATA FROM '{}'".format(envelope.mail_from))
# await log.debug(u"DATA RCPT TOs '{}'".format(', '.join(envelope.rcpt_tos)))
# peer = session.peer
# mail_from = envelope.mail_from
# rcpt_tos = envelope.rcpt_tos
# data = envelope.content # type: bytes
ip, port = session.peer
origen = await get_origen(ip, session.host_name)
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
try:
dbremitente = await validate_direccion(str(envelope.mail_from))
2021-12-29 01:03:36 -03:00
dbcarta = Carta(remitente=dbremitente, contenido=envelope.content.decode('utf-8'))
2021-12-28 03:01:00 -03:00
db.add(dbcarta)
await db.commit()
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
for destinatario in envelope.rcpt_tos:
dbdestinatario = await validate_direccion(str(destinatario))
dest = Destinatario(correo=dbdestinatario, carta=dbcarta, enviado=0, intentos=0)
db.add(dest)
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
origen.recibidos = origen.recibidos + 1
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
await db.commit()
await log.info(u"Correo: '{}'->'{}'".format(envelope.mail_from, ', '.join(envelope.rcpt_tos)))
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
except:
await log.error('Traceback {}'.format(traceback.format_exc()))
return '500 Error interno, reintentelo'
2023-10-02 16:38:46 -03:00
2021-12-28 03:01:00 -03:00
return '250 OK'