как отправить кадр данных pandas в виде вложения электронной почты в python с помощью exchangelib

Мне нужно отправить по электронной почте кадр данных pandas df в виде вложения с помощью exchangelib. ниже мой код

import io
attachments=[]
x=io.BytesIO(df.to_records(index=False))
content=x.getvalue()
type(content)      #bytes
send_email(account, 'Subject', 'test email', ['testemail.com'],
           attachments=attachments)

когда я использую приведенный выше код, я получаю электронное письмо с вложением, но оно в байтовом формате, поэтому его невозможно прочитать.

Это потому, что тип (контент) - "байты"

Код ниже работает отлично. Это связано с тем, что тип (содержимое) является «классом« байты »> », но мне не разрешено сохранять свой фреймворк данных локально в виде файла .csv. Я хочу отправить кадр данных напрямую в виде вложения электронной почты. Как я могу преобразовать мой df в формат «класс 'байты'>» и отправить вложение в формате csv по электронной почте?

attachments = []
with open('test.csv', 'rb') as f:
    content = f.read()
type(content)      #<class 'bytes'>
attachments.append(('test.csv', content))

ниже send_email я использую

from exchangelib import Configuration, Account, DELEGATE
from exchangelib import Message, Mailbox, FileAttachment



def send_email(account, subject, body, recipients, attachments=None):
    """
    Send an email.

    Parameters
    ----------
    account : Account object
    subject : str
    body : str
    recipients : list of str
        Each str is and email adress
    attachments : list of tuples or None
        (filename, binary contents)

    Examples
    --------

    """
    to_recipients = []
    for recipient in recipients:
        to_recipients.append(Mailbox(email_address=recipient))
    # Create message
    m = Message(account=account,
                folder=account.sent,
                subject=subject,
                body=body,
                to_recipients=to_recipients)

    # attach files
    for attachment_name, attachment_content in attachments or []:
        file = FileAttachment(name=attachment_name, content=attachment_content)
        m.attach(file)
    m.send_and_save()


person TLanni    schedule 04.05.2020    source источник


Ответы (1)


Содержимое файла всегда байты, независимо от того, о каком типе файла вы говорите. Программы могут скрывать от вас этот факт, но это все равно правда.

Когда вы пишете «это в байтовом формате, поэтому его невозможно прочитать», я предполагаю, что вы имеете в виду, что ваш почтовый клиент не помогает вам просматривать файл так, как вы ожидали. Чтобы помочь вашему почтовому клиенту сделать это, попробуйте установить атрибут content_type для FileAttachment на то, что соответствует типу файла вашего вложения. Предлагаемые значения см. в разделе Тип содержимого ответа как CSV.

person Erik Cederstrand    schedule 04.05.2020