From c9a950f6f6b2ca9ad9f5c55b01d2aa284023895d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=A2=E1=84=91=E1=85=B3=E1=86=AF=20=E1=84=82?= =?UTF-8?q?=E1=85=A9=E1=84=90=E1=85=B3=E1=84=87=E1=85=AE=E1=86=A8?= Date: Fri, 19 Apr 2019 09:37:15 +0900 Subject: [PATCH] Fix: send ncloud mail (incompleted) --- src/web/python/batch/db_manager.py | 29 +-- src/web/python/batch/mail_sender.py | 227 ++++++++++++++++++ src/web/python/batch/test_python.py | 39 ++- src/web/python/batch/test_requests.py | 6 + .../python/batch/unpaid_maestro_checker.py | 16 +- 5 files changed, 288 insertions(+), 29 deletions(-) create mode 100644 src/web/python/batch/mail_sender.py create mode 100644 src/web/python/batch/test_requests.py 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