Я получил этот код, чтобы получить письмо и отправить информацию о нем в 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"
Но это не поможет.