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编码的。
 

 

 

 

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值