mailer.py
3.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import os
import sys
import json
import socket
from time import sleep
from logging import getLogger
from argparse import ArgumentParser
from configparser import ConfigParser
import smtplib
from base64 import b64decode
from opensipkd.string import exception_message
from .tools import (
make_pid_file,
clean_log,
create_doc,
file2dict,
)
from .logger import setup_logging
registry = dict()
socket.setdefaulttimeout(30)
def dict2doc(d):
cf = registry['conf']
files = []
for fname, content in d.get('files', []):
data = base64.b64decode(content)
files.append([fname, data])
return create_doc(
cf['username'], d['penerima'], d.get('subject'), d['pesan'],
cf['name'], d.get('name'), files)
def save_result(d, filename):
log = getLogger('save_result')
result_dir = registry['conf']['result_dir']
fullpath = os.path.join(result_dir, filename)
with open(fullpath, 'w') as f:
f.write(json.dumps(d))
log.info(f'Save {fullpath}: {d}')
def save_status(status=0, jawaban='OK'):
conf = registry['conf']
d = dict(id=conf['username'], status=status, jawaban=jawaban)
save_result(d, 'status.json')
def send(server):
conf = registry['conf']
job_dir = conf['job_dir']
job_files = os.listdir(job_dir)
if not job_files:
return
log = getLogger('send')
job_files.sort()
job_file = os.path.join(job_dir, job_files[0])
result_file = os.path.split(job_file)[-1]
d = file2dict(job_file)
os.remove(job_file)
result = 'id' in d and dict(id=d['id']) or dict()
try:
doc = dict2doc(d)
log.info(f'Send {clean_log(d)}')
server.sendmail(
conf['username'], d['penerima'], doc.as_string())
result['status'] = 0
result['jawaban'] = 'OK'
except Exception as e:
result['status'] = -3
result['jawaban'] = exception_message()
log.error(f'Result {result}')
save_result(result, result_file)
def get_option(argv):
pars = ArgumentParser()
pars.add_argument('conf')
return pars.parse_args(argv)
def main(argv=sys.argv[1:]):
option = get_option(argv)
conf = ConfigParser()
conf.read(option.conf)
registry['conf'] = cf = dict(conf.items('main'))
if not make_pid_file(cf['pid_file']):
return
setup_logging(option.conf)
log = getLogger('main')
cf['tls'] = cf['tls'] == 'true'
cf['port'] = int(cf['port'])
log.debug(f'Connect to {cf["host"]}:{cf["port"]}')
try:
with smtplib.SMTP(cf['host'], cf['port']) as server:
if cf['tls']:
server.starttls()
log.debug(f'Login sebagai {cf["username"]}')
server.login(cf['username'], cf['password'])
save_status()
while True:
send(server)
sleep(1)
except ConnectionRefusedError as err:
msg = str(err)
except OSError as err:
msg = str(err)
except smtplib.SMTPAuthenticationError as err:
msg = str(err)
except KeyboardInterrupt:
msg = 'Keyboard Interrupt'
except Exception:
msg = exception_message()
log.error(msg)
save_status(-2, msg)
os.remove(cf['pid_file'])