Как отправить Pandas DataFrame в виде вложения в Pandas - PullRequest
1 голос
/ 19 сентября 2019

Я много искал вокруг SO и Google, но не получил свой ответ, поэтому в конечном итоге решил спросить здесь.

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

Искал, можем ли мы напрямую отправить df.to_html каквложение в электронное письмо?

Ниже приведен код:

Это прекрасно работает при отправке электронного письма с html-рамкой через Outlook.

import pandas as pd
import numpy as np
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


df = pd.read_csv('graph.csv', names=['Volume_Path', 'Last Acced', 'Year', 'Month', 'Days', '1-24 hrs', '1 hour', '15 mins', 'future'])
df['Volume_Path'] = df['Volume_Path'].str.replace('\t', '')
df = df.replace(np.nan, '')

# Create message container - the correct MIME type is multipart/alternative.
##############################################################################
msg =  "<u><b> Checklist</b></u><br />"
msg = msg + "<br />"
msg += df.to_html(escape=False)
def mail(msg,recipients,key):
        try:
            s = smtplib.SMTP('mailserver.xyz.com')
            msg1 = MIMEText(msg, 'html')
            sender = 'tina@xyz.com'
            msg1['From'] = sender
            msg1['To'] = ", ".join(recipients)
            msg1['Cc'] =  'mauj@xyz.com'
            msg1['Subject'] = "Mauj Test"
            s.sendmail(sender, recipients, msg1.as_string())
            print(f"Mail Sent to {sender}")
        except Exception as error:
            print(f"Mail Failed - {error}")
recipients = ['joe@xyz.com']
key=""
mail(msg,recipients,key)

1 Ответ

1 голос
/ 20 сентября 2019

Если вы не хотите сохранять pandas.DataFrame в виде html-файла на вашем диске, а просто прикрепить его напрямую, я бы использовал MIMEBase и прикрепил бы его к вашему сообщению

Здесь html_object isdf.to_html() объект.

import smtplib
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase

def mail(body,recipients,key, html_object):
    s = smtplib.SMTP('server.com')
    msg = MIMEMultipart()
    msg.attach(MIMEText(body))
    part = MIMEBase('text', "html")
    part.set_payload(html_object)
    part.add_header('Content-Disposition', 'attachment; filename="tbl.html"')
    msg.attach(part)
    sender = 'me@place.com'
    msg['From'] = sender
    msg['To'] = ", ".join(recipients)
    msg['Subject'] = "Html Test"
    s.sendmail(sender, recipients, msg.as_string())
    print(f"Mail Sent to {sender}")

например

mail('See attached for html file.',["me@place.com"],key="", html_object=df.to_html())

...