1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- import email
- from email.header import decode_header
- from data import dataInstance
- def decode_str(s):
- value, charset = decode_header(s)[0]
- if charset:
- value = value.decode(charset)
- return value
- def guess_charset(msg):
- charset = msg.get_charset()
- if charset is None:
- content_type = msg.get('Content-Type', '').lower()
- pos = content_type.find('charset=')
- if pos >= 0:
- charset = content_type[pos + 8:].strip()
- return charset
- def print_part(msg):
- rs = ""
- content_type = msg.get_content_type()
- if content_type == 'text/plain' or content_type == 'text/html':
- content = msg.get_payload(decode=True)
- charset = guess_charset(msg)
- if charset:
- content = content.decode(charset)
- rs = rs + str(content)
- else:
- rs = rs + str(content_type)
- return rs
- def print_info(msg):
- rs = ""
- if (msg.is_multipart()):
- parts = msg.get_payload()
- for n, part in enumerate(parts):
- if part.is_multipart():
- rs = rs + print_info(part)
- else:
- rs = rs + print_part(part)
- else:
- return print_part(msg)
- return rs
- class CrazySrvHandler:
- dao = dataInstance
- async def handle_RCPT(self, server, session, envelope, address, rcpt_options):
- envelope.rcpt_tos.append(address)
- return '250 OK'
- async def handle_DATA(self, server, session, envelope):
- mail_from = envelope.mail_from
- rcpt_tos = envelope.rcpt_tos
- message = email.message_from_bytes(envelope.content)
- content = print_info(message)
- subject = decode_str(message['Subject'])
- obj = {
- "from": mail_from,
- "to": rcpt_tos,
- "subject": subject,
- "content": content
- }
- self.dao.store_msg(obj)
- print("success record msg:" + mail_from + "->" + str(rcpt_tos) + "|" + str(subject))
- return '250 Message accepted for delivery'
|