【问题标题】:Is there a way to send email with a dataframe attachment?有没有办法发送带有数据框附件的电子邮件?
【发布时间】:2021-03-11 09:47:26
【问题描述】:

我目前有一个使用 pandas 操作 .csv 文件的脚本。我正在尝试发送带有已修改文件的最新 .csv 版本的 MIMEMultipart 电子邮件,但由于某种原因,电子邮件收件人不断收到我尝试发送的未更改的较旧版本的 .csv。我试图在脑海中理解它,因为 .csv 文件的旧版本在发送之前已被覆盖,但 .csv 的原始版本会发送给收件人。

也许我需要为 smtplib 指定一个路径来获取文件,而不是仅仅给出文件的名称。有没有办法做到这一点,或者有没有其他方法可以解决我的问题?我已经尝试将名称更改为其他名称,以便 smtplib 能够区分旧的 .csv 和新的。

这不起作用,因为文件放在目录中,但我的脚本说新文件不存在

这是我当前的代码:

email_user = 'Bot@gmail.com'
email_password = 'Business101'
email_send = ('myemail@gmail.com', 'myfriendsemail@gmail.com')

subject = 'TOP 5 CONTRACTS'

msg = MIMEMultipart()
msg['From'] = email_user
msg['To'] = ",".join(email_send)
msg['Subject'] = subject

body = 'These are the latest contracts for this week!'
msg.attach(MIMEText(body,'plain'))

filename='CC.csv'
attachment  =open(filename,'rb')

part = MIMEBase('application','octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition',"attachment; filename= "+filename)

msg.attach(part)
text = msg.as_string()
server = smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login(email_user,email_password)


server.sendmail(email_user,email_send,text)
server.quit()

print("Emailed Recipients")

值得一提的是,这个过程是自动化的,所以脚本是从我的 mac 上的 Unix 可执行文件运行的。

如果您能提供帮助,我将不胜感激!

【问题讨论】:

    标签: python pandas csv executable smtplib


    【解决方案1】:

    这是最好的方法,谢谢

    from email.mime.text import MIMEText
    from email.mime.application import MIMEApplication
    from email.mime.multipart import MIMEMultipart
    from smtplib import SMTP
    import smtplib
    import sys
    import pandas as pd
    
    df_test = pd.read_csv('/Users/emmanuelafoke/Documents/Selenium/CC.csv')
    
    email_user = 'myemailaddress@gmail.com'
    email_password = 'mypassword'
    
    recipients = ['theiremailaddress@gmail.com'] 
    emaillist = [elem.strip().split(',') for elem in recipients]
    msg = MIMEMultipart()
    msg['Subject'] = 'SUBJECT'
    msg['From'] = 'myemailaddress@gmail.com'
    
    
    html = """\
    <html>
      <head></head>
      <body>
        {0}
      </body>
    </html>
    """.format(df_test.to_html())
    
    part1 = MIMEText(html, 'html')
    msg.attach(part1)
    
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login(email_user,email_password)
    server.sendmail(msg['From'], emaillist , msg.as_string())
    

    感谢您的所有帮助!

    【讨论】:

      【解决方案2】:

      您实际上可以通过使用以下库来做到这一点:email.mime.applicationMIMEApplication, email.mime.multipartemail.mime.text。现在,我不知道您使用的是哪个客户端,您可能需要对此进行一些调整。

      from email.mime.application import MIMEApplication
      from email.mime.multipart import MIMEMultipart
      from email.mime.text import MIMEText
      import smtplib
      
      SEND_FROM = 'myaddress@client.com'   ## Your email address
      TOSEND = {'dataframe.csv': export_csv, 'dataframe.xlsx': export_my_excel}
      
      def send_dataframe(send_to, subject, body, df):
        multipart = MIMEMultipart()
        multipart['From'] = SEND_FROM
        multipart['To'] = send_to
        multipart['Subject'] = subject
        for filename in EXPORTERS:    
          attachment = MIMEApplication(TOSEND[filename](df))  ### Here is where the df is attached
          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()
      

      send_dataframe() 中,您必须输入要附加的df。这就是 TOSEND 的用武之地。如您所见,有一个名为 export_my_excel 的函数。您可以将其创建为

      import io
      import pandas as pd
      
      def export_my_excel(df):
        with io.BytesIO() as buffer:
          writer = pd.ExcelWriter(buffer)
          df.to_excel(writer)
          writer.save()
          return buffer.getvalue()
      

      【讨论】:

      • 好的,我还需要登录服务器吗?
      猜你喜欢
      • 2021-02-28
      • 1970-01-01
      • 2015-09-09
      • 2013-10-19
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多