Fix: send ncloud mail (incompleted)

This commit is contained in:
2019-04-19 09:37:15 +09:00
parent cf1bab632c
commit c9a950f6f6
5 changed files with 288 additions and 29 deletions
+12 -17
View File
@@ -36,39 +36,34 @@ class DBManager:
return rows return rows
def insert(self, sql, params): def insert(self, sql, params):
self.executeSql(sql, params) self.execute_sql(sql, params)
def update(self, sql, params): def update(self, sql, params):
self.executeSql(sql, params) self.execute_sql(sql, params)
def delete(self, 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.curs.execute(sql, params)
self.conn.commit() self.conn.commit()
def getWaitingAccountList(self): '''
def get_waiting_account_list(self):
sql = "select * from maestro" sql = "select * from maestro"
self.curs.execute(sql) self.curs.execute(sql)
rows = self.curs.fetchall() rows = self.curs.fetchall()
unregisteredAccountCount = 0
today = datetime.datetime.today() today = datetime.datetime.today()
before1Week = today - datetime.timedelta(days=7) before_7days= today - datetime.timedelta(days=7)
for row in rows: for row in rows:
name = row['Name'] name = row['Name']
registeredDateTime = row['AcceptClausesDateTime'] registered_datetime = row['AcceptClausesDateTime']
availableDateTime = row['AvailableActivateDateTime'] available_datetime = row['AvailableActivateDateTime']
# print(type(registeredDateTime)) # print(type(registeredDateTime))
if type(availableDateTime) is str and before1Week >= registeredDateTime: if type(available_datetime) is str and before_7days >= registered_datetime:
print("{0}, {1}, {2}".format(name, availableDateTime, registeredDateTime)) print("{0}, {1}, {2}".format(name, available_datetime, registered_datetime))
unregisteredAccountCount += 1 '''
# print(unregisteredAccountCount)
# self.conn.close()
+227
View File
@@ -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 = "<br/>"
# 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" : "",
# 특정 메일을 모아서 보기 위해 네이버 메일에서 지원하는 기능, 해당 필드에 동일한 값을 입력한 메일들을 모아서 볼 수 있다. (다음의 형태가 되어야 함 : <unique_id@domain.com> )
"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)
'''
+31 -8
View File
@@ -1,12 +1,35 @@
from unpaid_maestro_checker import UnpaidMaestroChecker 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() checker = UnpaidMaestroChecker()
week1MaestroList = checker.getUnpaid7daysMaestroList() day7MaestroList = checker.get_unpaid_7days_maestro_list()
for maestroData in week1MaestroList: for maestro_data in day7MaestroList:
maestroId = maestroData['MaestroID'] maestro_id = maestro_data['MaestroID']
name = maestroData['Name'] name = maestro_data['Name']
email = maestroData['Email'] email = maestro_data['Email']
registeredDateTime = maestroData['AcceptClausesDateTime'] registered_dateTime = maestro_data['AcceptClausesDateTime']
availableDateTime = maestroData['AvailableActivateDateTime'] available_dateTime = maestro_data['AvailableActivateDateTime']
print("{0}, {1}, {2}, {3}, {4}" \ print("{0}, {1}, {2}, {3}, {4}" \
.format(maestroId, name, email, availableDateTime, registeredDateTime)) .format(maestro_id, name, email, available_dateTime, registered_dateTime))
'''
+6
View File
@@ -0,0 +1,6 @@
import requests
url = 'http://google.com'
res = requests.get(url=url)
print(res.status_code)
print(res.text)
+12 -4
View File
@@ -1,12 +1,15 @@
from db_setting import DBSetting from db_setting import DBSetting
from db_manager import DBConnectParams, DBManager from db_manager import DBConnectParams, DBManager
class UnpaidMaestroChecker: class UnpaidMaestroChecker:
dbParams = None dbParams = None
dbMan = None dbMan = None
unpaid7daysSql = "select * from maestro \ unpaid_7days_sql = "select * from maestro \
where DATE(NOW()) - INTERVAL 7 DAY > AcceptClausesDateTime AND ActivateStatus = 0" 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): def __init__(self):
self.dbParams = DBConnectParams() self.dbParams = DBConnectParams()
@@ -17,7 +20,12 @@ class UnpaidMaestroChecker:
self.dbMan = DBManager() self.dbMan = DBManager()
self.dbMan.connect(self.dbParams) self.dbMan.connect(self.dbParams)
def getUnpaid7daysMaestroList(self): def get_unpaid_7days_maestro_list(self):
day7MaestroList = self.dbMan.select(self.unpaid7daysSql) day7_maestro_list = self.dbMan.select(self.unpaid_7days_sql)
self.dbMan.close() self.dbMan.close()
return day7MaestroList 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