Send email to exchange with attachment in russian file name

I'm using python 2.7.3. and I have following code for send emails with attached file.

# coding: cp1251
import os
import smtplib

from email import Encoders
from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.Utils import formatdate

def sendEmail(to_address, mail_settings, attachment_file_path, subject = 'my_subject'):

HOST = mail_settings['host']
port = mail_settings['port']
username = mail_settings['login']
password = mail_settings['pass']

msg = MIMEMultipart()
msg["From"] = mail_settings['from_address']
msg["To"] = ','.join(to_address)
msg["Subject"] = subject.decode('cp1251')
msg['Date'] = formatdate(localtime=True)
msg['Content-Type'] = "text/html; charset=cp1251"

# attach a file
part = MIMEBase('application', "octet-stream")
part.set_payload( open(attachment_file_path,"rb").read() )
part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(attachment_file_path))

server = smtplib.SMTP(host=HOST, port=port)           

    failed = server.sendmail(mail_settings['from_address'], to_address, msg.as_string())        
except Exception, e:
    errorMsg = "Unable to send email. Error: %s" % str(e)

My problem is that exchange users who receive emails through this code can't see attachment file name if it has russian letters (for example пример.txt), otherwise if it has english letters everything works fine for them. I faced with this problem only with customers who use exchange (gmail works fine). What i'm doing wrong? where should I change encoding?


  • I found the solution finally. I just set encoding for header.

    mail_coding = 'utf-8'
    att_header = Header(os.path.basename(attachment_file_path), mail_coding);
    part.add_header('Content-Disposition', 'attachment; filename="%s"' % att_header)