【问题标题】:Send CSV files as single email attachment将 CSV 文件作为单个电子邮件附件发送
【发布时间】:2015-12-21 22:17:47
【问题描述】:

有一个脚本 test.py,它将生成 2 到 3 个 csv 文件进行 sql 查询。 将生成 CSV 文件并将其保存在与 test.py 相同的路径中。 生成 csv 文件是正确的,但电子邮件附件不起作用 下面是我的代码 sn-p :

import smtplib
import csv
from email.mime.multipart import MIMEMultipart
from email.message import Message
from email.mime.text import MIMEText

with open('record1.csv', 'wb') as f:
    fieldnames = ['Name','No audits']
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    for data in query:
        writer.writerow({'Name' : data[0], 'No audits': data[1]})

## below code as problem 
#Mail format
COMMASPACE = ', '
SERVER = "localhost"

msg = MIMEMultipart()
msg['Subject'] = 'Audit records'
emailfrom = "xyz" // Giving proper outlook mail id 
emailto = ['abc'] // // Giving proper outlook mail id lists

msg['From'] = emailfrom
msg['To'] = COMMASPACE.join(emailto)
msg.preamble = 'List of  audit records '
csvfiles = ['record1.csv', 'record2.csv']

for csv in csvfiles:
        print csv
        with open(csv) as fp:
                record = MIMEText(fp.read())
        msg.attach(record)

print "INFO: "
server = smtplib.SMTP(SERVER)
server.sendmail(emailfrom, emailto, msg.as_string())
server.quit()

脚本运行没有错误,但没有发送电子邮件

【问题讨论】:

  • 注释掉附件部分是否会发送邮件?
  • 不,如果我注释掉 csv 文件部分并尝试发送,即使它没有发送
  • 那么您应该继续将您的测试程序缩减为仍然显示问题的最小程序。这可以防止我们在诸如您标题中提到的“附件”之类的红鲱鱼上浪费时间。
  • 您的代码示例中的query 是什么???
  • 这是一个 mongodb 查询,类似于 db.audit_records.find() 中的数据:这工作正常,我能够生成带有记录的 csv 文件。但无法将这些 csv 文件作为电子邮件附件发送

标签: python email csv email-attachments


【解决方案1】:

您错过了登录部分。并且您应该在 smtplib.SMTP() 中提供正确的服务器和端口。

将最后 3 行更改为以下内容。以下代码用于gmail,根据outlook更新代码。

server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login(emailfrom, 'password')
server.sendmail(emailfrom, emailto, msg.as_string())
server.quit()

编辑:

导入以下内容:

from email import encoders
from email.mime.base import MIMEBase
import os

并将循环替换为以下代码。

for csv in csvfiles:
        print csv
        with open(csv) as fp:
            record = MIMEBase('application', 'octet-stream')
            record.set_payload(fp.read())
            encoders.encode_base64(record)
            record.add_header('Content-Disposition', 'attachment',
                              filename=os.path.basename(csv))
        msg.attach(record)

【讨论】:

  • 无需登录即可向您的 Office Outlook 邮件服务器发送邮件。
  • 我可以使用下面的链接effbot.org/pyfaq/how-do-i-send-mail-from-a-python-script.htm发送邮件但不能发送附件:(
  • @kittudeopa 那么如何在不登录的情况下发送邮件?没有收到您的最后一条评论。
  • 我正在使用我的办公室 SMTP 服务器,并且往返于办公室的 mail_id's 。所以不需要登录。它有效。
  • 您可以使用 effbot.org/pyfaq/how-do-i-send-mail-from-a-python-script.htm 发送邮件 .. 无需将端口和服务器指定为 'localhost ' ?
猜你喜欢
  • 2018-05-31
  • 2013-03-19
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 2016-03-11
  • 2011-08-14
  • 1970-01-01
相关资源
最近更新 更多