tools.py 2.43 KB
import os
from email.utils import formatdate
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
import mimetypes


##########
# Daemon #
##########
def is_live(pid):
    try:
        os.kill(pid, 0)
    except OSError:
        return
    return True


def read_pid_file(filename):
    try:
        with open(filename) as f:
            s = f.read()
        s = s.split()
        s = s[0]
        return int(s)
    except IOError:
        return
    except ValueError:
        return
    except IndexError:
        return


def write_pid_file(filename):
    pid = os.getpid()
    with open(filename, 'w') as f:
        f.write(str(pid))
    return pid


def make_pid_file(filename):
    pid = read_pid_file(filename)
    if pid and is_live(pid):
        print(f'PID saya {pid} masih aktif.')
        return
    return write_pid_file(filename)


########
# Mail #
########
def nice_name(email, name):
    if name:
        return f'{name} <{email}>'
    return email


def file_type(filename):
    ctype, encoding = mimetypes.guess_type(filename)
    if ctype is None or encoding is not None:
        ctype = 'application/octet-stream'
    maintype, subtype = ctype.split('/', 1)
    return maintype, subtype


def create_doc(
        from_email, to_email, subject, body, from_name=None, to_name=None,
        files=[]):
    msg = doc = MIMEText(body)
    if files:
        doc = MIMEMultipart()
        doc.attach(msg)
    if subject:
        doc['Subject'] = subject
    doc['Date'] = formatdate(localtime=True)
    if from_email:
        doc['From'] = nice_name(from_email, from_name)
    doc['To'] = nice_name(to_email, to_name)
    for fname, data in files:
        maintype, subtype = file_type(fname)
        payload = MIMEBase(maintype, subtype)
        payload.set_payload(data)
        encoders.encode_base64(payload)
        payload.add_header(
            'Content-Disposition', 'attachment', filename=fname)
        doc.attach(payload)
    return doc


# Agar log tidak memuat isi attachment
def clean_log(p):
    r = {}
    keys = ['id', 'pengirim', 'from_name', 'penerima', 'pesan', 'jawaban',
            'tgl_operator', 'subject', 'name', 'To', 'From', 'Subject', 'Body']
    for key in keys:
        if key in p:
            r[key] = p[key]
    if 'files' not in p:
        return r
    files = []
    for fname, content in p['files']:
        files.append(fname)
    r['files'] = files
    return r