Как положить файл из вложения письма в s3 бакет?

Рейтинг: 0Ответов: 1Опубликовано: 19.07.2023

Прошу помощи в вопросе перекладки вложения, полученного с почты в s3 бакет

Использую такой код:

from exchangelib import DELEGATE, Account, Credentials, Configuration, UTC_NOW
from datetime import datetime, timedelta
import os, boto3

session = boto3.session.Session()
s3_connect = session.client(
    service_name='',
    endpoint_url=''
)


creds = Credentials(
    username='',
    password=''
)

config = Configuration(
    server='',
    credentials=creds
)

account = Account(
    primary_smtp_address = '',
    config = config,
    autodiscover = False,
    access_type = DELEGATE
)

period_default = UTC_NOW() - timedelta(days=1)
print(period_default)

mail_subfolder = account.inbox / ''

filter_messages = account.inbox.filter(
    datetime_received__gt=period_default,
    sender='',
    subject__contains='',
    has_attachments=True,
).only('sender', 'subject', 'attachments')

for item in filter_messages.order_by('-datetime_received')[:10]:
    for attachment in item.attachments:
        if attachment.name.endswith('.xlsx'):
            fpath = os.path.join("/Users/user/Downloads/my_local_folder", attachment.name)
            key_subdir = f'buc_subdir/buc_sub_subdir/{attachment.name}'
            s3_connect.put_object(Bucket='mys3_bucket', Key=key_subdir, Body=attachment.name, StorageClass='COLD')
            with open(fpath, 'wb') as path:
                path.write(attachment.content)
        else:
            pass
    # account.bulk_move(item, mail_subfolder)
    item.move(mail_subfolder)

Не понимаю что подставить в Body т.к. в таком варианте в бакет записывается файл с контентом "имя файла".

Спасибо!

Ответы

▲ 1

решено, нужен был просто другой метод и параметр записи:

with open(fpath, 'rb') as f:
                s3_connect.upload_fileobj(f, "bucket", key_subdir)