From 2df8cfc51bd310dcfcb42bc7b4b7f036783ae1db Mon Sep 17 00:00:00 2001 From: Vladimir Savrov Date: Wed, 14 Aug 2019 21:05:04 +0300 Subject: [PATCH] Fix base64 encode and decode in Python 3 and create smtp_send_mail_with_template (send mail with template) --- .../examples/sendpulse-rest-api-example.py | 19 + pysendpulse/pysendpulse.py | 360 +----------------- 2 files changed, 36 insertions(+), 343 deletions(-) diff --git a/pysendpulse/examples/sendpulse-rest-api-example.py b/pysendpulse/examples/sendpulse-rest-api-example.py index ffc9b29..95716b1 100644 --- a/pysendpulse/examples/sendpulse-rest-api-example.py +++ b/pysendpulse/examples/sendpulse-rest-api-example.py @@ -114,6 +114,25 @@ } SPApiProxy.smtp_send_mail(email) + # Send mail with template using SMTP + email = { + 'subject': 'This is the test task from REST API', + 'from': {'name': 'John Doe', 'email': 'john.doe@domain.com'}, + 'to': [ + {'name': 'Jane Roe', 'email': 'jane.roe@domain.com'} + ], + "template": { + 'id': '73606', # ID of the template uploaded in the service. Use this + # (https://sendpulse.com/integrations/api/bulk-email#template-list) + # method to get the template ID (use either real_id or id parameter from the reply) + 'variables': { + 'foo': 'value', + 'bar': 'value' + } + }, + } + SPApiProxy.smtp_send_mail_with_template(email) + # **************** SMS *************** # Add phones to address book diff --git a/pysendpulse/pysendpulse.py b/pysendpulse/pysendpulse.py index 0b90f8c..4ef1c66 100644 --- a/pysendpulse/pysendpulse.py +++ b/pysendpulse/pysendpulse.py @@ -322,22 +322,6 @@ def delete_emails_from_addressbook(self, id, emails): return self.__handle_error("Emails list can't be converted by JSON library") return self.__handle_result(self.__send_request('addressbooks/{}/emails'.format(id), 'DELETE', {'emails': emails})) - def get_emails_stat_by_campaigns(self, emails): - """ Get campaigns statistic for list of emails - - @param emails: list of emails ['test_1@test_1.com', ..., 'test_n@test_n.com'] - @return: dictionary with response message - """ - logging.info("Function call: get_emails_stat_by_campaigns") - if not emails: - self.__handle_error("Empty emails") - try: - emails = json.dumps(emails) - except: - logging.debug("Emails: {}".format(emails)) - return self.__handle_error("Emails list can't be converted by JSON library") - return self.__handle_result(self.__send_request('emails/campaigns', 'POST', {'emails': emails})) - # ------------------------------------------------------------------ # # EMAIL CAMPAIGNS # # ------------------------------------------------------------------ # @@ -652,9 +636,24 @@ def smtp_send_mail(self, email): return self.__handle_error('Seems we have empty subject') elif not email.get('from') or not email.get('to'): return self.__handle_error("Seems we have empty some credentials 'from': '{}' or 'to': '{}' fields".format(email.get('from'), email.get('to'))) - email['html'] = base64.b64encode(email.get('html')) + email['html'] = base64.b64encode(email.get('html').encode('utf-8')).decode('utf-8') return self.__handle_result(self.__send_request('smtp/emails', 'POST', {'email': json.dumps(email)})) + def smtp_send_mail_with_template(self, email): + """ SMTP: send email template + + @param email: string valid email address. We will send an email message to the specified email address with a verification link. + @return: dictionary with response message + """ + logging.info("Function call: smtp_send_mail_template") + if not email.get('template'): + return self.__handle_error('Seems we have empty template') + elif not email.get('template').get('id'): + return self.__handle_error('Seems we have empty template id') + + email['html'] = email['text'] = ' ' + return self.smtp_send_mail(email) + # ------------------------------------------------------------------ # # PUSH # # ------------------------------------------------------------------ # @@ -746,329 +745,4 @@ def push_create(self, title, website_id, body, ttl, additional_params={}): data_to_send.update(additional_params) logging.info("Function call: push_create") - return self.__handle_result(self.__send_request('/push/tasks', 'POST', data_to_send)) - - # ------------------------------------------------------------------ # - # SMS # - # ------------------------------------------------------------------ # - - def sms_add_phones(self, addressbook_id, phones): - """ SMS: add phones from the address book - - @return: dictionary with response message - """ - if not addressbook_id or not phones: - return self.__handle_error("Empty addressbook id or phones") - try: - phones = json.dumps(phones) - except: - logging.debug("Phones: {}".format(phones)) - return self.__handle_error("Phones list can't be converted by JSON library") - - data_to_send = { - 'addressBookId': addressbook_id, - 'phones': phones - } - - logging.info("Function call: sms_add_phones") - return self.__handle_result(self.__send_request('sms/numbers', 'POST', data_to_send)) - - def sms_add_phones_with_variables(self, addressbook_id, phones): - """ SMS: add phones with variables from the address book - - @return: dictionary with response message - """ - if not addressbook_id or not phones: - return self.__handle_error("Empty addressbook id or phones") - try: - phones = json.dumps(phones) - except: - logging.debug("Phones: {}".format(phones)) - return self.__handle_error("Phones list can't be converted by JSON library") - - data_to_send = { - 'addressBookId': addressbook_id, - 'phones': phones - } - - logging.info("Function call: sms_add_phones_with_variables") - return self.__handle_result(self.__send_request('sms/numbers/variables', 'POST', data_to_send)) - - def sms_delete_phones(self, addressbook_id, phones): - """ SMS: remove phones from the address book - - @return: dictionary with response message - """ - if not addressbook_id or not phones: - return self.__handle_error("Empty addressbook id or phones") - try: - phones = json.dumps(phones) - except: - logging.debug("Phones: {}".format(phones)) - return self.__handle_error("Phones list can't be converted by JSON library") - - data_to_send = { - 'addressBookId': addressbook_id, - 'phones': phones - } - - logging.info("Function call: sms_delete_phones") - return self.__handle_result(self.__send_request('sms/numbers', 'DELETE', data_to_send)) - - def sms_get_phone_info(self, addressbook_id, phone): - """ SMS: Get information about phone from the address book - - @return: dictionary with response message - """ - if not addressbook_id or not phone: - return self.__handle_error("Empty addressbook id or phone") - - logging.info("Function call: sms_get_phone_info") - return self.__handle_result(self.__send_request('sms/numbers/info/' + str(addressbook_id) + '/' + str(phone), 'GET')) - - def sms_update_phones_variables(self, addressbook_id, phones, variables): - """ SMS: update phones variables from the address book - - @return: dictionary with response message - """ - if not addressbook_id or not phones or variables: - return self.__handle_error("Empty addressbook id or phones or variables") - try: - phones = json.dumps(phones) - except: - logging.debug("Phones: {}".format(phones)) - return self.__handle_error("Phones list can't be converted by JSON library") - - try: - variables = json.dumps(variables) - except: - logging.debug("Variables: {}".format(variables)) - return self.__handle_error("Variables list can't be converted by JSON library") - - data_to_send = { - 'addressBookId': addressbook_id, - 'phones': phones, - 'variables': variables - } - - logging.info("Function call: sms_update_phones_variables") - return self.__handle_result(self.__send_request('sms/numbers', 'PUT', data_to_send)) - - def sms_get_blacklist(self): - """ SMS: get phones from the blacklist - - @return: dictionary with response message - """ - logging.info("Function call: sms_get_blacklist") - return self.__handle_result(self.__send_request('sms/black_list', 'GET', {})) - - def sms_get_phones_info_from_blacklist(self, phones): - """ SMS: get info by phones from the blacklist - - @param phones: array phones - @return: dictionary with response message - """ - if not phones: - return self.__handle_error("Empty phones") - try: - phones = json.dumps(phones) - except: - logging.debug("Phones: {}".format(phones)) - return self.__handle_error("Phones list can't be converted by JSON library") - - data_to_send = { - 'phones': phones - } - - logging.info("Function call: sms_add_phones_to_blacklist") - return self.__handle_result(self.__send_request('sms/black_list/by_numbers', 'GET', data_to_send)) - - def sms_add_phones_to_blacklist(self, phones, comment): - """ SMS: add phones to blacklist - - @param phones: array phones - @param comment: string describing why phones added to blacklist - @return: dictionary with response message - """ - if not phones: - return self.__handle_error("Empty phones") - try: - phones = json.dumps(phones) - except: - logging.debug("Phones: {}".format(phones)) - return self.__handle_error("Phones list can't be converted by JSON library") - - data_to_send = { - 'phones': phones, - 'description': comment - } - - logging.info("Function call: sms_add_phones_to_blacklist") - return self.__handle_result(self.__send_request('sms/black_list', 'POST', data_to_send)) - - def sms_delete_phones_from_blacklist(self, phones): - """ SMS: remove phones from blacklist - - @param phones: array phones - @return: dictionary with response message - """ - if not phones: - return self.__handle_error("Empty phones") - try: - phones = json.dumps(phones) - except: - logging.debug("Phones: {}".format(phones)) - return self.__handle_error("Phones list can't be converted by JSON library") - - data_to_send = { - 'phones': phones - } - - logging.info("Function call: sms_add_phones_to_blacklist") - return self.__handle_result(self.__send_request('sms/black_list', 'DELETE', data_to_send)) - - def sms_add_campaign(self, sender_name, addressbook_id, body, date = None, transliterate = False): - """ Create new sms campaign - - @param sender_name: string senders name - @param addressbook_id: unsigned int addressbook ID - @param body: string campaign body - @param date: string date for filter in 'Y-m-d H:i:s' - @param transliterate: boolean need to transliterate sms body or not - @return: dictionary with response message - """ - - logging.info("Function call: sms_create_campaign") - if not sender_name: - return self.__handle_error('Seems you not pass sender name') - if not addressbook_id: - return self.__handle_error('Seems you not pass addressbook ID') - if not body: - return self.__handle_error('Seems you not pass sms text') - - data_to_send = { - 'sender': sender_name, - 'addressBookId': addressbook_id, - 'body': body, - 'date': date, - 'transliterate': transliterate, - } - - return self.__handle_result(self.__send_request('sms/campaigns', 'POST', data_to_send)) - - def sms_send(self, sender_name, phones, body, date = None, transliterate = False): - """ Send sms by some phones - - @param sender_name: string senders name - @param phones: array phones - @param body: string campaign body - @param date: string date for filter in 'Y-m-d H:i:s' - @param transliterate: boolean need to transliterate sms body or not - @return: dictionary with response message - """ - - logging.info("Function call: sms_send") - if not sender_name: - return self.__handle_error('Seems you not pass sender name') - if not phones: - return self.__handle_error("Empty phones") - if not body: - return self.__handle_error('Seems you not pass sms text') - - try: - phones = json.dumps(phones) - except: - logging.debug("Phones: {}".format(phones)) - return self.__handle_error("Phones list can't be converted by JSON library") - - data_to_send = { - 'sender': sender_name, - 'phones': phones, - 'body': body, - 'date': date, - 'transliterate': transliterate, - } - - return self.__handle_result(self.__send_request('sms/send', 'POST', data_to_send)) - - def sms_get_list_campaigns(self, date_from, date_to): - """ SMS: get list of campaigns - - @param date_from: string date for filter in 'Y-m-d H:i:s' - @param date_to: string date for filter in 'Y-m-d H:i:s' - @return: dictionary with response message - """ - logging.info("Function call: sms_get_list_campaigns") - - data_to_send = { - 'dateFrom': date_from, - 'dateTo': date_to - } - return self.__handle_result(self.__send_request('sms/campaigns/list', 'GET', data_to_send)) - - def sms_get_campaign_info(self, id): - """ Get information about sms campaign - - @param id: unsigned int campaign ID - @return: dictionary with response message - """ - if not id: - return self.__handle_error("Empty campaign id") - - logging.info("Function call: sms_get_campaign_info from: {}".format(id, )) - return self.__handle_result(self.__send_request('/sms/campaigns/info/{}'.format(id, ))) - - def sms_cancel_campaign(self, id): - """ Cancel sms campaign - - @param id: unsigned int campaign ID - @return: dictionary with response message - """ - if not id: - return self.__handle_error("Empty campaign id") - - logging.info("Function call: sms_cancel_campaign : '{}'".format(id, )) - return self.__handle_result(self.__send_request('sms/campaigns/cancel/{}'.format(id, ), 'PUT')) - - def sms_get_campaign_cost(self, sender, body, addressbook_id = None, phones = None): - """ Get cost sms campaign - - @param id: unsigned int campaign ID - @return: dictionary with response message - """ - if not sender: - return self.__handle_error("Empty sender") - if not body: - return self.__handle_error("Empty sms body") - if not addressbook_id and not phones: - return self.__handle_error("Empty addressbook id or phones") - - data_to_send = { - 'sender': sender, - 'body': body, - 'addressBookId': addressbook_id - } - if phones: - try: - data_to_send.update({'phones': json.dumps(phones)}) - except: - logging.debug("Phones: {}".format(phones)) - return self.__handle_error("Phones list can't be converted by JSON library") - - logging.info("Function call: sms_get_campaign_cost") - return self.__handle_result(self.__send_request('sms/campaigns/cost', 'GET', data_to_send)) - - def sms_delete_campaign(self, id): - """ SMS: remove sms campaign - - @return: dictionary with response message - """ - if not id: - return self.__handle_error("Empty sms campaign id") - - data_to_send = { - 'id': id - } - - logging.info("Function call: sms_delete_campaign") - return self.__handle_result(self.__send_request('sms/campaigns', 'DELETE', data_to_send)) \ No newline at end of file + return self.__handle_result(self.__send_request('/push/tasks', 'POST', data_to_send)) \ No newline at end of file