0

添付ファイルを含むメール メッセージがあります。
添付ファイルをメールから Google ドライブにアップロードする必要があります。
メールにはimaplibを使用し、Google ドライブにはpyDriveを使用しています

以下のコードを使用して添付ファイルを取得しています。

if mail.get_content_maintype() == 'multipart':

        for part in mail.walk():
            if part.get_content_maintype() == 'multipart':
                continue

            if part.get('Content-Disposition') is None:

            attachment = part.get_payload(decode=True)

メールにpayload添付ファイルがあります。payloadpyDrive を使用して Google ドライブにアップロードする方法がわかりません。私はこれを試しましたが、うまくいきませんでした

attachment = part.get_payload(decode=True)
gd_file = self.gd_box.g_drive.CreateFile({'title': 'Hello.jpg',
                                                          "parents": [{"kind": "drive#fileLink", "id": folder['id']}]})
                gd_file.GetContentFile(attachment)
                gd_file.Upload()

更新:

このコードは機能しますが、解決策が悪いと思います(画像をローカルに保存してから、この画像をGoogleドライブにアップロードします)

attachment = part.get_payload(decode=True)
                att_path = os.path.join("", part.get_filename())
                if not os.path.isfile(att_path):
                     fp = open(att_path, 'wb')
                     fp.write(attachment)
                     fp.close()

                gd_file = self.gd_box.g_drive.CreateFile({'title': part.get_filename(),
                                                          "parents": [{"kind": "drive#fileLink", "id": folder['id']}]})
                gd_file.SetContentFile(part.get_filename())
                gd_file.Upload()
4

1 に答える 1

1

GetContentFile()GoogleDriveFileをローカルファイルに保存するために使用されます。逆にしたいので、SetContentString()代わりに使用してみてから、次を呼び出しますUpload()

gd_file.SetContentString(attachment)
gd_file.Upload()

アップデート

SetContentString()画像ファイルに含まれているようなバイナリ データを扱っている場合は機能しません。回避策として、データを一時ファイルに書き込み、ドライブにアップロードしてから、一時ファイルを削除できます。

import os
from tempfile import NamedTemporaryFile

tmp_name = None
with NamedTemporaryFile(delete=False) as tf:
    tf.write(part.get_payload(decode=True))
    tmp_name = tf.name    # save the file name
if tmp_name is not None:
    gd_file.SetContentFile(tf_name)
    gd_file.Upload()
    os.remove(tmp_name)
于 2018-01-21T11:02:27.467 に答える