【问题标题】:How do I send an email with a .csv attachment using Python [duplicate]如何使用 Python 发送带有 .csv 附件的电子邮件 [重复]
【发布时间】:2014-06-03 23:13:42
【问题描述】:

好的,我知道有几个问题可以解决这个问题,但我找不到让它正常工作的方法。我假设它和下面的代码一样简单,但这并没有附加我的文件。任何帮助将不胜感激。我对 Python 也很陌生。是否有我应该导入的邮件模块以使该功能正常工作?

import smtplib
fromaddr = "example@example.com
toaddrs = "reciever@example.com

msg = "help I cannot send an attachment to save my life"
attach = ("csvonDesktp.csv")

username = user
password = password

server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg, attach)
server.quit()

【问题讨论】:

标签: python email


【解决方案1】:

有一个complete example in the Python documentation。我可以在这里复制和粘贴相关部分,但整个页面不是很长,所以你最好去那里看看。

【讨论】:

    【解决方案2】:

    使用适当的 MIME 类型发送多部分电子邮件。

    https://docs.python.org/2/library/email-examples.html

    所以可能是这样的(我测试过):

    import smtplib
    import mimetypes
    from email.mime.multipart import MIMEMultipart
    from email import encoders
    from email.message import Message
    from email.mime.audio import MIMEAudio
    from email.mime.base import MIMEBase
    from email.mime.image import MIMEImage
    from email.mime.text import MIMEText
    
    emailfrom = "sender@example.com"
    emailto = "destination@example.com"
    fileToSend = "hi.csv"
    username = "user"
    password = "password"
    
    msg = MIMEMultipart()
    msg["From"] = emailfrom
    msg["To"] = emailto
    msg["Subject"] = "help I cannot send an attachment to save my life"
    msg.preamble = "help I cannot send an attachment to save my life"
    
    ctype, encoding = mimetypes.guess_type(fileToSend)
    if ctype is None or encoding is not None:
        ctype = "application/octet-stream"
    
    maintype, subtype = ctype.split("/", 1)
    
    if maintype == "text":
        fp = open(fileToSend)
        # Note: we should handle calculating the charset
        attachment = MIMEText(fp.read(), _subtype=subtype)
        fp.close()
    elif maintype == "image":
        fp = open(fileToSend, "rb")
        attachment = MIMEImage(fp.read(), _subtype=subtype)
        fp.close()
    elif maintype == "audio":
        fp = open(fileToSend, "rb")
        attachment = MIMEAudio(fp.read(), _subtype=subtype)
        fp.close()
    else:
        fp = open(fileToSend, "rb")
        attachment = MIMEBase(maintype, subtype)
        attachment.set_payload(fp.read())
        fp.close()
        encoders.encode_base64(attachment)
    attachment.add_header("Content-Disposition", "attachment", filename=fileToSend)
    msg.attach(attachment)
    
    server = smtplib.SMTP("smtp.gmail.com:587")
    server.starttls()
    server.login(username,password)
    server.sendmail(emailfrom, emailto, msg.as_string())
    server.quit()
    

    【讨论】:

    • 杰米,这太棒了!感谢您的帮助!
    • 优秀的样品。我喜欢你如何使它通用并使用库来获取 mimetypes 而不是硬编码。
    • 嘿,正文没有通过
    • 如果能得到适当的评论会更好,虽然它很容易解释,但对于像我这样的初学者来说,什么功能用于什么目的或原因并不明显。无论如何,一个全面的解决方案.
    • python 3.8 server.send_message(msg) docs.python.org/3/library/smtplib.html
    猜你喜欢
    • 2019-11-21
    • 2020-09-16
    • 2012-11-28
    • 2014-11-09
    • 2017-02-04
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    相关资源
    最近更新 更多