How do I send an email with a .csv attachment using Python
Question: Okay, I know there is a few questions out there addressing this, but I cannot
find a way to make it work properly. I would assume it is as simple as the
below code, but this does not attach my file. Any help would be greatly
appreciated. I am also very new to Python. Is there a mail module that I
should be importing to make the function work?

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


Answer: Send a multipart email with the appropriate MIME types.

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

So possible something like this (I tested this):

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

