Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I send attachments using SMTP?

Tags:

I want to write a program that sends email using Python's smtplib. I searched through the document and the RFCs, but couldn't find anything related to attachments. Thus, I'm sure there's some higher-level concept I'm missing out on. Can someone clue me in on how attachments work in SMTP?

like image 860
Jason Baker Avatar asked Dec 27 '09 14:12

Jason Baker


People also ask

Can SMTP send attachments?

Direct Mail:How can I send emails with attachments using SMTP? Sending emails with attachments using SMTP requires you to build emails in MIME format.


2 Answers

Here is an example of a message with a PDF attachment, a text "body" and sending via Gmail.

# Import smtplib for the actual sending function import smtplib  # For guessing MIME type import mimetypes  # Import the email modules we'll need import email import email.mime.application  # Create a text/plain message msg = email.mime.Multipart.MIMEMultipart() msg['Subject'] = 'Greetings' msg['From'] = '[email protected]' msg['To'] = '[email protected]'  # The main body is just another attachment body = email.mime.Text.MIMEText("""Hello, how are you? I am fine. This is a rather nice letter, don't you think?""") msg.attach(body)  # PDF attachment filename='simple-table.pdf' fp=open(filename,'rb') att = email.mime.application.MIMEApplication(fp.read(),_subtype="pdf") fp.close() att.add_header('Content-Disposition','attachment',filename=filename) msg.attach(att)  # send via Gmail server # NOTE: my ISP, Centurylink, seems to be automatically rewriting # port 25 packets to be port 587 and it is trashing port 587 packets. # So, I use the default port 25, but I authenticate.  s = smtplib.SMTP('smtp.gmail.com') s.starttls() s.login('[email protected]','xyzpassword') s.sendmail('[email protected]',['[email protected]'], msg.as_string()) s.quit() 
like image 138
Kevin Buchs Avatar answered Nov 17 '22 05:11

Kevin Buchs


Here's an example I snipped out of a work application we did. It creates an HTML email with an Excel attachment.

  import smtplib,email,email.encoders,email.mime.text,email.mime.base    smtpserver = 'localhost'   to = ['[email protected]']   fromAddr = '[email protected]'   subject = "my subject"    # create html email   html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" '   html +='"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">'   html +='<body style="font-size:12px;font-family:Verdana"><p>...</p>'   html += "</body></html>"   emailMsg = email.MIMEMultipart.MIMEMultipart('alternative')   emailMsg['Subject'] = subject   emailMsg['From'] = fromAddr   emailMsg['To'] = ', '.join(to)   emailMsg['Cc'] = ", ".join(cc)   emailMsg.attach(email.mime.text.MIMEText(html,'html'))    # now attach the file   fileMsg = email.mime.base.MIMEBase('application','vnd.ms-excel')   fileMsg.set_payload(file('exelFile.xls').read())   email.encoders.encode_base64(fileMsg)   fileMsg.add_header('Content-Disposition','attachment;filename=anExcelFile.xls')   emailMsg.attach(fileMsg)    # send email   server = smtplib.SMTP(smtpserver)   server.sendmail(fromAddr,to,emailMsg.as_string())   server.quit() 
like image 39
Mark Avatar answered Nov 17 '22 05:11

Mark