Я использую APi ниже для отправки почты с вложением

https://www.googleapis.com/upload/gmail/v1/users/me/messages/send?uploadType=multipart

Который работает нормально, когда имя получателя на английском языке, но если имя получателя содержит многобайтовое (например, японское), я получаю 400 (неверный запрос) в качестве ответа.

Фрагмент кода

def create_raw():

    message['to'] = ','.join([recipients_dict['name']+ 
    <"+recipients_dict['email_address']+">" for recipients_dict in 
    recipients['to']])
    message['from'] = email_address
    message['subject'] = subject
    msg = MIMEText(body)
    message.attach(msg)

Когда recipients_dict['name'] - "английский", API работает должным образом, но для многобайтовых символов.

получение HTTP 400 (неверный запрос) Ошибка

.

0
Test tsip 30 Окт 2019 в 11:55

1 ответ

У вас хороший подход к Gmail API. Единственный необходимый шаг - закодировать строку в UTF-8 перед отправкой в ​​байтах. через base64 (из-за определения MIME). Вы можете сделать это с помощью кода, подобного следующему:

import base64
…
recipients_dict['name'] = base64.b64encode(u'ジョージ'.encode("utf-8"))

Если у вас все еще есть вопросы, не стесняйтесь обращаться за дополнительной помощью.

1
Community 7 Окт 2021 в 14:21
Спасибо за ответ, но после изменения, как указано выше, некоторые закодированные / нежелательные символы видны при проверке вкладки "отправлено" в gmail (браузере), например "5ZCN5YmN44OG44K544OI"
 – 
Test tsip
12 Ноя 2019 в 07:08
Фрагмент кода после модификации: import base64 ... message ['to'] = ','. Join ([(base64.b64encode (recipients_dict ['name']. Encode ('utf-8'))). Decode (' utf-8 ') + "<" + recipients_dict [' address '] + ">" для recipients_dict в recipients [' to ']])
 – 
Test tsip
12 Ноя 2019 в 07:10