diff --git a/src/web/python/batch/db_manager.py b/src/web/python/batch/db_manager.py
index c2cc7c3..ee55ae2 100644
--- a/src/web/python/batch/db_manager.py
+++ b/src/web/python/batch/db_manager.py
@@ -36,39 +36,34 @@ class DBManager:
return rows
def insert(self, sql, params):
- self.executeSql(sql, params)
-
+ self.execute_sql(sql, params)
def update(self, sql, params):
- self.executeSql(sql, params)
-
+ self.execute_sql(sql, params)
def delete(self, sql, params):
- self.executeSql(sql, params)
+ self.execute_sql(sql, params)
- def executeSql(self, sql, params):
+ def execute_sql(self, sql, params):
self.curs.execute(sql, params)
self.conn.commit()
- def getWaitingAccountList(self):
+'''
+ def get_waiting_account_list(self):
sql = "select * from maestro"
self.curs.execute(sql)
rows = self.curs.fetchall()
- unregisteredAccountCount = 0
today = datetime.datetime.today()
- before1Week = today - datetime.timedelta(days=7)
+ before_7days= today - datetime.timedelta(days=7)
for row in rows:
name = row['Name']
- registeredDateTime = row['AcceptClausesDateTime']
- availableDateTime = row['AvailableActivateDateTime']
+ registered_datetime = row['AcceptClausesDateTime']
+ available_datetime = row['AvailableActivateDateTime']
# print(type(registeredDateTime))
- if type(availableDateTime) is str and before1Week >= registeredDateTime:
- print("{0}, {1}, {2}".format(name, availableDateTime, registeredDateTime))
- unregisteredAccountCount += 1
-
- # print(unregisteredAccountCount)
- # self.conn.close()
\ No newline at end of file
+ if type(available_datetime) is str and before_7days >= registered_datetime:
+ print("{0}, {1}, {2}".format(name, available_datetime, registered_datetime))
+'''
\ No newline at end of file
diff --git a/src/web/python/batch/mail_sender.py b/src/web/python/batch/mail_sender.py
new file mode 100644
index 0000000..63229f7
--- /dev/null
+++ b/src/web/python/batch/mail_sender.py
@@ -0,0 +1,227 @@
+import time
+from datetime import datetime
+import json
+from typing import Dict, Any, Union
+
+import requests
+import base64
+import hmac
+import hashlib
+
+
+class NCloud:
+ host_name_url = "https://mail.apigw.ntruss.com" # 호스트 URL
+ request_url = "/api/v1/mails" # 요청 URI
+ access_key = "qNXWk443wdnDXrkPvoqr" # 네이버 클라우드 플랫폼 회원에게 발급되는 개인 인증키
+ secret_key = "umWxQXulhNSya2CkMNqqVJnSRfwRaN8BjMUX0skV"
+ # 2차 인증을 위해 서비스마다 할당되는 service secret
+ api_key = "eWfapJfbR5W9NXPEsdXGzlJsShEV30DfxIV0d51J"
+ # API Gateway에서 발급받은 키(primary key 또는 secondary key)
+ method = "POST" # 요청 method mail 발송: POST, 발송 확인 GET
+ request_id = "" # 요청 ID
+
+
+class MailSender:
+ new_line = "\r\n"
+ html_br_tag = "
"
+
+ # mail sender info
+ sender_name = "초코마에"
+ sender_email = "support+chocomae@jinaju.com"
+ sender_address = sender_email
+ sender_bcc = "support+chocomae.automail@jinaju.com"
+
+ # bank account info
+ bank_account_no = "3333-07-4977969"
+ bank_name = "카카오뱅크"
+ bank_owner_name = "박지상"
+
+ def __init__(self):
+ print("")
+
+ @staticmethod
+ def send_email(post_param, timestamp, signature):
+ url = NCloud.host_name_url + NCloud.request_url
+ # echo url."\n"
+
+ headers = {
+ 'X-NCP-APIGW-TIMESTAMP': timestamp,
+ 'X-NCP-IAM-ACCESS-KEY': NCloud.access_key,
+ 'X-NCP-APIGW-SIGNATURE-V2': signature,
+ 'content-type': 'application/json'
+ }
+ # print(url)
+ # print('headers : ' + json.dumps(headers))
+ # print('data : ' + json.dumps(post_param))
+ # exit(0)
+ res = requests.post(url, headers=headers, data=json.dumps(post_param))
+
+ print('sending mail result : {0}'.format(res.status_code))
+ print('result text : \n{0}'.format(res.text))
+ '''
+ if res.status_code == 200:
+ set_data("sendmail_respond", response)
+ set_data("sendmail_post_param", post_param)
+ elif res.status_code == 201:
+ set_data("sendmail_succeed", response)
+ set_data("sendmail_post_param", post_param)
+ else:
+ set_data("sendmail_error", response)
+ set_data("sendmail_error_post_param", post_param)
+ '''
+
+ @staticmethod
+ def make_request_url():
+ if NCloud.method == "POST":
+ return NCloud.host_name_url + NCloud.request_url
+ else:
+ return NCloud.host_name_url + NCloud.request_url + \
+ "/requests/" + NCloud.request_id + "/status"
+
+ @staticmethod
+ def get_post_param(post_param, key):
+ if key in post_param:
+ return post_param[key]
+ elif key == "parameters" or key == "recipients":
+ return array_map()
+ elif key == "individual":
+ return false
+ # elif key == "body" or key == "sender_address" \
+ # or key == "sender_name" or key == "templateSid" \
+ # or key == "title":
+ # return ""
+
+ return ''
+
+ def make_post_param(self, post_param):
+ post_param = {
+ "advertising" : False, # 광고메일여부 default: False
+ "attachFileIds" : [], # 첨부파일ID
+ "body" : self.get_post_param(post_param, "body"), # Email 본문
+ "individual" : self.get_post_param(post_param, "individual"),
+ # 개인발송여부 (개인발송 시 참조인, 숨은참조 무시됨) default: true
+ "parameters" : self.get_post_param(post_param, "parameters"),
+ # 치환 파라미터 (전체 수신자에게 적용), ‘치환 ID’ 를 key로, ‘치환 ID에 맵핑되는 값’ 을 value로 가지는 Map 형태의 Object
+ "recipients" : self.get_post_param(post_param, "recipients"),
+ "referencesHeader" : "",
+ # 특정 메일을 모아서 보기 위해 네이버 메일에서 지원하는 기능, 해당 필드에 동일한 값을 입력한 메일들을 모아서 볼 수 있다. (다음의 형태가 되어야 함 : )
+ "reservationUtc" : "",
+ # 예약 발송 일시 ( 1970년 1월 1일 00:00:00 협정 세계시(UTC) 부터의 경과 시간을 1/1000초로 환산한 정수 ), reservationDateTime 값보다 이 값이 우선 적용된다.
+ "reservationDateTime" : "",
+ # 다음과 같은 형태의 예약 발송 일시 (‘yyyy-MM-dd HH:mm’ UTC+09:00), reservationUtc 값이 우선한다.
+ "sender_address" : self.get_post_param(post_param, "sender_address"), # 발송자 Email 주소
+ "sender_name" : self.get_post_param(post_param, "sender_name"), # 발송자 이름
+ "temprequest_id" : "", # 첨부파일 등록 시 사용한 임시 요청 ID
+ "templateSid" : self.get_post_param(post_param, "templateSid"), # 템플릿 ID
+ "title" : self.get_post_param(post_param, "title"), # Mail 제목
+ }
+ return json.dumps(post_param)
+
+ @staticmethod
+ def make_default_post_param(maestro_name, maestro_email):
+ post_param = {}
+ post_param['sender_address'] = MailSender.sender_email
+ post_param['sender_name'] = MailSender.sender_name
+ post_param['individual'] = False
+ post_param['title'] = None
+ post_param['body'] = None
+ post_param['recipients'] = [
+ {
+ 'address': maestro_email,
+ 'name': '',
+ 'type': 'R',
+ 'parameters': [
+ {'maestro_name': maestro_name}
+ ]
+ },
+ {
+ 'address': MailSender.sender_bcc,
+ 'name': '',
+ 'type': 'R',
+ 'parameters': None
+ }
+ ]
+ return post_param
+
+ @staticmethod
+ def get_timestamp():
+ # list(micro_time,timestamp) = explode(' ',microtime())
+ time_array = MailSender.micro_time().split(' ');
+ microtime = time_array[0];
+ timestamp = time_array[1];
+ return timestamp + microtime[2:5]
+
+ @staticmethod
+ def micro_time(get_as_float = False):
+ d = datetime.now()
+ t = time.mktime(d.timetuple())
+ if get_as_float:
+ return t
+ else:
+ ms = d.microsecond / 1000000.
+ return '%f %d' % (ms, t)
+
+ @staticmethod
+ def hash_hmac(algo, data, key):
+ res = hmac.new(key.encode(), data.encode(), algo).hexdigest()
+ return res
+
+ @staticmethod
+ def b64encode(source):
+ source = source.encode('utf=8')
+ return base64.b64encode(source)
+
+ @staticmethod
+ def make_signature(url, timestamp):
+ space = " "
+ new_line = "\n"
+ hmac_data = NCloud.method + space + url + new_line + timestamp + new_line + NCloud.access_key
+ hash_hmac_data = MailSender.hash_hmac(hashlib.sha256, hmac_data, NCloud.secret_key)
+ # signature = MailSender.b64encode(hash_hmac_data)
+ signature = hash_hmac_data
+ return signature
+
+'''
+ @staticmethod
+ def curl(post_param, timestamp, signature):
+ if NCloud.method == "POST":
+ is_post = True
+ else:
+ is_post = False
+
+ try:
+ url = NCloud.host_name_url + NCloud.request_url
+ # echo url."\n"
+ ch = curl_init()
+
+ curl_setopt(ch, CURLOPT_URL, url)
+ curl_setopt(ch, CURLOPT_POST, is_post)
+ curl_setopt(ch, CURLOPT_RETURNTRANSFER, true)
+ curl_setopt(ch, CURLOPT_SSL_VERIFYPEER, 0)
+ if NCloud.method == "POST":
+ curl_setopt(ch, CURLOPT_POSTFIELDS, post_param)
+
+ headers = []
+ headers[0] = "X-NCP-APIGW-TIMESTAMP: " + timestamp
+ headers[1] = "X-NCP-IAM-ACCESS-KEY: " + NCloud.access_key
+ headers[2] = "X-NCP-APIGW-SIGNATURE-V2: " + signature
+ headers[3] = "content-type: application/json"
+ curl_setopt(ch, CURLOPT_HTTPHEADER, headers)
+ response = curl_exec(ch)
+
+ status_code = curl_getinfo(ch, CURLINFO_HTTP_CODE)
+ # echo "status_code:".status_code."\n"
+ curl_close (ch)
+ if status_code == 200:
+ set_data("sendmail_respond", response)
+ set_data("sendmail_post_param", post_param)
+ elif status_code == 201:
+ set_data("sendmail_succeed", response)
+ set_data("sendmail_post_param", post_param)
+ else :
+ set_data("sendmail_error", response)
+ set_data("sendmail_error_post_param", post_param)
+ except E:
+ set_data("sendmail_error", E.lastResponse)
+ set_data("sendmail_error_post_param", post_param)
+'''
\ No newline at end of file
diff --git a/src/web/python/batch/test_python.py b/src/web/python/batch/test_python.py
index 0e19325..b7f37b9 100644
--- a/src/web/python/batch/test_python.py
+++ b/src/web/python/batch/test_python.py
@@ -1,12 +1,35 @@
from unpaid_maestro_checker import UnpaidMaestroChecker
+from mail_sender import NCloud
+from mail_sender import MailSender
+
+def send_mail_waiting_7days_maestro(name, email, register_date):
+ post_param = mail_sender.make_default_post_param(name, email)
+ post_param['templateSid'] = 337
+ post_param['parameters'] = {
+ 'maestro_name': name,
+ 'maestro_date': register_date
+ }
+ timestamp = MailSender.get_timestamp()
+ # print('hmac : ' + MailSender.hash_hmac('ripemd160', 'The quick brown fox jumped over the lazy dog.', 'secret'))
+ signature = MailSender.make_signature(NCloud.request_url, timestamp)
+ # print('signature : ' + signature.decode('utf-8'))
+ MailSender.send_email(post_param, timestamp, signature)
+
+
+mail_sender = MailSender()
+send_mail_waiting_7days_maestro('test1', 'jisangs@daum.net', '2019-04-08')
+
+
+'''
checker = UnpaidMaestroChecker()
-week1MaestroList = checker.getUnpaid7daysMaestroList()
-for maestroData in week1MaestroList:
- maestroId = maestroData['MaestroID']
- name = maestroData['Name']
- email = maestroData['Email']
- registeredDateTime = maestroData['AcceptClausesDateTime']
- availableDateTime = maestroData['AvailableActivateDateTime']
+day7MaestroList = checker.get_unpaid_7days_maestro_list()
+for maestro_data in day7MaestroList:
+ maestro_id = maestro_data['MaestroID']
+ name = maestro_data['Name']
+ email = maestro_data['Email']
+ registered_dateTime = maestro_data['AcceptClausesDateTime']
+ available_dateTime = maestro_data['AvailableActivateDateTime']
print("{0}, {1}, {2}, {3}, {4}" \
- .format(maestroId, name, email, availableDateTime, registeredDateTime))
+ .format(maestro_id, name, email, available_dateTime, registered_dateTime))
+'''
\ No newline at end of file
diff --git a/src/web/python/batch/test_requests.py b/src/web/python/batch/test_requests.py
new file mode 100644
index 0000000..322e4bd
--- /dev/null
+++ b/src/web/python/batch/test_requests.py
@@ -0,0 +1,6 @@
+import requests
+
+url = 'http://google.com'
+res = requests.get(url=url)
+print(res.status_code)
+print(res.text)
\ No newline at end of file
diff --git a/src/web/python/batch/unpaid_maestro_checker.py b/src/web/python/batch/unpaid_maestro_checker.py
index 0bf913b..59fb0ab 100644
--- a/src/web/python/batch/unpaid_maestro_checker.py
+++ b/src/web/python/batch/unpaid_maestro_checker.py
@@ -1,12 +1,15 @@
from db_setting import DBSetting
from db_manager import DBConnectParams, DBManager
+
class UnpaidMaestroChecker:
dbParams = None
dbMan = None
- unpaid7daysSql = "select * from maestro \
+ unpaid_7days_sql = "select * from maestro \
where DATE(NOW()) - INTERVAL 7 DAY > AcceptClausesDateTime AND ActivateStatus = 0"
+ unpaid_8days_sql = "select * from maestro \
+ where DATE(NOW()) - INTERVAL 8 DAY > AcceptClausesDateTime AND ActivateStatus = 0"
def __init__(self):
self.dbParams = DBConnectParams()
@@ -17,7 +20,12 @@ class UnpaidMaestroChecker:
self.dbMan = DBManager()
self.dbMan.connect(self.dbParams)
- def getUnpaid7daysMaestroList(self):
- day7MaestroList = self.dbMan.select(self.unpaid7daysSql)
+ def get_unpaid_7days_maestro_list(self):
+ day7_maestro_list = self.dbMan.select(self.unpaid_7days_sql)
self.dbMan.close()
- return day7MaestroList
\ No newline at end of file
+ return day7_maestro_list
+
+ def get_unpaid_8days_maestro_list(self):
+ day8_maestro_list = self.dbMan.select(self.unpaid_8days_sql)
+ self.dbMan.close()
+ return day8_maestro_list
\ No newline at end of file