python3 傳送郵件時中文附件名的問題
阿新 • • 發佈:2019-01-04
暑假沒回家,天天待實驗室。一方面做實驗室的事情,另一方面需要做很多學院實訓的工作。實訓工作中由於之前的郵件系統有問題,無法傳送郵件,又是用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發郵件的程式碼網上到處都是,但是網上幾乎所有的程式碼在傳送帶有中文名的附件時都會有問題。這裡我一開始也無法實現,在網上查資料到處都查不到現成的。最後結合網上的資料,加上自己多次實驗,終於搞出來了。
上面程式碼中之所以使用gbk,應該是因為windows下檔名是用gbk編碼的吧。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)