Fix: send ncloud mail (incompleted)
This commit is contained in:
@@ -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()
|
|
||||||
@@ -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)
|
||||||
|
'''
|
||||||
@@ -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))
|
||||||
|
'''
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
import requests
|
||||||
|
|
||||||
|
url = 'http://google.com'
|
||||||
|
res = requests.get(url=url)
|
||||||
|
print(res.status_code)
|
||||||
|
print(res.text)
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user