Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I send an email with a .csv attachment using Python [duplicate]

Tags:

python

email

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 = "[email protected]
toaddrs = "[email protected]

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()
like image 305
Jordan Starrk Avatar asked Apr 19 '14 14:04

Jordan Starrk


People also ask

How do I send an email recipient from a CSV file?

In the CSV files manager, when you select a CSV template, the button “Send by Email” appears in the header. This function allows you to send a CSV file by email instead of uploading it through our system. Just remember that you can only send a file to an already-existing template.


2 Answers

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 = "[email protected]"
emailto = "[email protected]"
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()
like image 163
Jamie Ivanov Avatar answered Oct 19 '22 16:10

Jamie Ivanov


There is a complete example in the Python documentation. I can copy and paste the relevant parts here but the whole page is not very long so it's better if you go and have a look at it there.

like image 22
s16h Avatar answered Oct 19 '22 18:10

s16h