Search code examples
pythonpython-3.xpandassmtplib

Excel email comes in a different format unable to open Python pandas


The goal is to send an email with excel attachment. I found an example online but not written for Excel format. It sends attachment but not like typical excel spreadsheet, so I am unable to open it.

Is it something I can modify in a code in order to receive .xlsx file?

enter image description here

# libraries to be imported 
import smtplib 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
from email.mime.base import MIMEBase 
from email import encoders 

fromaddr = "From@gmail.com"
toaddr = "To@gmail.com"

# instance of MIMEMultipart 
msg = MIMEMultipart() 

# storing the senders email address   
msg['From'] = fromaddr 

# storing the receivers email address  
msg['To'] = toaddr 

# storing the subject  
msg['Subject'] = "Sending Attachement"

# string to store the body of the mail 
body = "Hello, This is Oleg and my attached file"

# attach the body with the msg instance 
msg.attach(MIMEText(body, 'plain')) 

# open the file to be sent  
filename = "FileName"
attachment = open("C:\\Mylocation\\FileName.xlsx", "rb") 

# instance of MIMEBase and named as p 
p = MIMEBase('application', 'octet-stream') 

# To change the payload into encoded form 
p.set_payload((attachment).read()) 

# encode into base64 
encoders.encode_base64(p) 

p.add_header('Content-Disposition', "attachment; filename= %s" % filename) 

# attach the instance 'p' to instance 'msg' 
msg.attach(p) 

# creates SMTP session 
s = smtplib.SMTP('smtp.gmail.com', 587) 

# start TLS for security 
s.starttls() 

# Authentication 
s.login(fromaddr, "password") 

# Converts the Multipart msg into a string 
text = msg.as_string() 

# sending the mail 
s.sendmail(fromaddr, toaddr, text) 

# terminating the session 
s.quit() 

Solution

  • There is just a small error in your code! change your filename variable to "FileName.xlsx" instead of just "FileName"

    I noticed that your file didn't have an extension, and since your filename variable didn't have an extension - that is how I quickly came to this conclusion. The documentation for add_header() seems to use the file extensions as well.