как отправить pandas фрейм данных в виде вложения электронной почты в python с помощью exchangelib - PullRequest
0 голосов
/ 04 мая 2020

Мне нужно отправить 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)

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

Это потому, что тип (содержимое) is "bytes"

Ниже код работает отлично. Это потому, что type (content) - это "class 'bytes'>", но мне не разрешено локально сохранять мой фрейм данных в виде файла .csv. Я хочу отправить датафрейм напрямую в виде вложения электронной почты. Как я могу преобразовать мой df в формат "class 'bytes'>" и отправить вложение в 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()

1 Ответ

0 голосов
/ 04 мая 2020

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

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

...