1. 程式人生 > >python3 傳送郵件時中文附件名的問題

python3 傳送郵件時中文附件名的問題

暑假沒回家,天天待實驗室。一方面做實驗室的事情,另一方面需要做很多學院實訓的工作。實訓工作中由於之前的郵件系統有問題,無法傳送郵件,又是用PHP寫的,自己就懶得去研究它了,所以就用Python寫了個發郵件的小程式。

import smtplib  
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.header import Header
from email import encoders

class MailSender(object):
    _from = None
    _attachments = []
    
    def __init__(self, smtpSvr, port):
        self.smtp = smtplib.SMTP()
        print("connecting...")
        self.smtp.connect(smtpSvr, port)
        print("connected!!!")    
    
    def login(self, user, pwd):
        self._from = user
        print("login ...")
        self.smtp.login(user, pwd)
        
    def add_attachment(self, filename):
        '''
            新增附件
        '''
        att = MIMEBase('application', 'octet-stream')
        att.set_payload(open(filename, 'rb').read())
        att.add_header('Content-Disposition', 'attachment', filename=('gbk', '', filename) )
        encoders.encode_base64(att)

        self._attachments.append(att)
        
    def send(self, subject, content, to_addr):
        '''
            傳送郵件
        '''
        msg = MIMEMultipart('alternative')
        contents = MIMEText(content, "html", _charset='utf-8')
        msg['Subject'] = subject
        msg['From'] = self._from
        msg['To'] = to_addr
        for att in self._attachments:
            msg.attach(att)
        msg.attach(contents)
        try:
            self.smtp.sendmail(self._from, to_addr, msg.as_string())
            return True
        except Exception as e:
            print(str(e))
            return False
        
    def close(self):
        self.smtp.quit()
        print("logout.")

其實python發郵件的程式碼網上到處都是,但是網上幾乎所有的程式碼在傳送帶有中文名的附件時都會有問題。這裡我一開始也無法實現,在網上查資料到處都查不到現成的。最後結合網上的資料,加上自己多次實驗,終於搞出來了。
att = MIMEBase('application', 'octet-stream')
att.set_payload(open(filename, 'rb').read())
att.add_header('Content-Disposition', 'attachment', filename=('gbk', '', filename) )
encoders.encode_base64(att)
上面程式碼中之所以使用gbk,應該是因為windows下檔名是用gbk編碼的吧。