#python #excel #smtp #mime #mimemultipart
#python #excel #smtp #mime #mimemultipart
Вопрос:
Я считываю свои данные из mongo dB и создаю отчет. Раньше я сохранял отчет в виде файла .xlsx на своем локальном компьютере и вручную отправлял его по электронной почте. Я хотел бы автоматизировать этот процесс.
Я нашел способ в Python 3 сохранить файл в памяти с помощью ввода-вывода Python.Функциональность BytesIO (). Я попробовал несколько вещей, которые я нашел в stack overflow, но у меня это не сработало. Я хотел бы получить несколько предложений о том, как я могу автоматизировать свою работу.
Ниже приведено то, что я пробовал,
df = pd.dataframe(df) # has my reports dataframe
def export_excel(df):
with io.BytesIO() as buffer:
writer = pd.ExcelWriter(buffer)
df.to_excel(writer)
writer.save()
return buffer.getvalue()
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
SEND_FROM = 'myemail@company.com'
EXPORTERS = {'dataframe.csv': export_csv, 'dataframe.xlsx': export_excel}
def send_dataframe(send_to, subject, body, df):
multipart = MIMEMultipart()
multipart['From'] = SEND_FROM
multipart['To'] = 'myemail@company.com'
multipart['Subject'] = subject
for filename in EXPORTERS:
attachment = MIMEApplication(EXPORTERS[filename](df))
attachment['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
multipart.attach(attachment)
multipart.attach(MIMEText(body, 'html'))
s = smtplib.SMTP('localhost')
s.sendmail(SEND_FROM, send_to, multipart.as_string())
s.quit()
Я не получаю сообщение об ошибке, но и не получаю электронное письмо с вложением Excel.
Комментарии:
1. Привет, вы нашли решение этой проблемы, даже я сталкиваюсь с подобной проблемой.
Ответ №1:
Мне нужно решить ту же тему, поэтому вот мой код:
import io
import pandas as pd
from pandas import util
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
df = util.testing.makeDataFrame()
# df.head()
output = io.BytesIO()
writer = pd.ExcelWriter(output, engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
writer.save()
output.seek(0)
send_from = 'my_gmail@gmail.com'
gmail_pwd = 'my_gmail_password'
send_to = 'my_gmail@gmail.com'
subject = 'Daily report'
body = "<p>Please find attached report,<br/>by me</p>"
report_name = "report.xlsx"
msg = MIMEMultipart()
msg['Subject'] = subject # add in the subject
msg['From'] = send_from
msg['To'] = send_to
msg.attach(MIMEText(body, 'html')) # add text contents
file = MIMEApplication(output.read(), name=report_name)
file['Content-Disposition'] = f'attachment; filename="{report_name}"'
msg.attach(file)
smtp = smtplib.SMTP('smtp.gmail.com:587')
smtp.ehlo()
smtp.starttls()
smtp.login(send_from, gmail_pwd)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.quit()
Ответ №2:
Вот фрагмент моего кода, в котором я брал фрейм данных, а затем преобразовывал его в StringIO(), чтобы отправить его в формате электронной таблицы. Единственное отличие в том, что я отправляю файл csv вместо xlsx. Надеюсь, это поможет.
textStream = StringIO()
dataframe.to_csv(textStream,index=False)
message = MIMEMultipart()
message['Subject'] = "Given Subject"
message.attach(MIMEApplication(textStream.getvalue(), Name="Name of the
file"))
context = ssl.create_default_context()
with smtplib.SMTP(SMTP_host, SMTP_port) as server:
server.starttls(context=context)
server.login("mail user", "mail password")
server.sendmail("mail user", "receiver email", message.as_string().encode('utf-8'))
server.close()