Запуск Python SMTPServer внутри docker - PullRequest
0 голосов
/ 24 марта 2020

Я получил этот код, чтобы получить письмо и отправить информацию о нем в RabbitMQ (файл eml отправляется в Minio):

import asyncore
from smtpd import SMTPServer
import utils as u
import os
from minio import Minio
import pika



#Sending message to RabbitMQ

def send_msg(msg,adress = 1):
    credentials = pika.PlainCredentials(os.getenv["RABBIT_USER"], os.getenv["RABBIT_PASSWORD"])
    connection = pika.BlockingConnection(pika.ConnectionParameters(os.getenv["RABBIT_HOST"], os.getenv["RABBIT_PORT"], credentials=credentials))
    u.write_log ('Connected to RabbitMQ')
    args = {'x-queue-type':'classic'}
    channel = connection.channel()
    channel.queue_declare(queue=os.getenv["RABBIT_QNAME"],  durable=True, arguments = args)
    res = channel.basic_publish(
        exchange='',
        routing_key=os.getenv["RABBIT_QNAME"],
        body=msg,
        properties = pika.BasicProperties(
            delivery_mode=2,
            content_type='application/json',
            content_encoding='utf-8'
        )
    )
    u.write_log ('Succesfully sended to RabbitMQ')



class EmlServer(SMTPServer):


# Write to file and send to Minio
    def process_message(self, peer, mailfrom, rcpttos, data,mail_options=None,rcpt_options=None):
        u.write_log('GOT MAIL')
        filename = '%s-%d.eml' % (datetime.now().strftime('%Y%m%d%H%M%S'),
                self.no)
        f = open(filename, 'w')
        data = data.decode('utf-8')
        #print(data)
        f.write(data)
        f.close
        u.write_log('go mail -'+filename)
        send_msg(filename)
        client.fput_object('dlp', filename, filename)
        u.write_log ('%s sended.' % filename)



# Some log things - nothing interesting
u.set_logger(
            os.getenv("APP_LOG_PATH", "logs/"),
            os.path.basename(__file__) + ".log",
            os.path.basename(__file__),
            float(os.getenv("APP_LOG_SIZE_MB", 10))
        )


# Connecting to Minio

u.write_log('Connecting to Minio db...')
try:
            client = Minio(os.getenv('APP_MINIO_IP'),
                           access_key=os.getenv('APP_MINIO_LOGIN'),
                           secret_key=os.getenv('APP_MINIO_PASS'), secure=False)
            u.write_log('Connected.')
except:
            u.write_log('Error connecting to Minio!.')


# Starting Email server

foo = EmlServer(('localhost', 12325), None)
print('Mail Server Started to Work')
try:
    asyncore.loop()
except KeyboardInterrupt:
    pass



Итак, я тестирую этот код с помощью этого сценария:

#!/usr/bin/env python
# -*- mode: python; coding: utf-8-unix -*-
import sys
import os.path
import smtplib


server = 'localhost'
port = 12325

mailfrom = 'kek@heh.com'
rcptto = 'test@test.org'

message = ''

filename = sys.argv[1]
if not os.path.isfile(filename):
    print('File "' + filename + '" not found.')
    sys.exit(0)
with open(filename) as f:
    message = f.read()

smtp = None
try:
    smtp = smtplib.SMTP(server, port)
    smtp.sendmail(mailfrom, rcptto, message)
except Exception as e:
    print('Failed to send mail.')
    print(str(e))
else:
    print('Succeeded to send mail.')
finally:
    if smtp != None:
        smtp.close()

Все в порядке, пока я не пытаюсь вставить первый код в docker - я получаю сообщение о неожиданно закрытом соединении.

В Dockerfile я сделал EXPOSE 12325 и в docker -композитный файл сделал то же самое:

ports:
   - "12325:12325"

Но это не поможет.

...