#!/usr/bin/python3
#encoding:utf-8


import os
import traceback
import datetime

import smtplib
import ssl
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.header import Header
from email import encoders
import pickle


__config__ = {
  'log_dir_path':'log'}

def sendmail(toaddr,fromaddr,sbj,body,bodytype,smtp_server_port,mail_login,mail_pass, files_list=[]):
  name = os.path.join(
    __config__['log_dir_path'],
    'mail_log_' + datetime.datetime.now().strftime('%Y%m%d%H%M%S%f') + '_1')
  index = 1
  error = ''
  traceback_response = ''
  while (os.path.exists(name+ '.txt') or os.path.exists(name+ '.bin')):
    index += 1
    name = '_'.join(name.split('_')[:-1])+ '_'+str(index)
  try:
    savefile = open(name + '.txt', 'w', encoding="utf-8")
    savefile.write(str(toaddr))
    savefile.write('\n\n')
    savefile.write("files: "+str(len(files_list)))
    savefile.write('\n\n')
    savefile.write(str(body))
    savefile.close()
  except:
    error += 'error1 '
    savefile = open(name + '.bin', 'wb')
    pickle.dump([toaddr, body], savefile)
    savefile.close()
  try:
    msg = MIMEMultipart()
    msg['From'] = fromaddr
    msg['To'] = toaddr
    msg['Subject'] = Header(sbj, 'utf-8')
    msg.attach(MIMEText(body, bodytype,  'utf-8'))

    for filename, filedata in files_list:
      part = MIMEBase('application', "octet-stream")
      if type(filedata) == str:
        part.set_payload(bytearray(filedata, "utf8"))
      else:
        part.set_payload(filedata)
      encoders.encode_base64(part)
      part.add_header(
        'Content-Disposition',
        'attachment',
        filename=('utf-8', '', filename))
      msg.attach(part)
    smtp_server, smtp_port = smtp_server_port.split(":")
    if smtp_port == "587":
      mail_lib = smtplib.SMTP(smtp_server, smtp_port)
      context = ssl.create_default_context()
      mail_lib.starttls(context=context)
    else:
      mail_lib = smtplib.SMTP_SSL(smtp_server_port)
    #mail_lib.set_debuglevel(1)
    mail_lib.login(mail_login, mail_pass)
    mail_lib.sendmail(mail_login, toaddr, msg.as_string())
    mail_lib.quit()
  except:
    traceback_response = traceback.format_exc()
    error += 'error2 '
  else:
    traceback_response = 'OK'
  try:
    savefile = open(name + '.txt', 'a', encoding="utf-8")
    savefile.write('\n\n\n')
    for line in traceback_response:
      savefile.write(str(line))
    savefile.write(error)
    savefile.close()
  except:
    error += 'error3 '
    savefile = open(name + 'answer.bin', 'wb')
    pickle.dump([traceback_response, error], savefile)
    savefile.close()
  return traceback_response, error
