Здравствуйте. В задаче имеется REST API сервиса SendPulse, и некая прослойка в виде минимального вебсервиса принимающего JSON и передающего данные через API. Все на питоне.
Собственно сама проблема:
Если JSON запрос находится непосредственно в коде, то все выполняется корректно. Если же я его беру из файла:
with open('mail.json') as js:
data = json.load(js)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-9: ordinal not in range(128)
если же декодирую словарь:
data = {k: unicode(v).encode("utf-8") for k,v in data.iteritems()}
Request response: {u'message': u'Empty «From» email', u'error_code': 10}
при попытке дэкодировать в ASCII или теряю русские символы, или получаю новые ошибки.
Вот сама функция которая из API.
def smtp_send_mail(self, email):
logging.info("Function call: smtp_send_mail")
if not email.get('html') or not email.get('text'):
return self.__handle_error('Seems we have empty body')
elif not email.get('subject'):
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'))
return self.__handle_result(self.__send_request('smtp/emails', 'POST', {'email': json.dumps(email)}))
Пример JSON
{
"subject": "Это тестовое письмо отправленное через REST API sendpulse",
"html": "<h1>Привет!</h1><p>Это тестовое письмо</p>",
"text": "Привет!\nЭто тестовое письмо",
"from": {"name": "Test SMTP Python", "email": "my@mail.xyz"},
"to": [
{"name": "SMTP test", "email": "first@mail.xyz"}
],
"bcc": [
{"name": "SMTP test", "email": "second@mail.xyz"}
]
}
Собственно нуждаюсь в совете или решении данной задачи. Как правильно открыть или конвертировать JSON, чтобы его смогла принять данная функция.