Как прикрепить файл Google Drive к сообщению и отправить через gmail API (без скачивания файла)? - PullRequest
0 голосов
/ 08 июля 2019

В настоящее время я работаю над проектом, в котором мне нужно отправлять письма пользователям и прикреплять некоторые документы из Документов Google.

У меня есть идентификатор файла документов для отправки. Я не хочу загружать файл, а затем прикреплять его к сообщению. Есть ли способ прикрепить файлы напрямую с диска Google, не загружая их в наше локальное хранилище?

Методы, которые я пробовал -

  1. Сначала я попытался экспортировать файл, а затем сохранить байтоподобный объект в переменной и затем передать его методу create_message (). Но mimeType.guess_type () ожидает объект типа строки, который является либо путем, либо URL-адресом.

  2. Затем я попытался передать URL-адрес диска методу create_message (), но безуспешно.

Вот мой метод create_message -

def create_message_with_attachment(self, sender, to, subject, message_text,files):
    """Create a message for an email.

    Args:
    sender: Email address of the sender.
    to: Email address of the receiver.
    subject: The subject of the email message.
    message_text: The text of the email message.
    file: The path to the file to be attached.

    Returns:
    An object containing a base64url encoded email object.
    """
    message = MIMEMultipart()
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject

    msg = MIMEText(message_text)
    message.attach(msg)

    for fil in files:
        content_type, encoding = mimetypes.guess_type(fil)

        if content_type is None or encoding is not None:
            content_type = 'application/octet-stream'
        main_type, sub_type = content_type.split('/', 1)
        if main_type == 'text':
            fp = open(fil, 'rb')
            msg = MIMEText(fp.read(), _subtype=sub_type)
            fp.close()
        elif main_type == 'image':
            fp = open(fil, 'rb')
            msg = MIMEImage(fp.read(), _subtype=sub_type)
            fp.close()
        elif main_type == 'audio':
            fp = open(fil, 'rb')
            msg = MIMEAudio(fp.read(), _subtype=sub_type)
            fp.close()
        else:
            fp = open(fil, 'rb')
            msg = MIMEBase(main_type, sub_type)
            msg.set_payload(fp.read())
            fp.close()
        filename = os.path.basename(fil)
        msg.add_header('Content-Disposition', 'attachment', filename=filename)
        message.attach(msg)
    b64_bytes = base64.urlsafe_b64encode(message.as_bytes())
    b64_string = b64_bytes.decode()
    body = {'raw': b64_string}
    return body

Параметр files является массивом, потому что я хочу отправить несколько вложений около 3-4.

Пока не было удачи. Кто-нибудь может предложить другие методы для достижения этой цели?

1 Ответ

0 голосов
/ 08 июля 2019

Проблема со Службами Google заключается в том, что вы не можете сохранить тип данных при загрузке или экспорте - их необходимо преобразовать в другой MIMEType.Таким образом, если у вас возникли проблемы с отправкой сообщений электронной почты с вложением, я предлагаю вам сделать следующее решение: включите в свою электронную почту ссылку на файл, а не сам файл.В этом случае вам необходимо выполнить следующие шаги:

Поделиться интересующим вас файлом с соответствующим пользователем.Это то, что вы можете сделать программно, создав и обновив permissions .В вашем случае вам нужно указать emailAddress, fileID, а также включить в тело запроса роль, которую вы хотите назначить получателю электронной почты.В случае, если вы обновляете существующее разрешение, вам также нужно указать ID-разрешения.Включите webViewLink нужного файла в ваше тело письма.Вы можете получить webViewLink путем перечисления файлов и указания webViewLink в качестве поля, которое вы хотите получить в своем ответе

...