首页 > 解决方案 > 有没有办法发送带有数据框附件的电子邮件?

问题描述

我目前有一个使用熊猫操作 .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 可执行文件运行的。

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

标签: pythonpandascsvexecutablesmtplib

解决方案


这是最好的方法,谢谢

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())

感谢您所有的帮助!


推荐阅读