Как прикрепить фрейм данных в формате Excel в электронной почте и отправить это вложение из python?

#python #python-3.x #pandas #email #smtp

#питон #python-3.x #панды #Адрес электронной почты #smtp — протокол

Вопрос:

У меня есть файл, который создается и хранится внутри корзины S3 в AWS. Я хочу, чтобы этот файл S3 был отправлен в формате Excel в качестве вложения в отправке электронной почты с использованием python, как это можно сделать.

Я успешно смог отправить электронное письмо без вложения.

Мой код

 import os
import boto3
import pandas as pd
from sagemaker import get_execution_role
role = get_execution_role()
bucket='cotydata'

data_key = 'modeloutput' '.csv'
data_location = 's3://{}/{}'.format(bucket, data_key)
output_key='UI_' input_date
output_bucket='model-output-ui'
# Insert weather api key here 
api_key= 'key'
#read modeloutput and prepare dataframe
modeloutput = pd.read_csv(data_location)
df = modeloutput.to_excel("Outpout.xls")

# import necessary packages
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib

# create message object instance
msg = MIMEMultipart()
password = "password"
msg['From'] = "riskradar@gmail.com"
msg['To'] = "abc@gmail.com"
msg['Subject'] = "Messgae"
filename = df
f = file(filename)
attachment = MIMEText(f.read(),'xls')
msg.attach(attachment)
# attach image to message body


server = smtplib.SMTP('smtp.gmail.com:587')

server.starttls()

# Login Credentials for sending the mail
server.login(msg['From'], password)

server.sendmail(msg['From'], msg['To'], msg.as_string())
 

Любая помощь приветствуется

Ответ №1:

Нет необходимости генерировать фрейм данных pandas из файла xls.

 msg = MIMEMultipart('mixed')    

fp = open(data_location, 'rb')
record = MIMEBase('application', 'octet-stream')
record.set_payload(fp.read())
encode_base64(record)
record.add_header('Content-Disposition', 'attachment',
                          filename="what_ever_header_you_want.xls")
msg.attach(record)
 

А остальное так, как вы это написали.. Это должно сработать.

Если вы хотите отправить фрейм данных в виде файла Excel, вы можете использовать метод to_excel() и передать абсолютный путь к файлу в приведенный выше блок кода.

Комментарии:

1. Он все еще не работает. В принципе, я хочу прочитать excel из S3, а затем выполнить некоторые манипуляции с данными и прикрепить xls.

2. попробуйте просто передать server.sendmail(msg[‘From’], msg[‘To’], msg) вместо msg.as_string(). Убедитесь, что вы сохранили файл xls и передали его в нужное место.

3. Теперь получаю эту ошибку: ошибка типа: ожидаемый байтоподобный объект, а не нетипичный