7.6. 附件的使用

E-mail 发送的内容有诸多限制。除了文字与图片,还有其他的内容需要发送给收件人,一般采用附件的办法。

7.6.1. smtplib发送附件

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

>>> import smtplib
>>> from email.mime.text import MIMEText
>>> from email.mime.multipart import MIMEMultipart
>>> from email.header import Header
>>> from cfg import email_cfg
>>> sender = email_cfg['user']
>>> password=email_cfg['passwd']
>>> receivers = [email_cfg['user']]

创建一个带附件的实例。

>>> message = MIMEMultipart()
>>> message['From'] = Header("附件的使用教程", 'utf-8')
>>> message['To'] =  Header("测试", 'utf-8')
>>> subject = 'Python SMTP 邮件测试'
>>> message['Subject'] = Header(subject, 'utf-8')

写入邮件正文内容。

>>> message.attach(MIMEText('这是附件的使用邮件发送测试……', 'plain', 'utf-8'))

构造附件1,传送test.txt 文件。

>>> att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
>>> att1["Content-Type"] = 'application/octet-stream'

这里的filename可以任意写,写什么名字,邮件中显示什么名字。

>>> att1["Content-Disposition"] = 'attachment; filename="test.txt"'
>>> message.attach(att1)

构造附件2,传送当前目录下的 test2.txt 文件

>>> att2 = MIMEText(open('test2.txt', 'rb').read(), 'base64', 'utf-8')
>>> att2["Content-Type"] = 'application/octet-stream'
>>> att2["Content-Disposition"] = 'attachment; filename="test2.txt"'
>>> message.attach(att2)
>>> try:
>>>     smtpObj = smtplib.SMTP_SSL('smtp.163.com',port=465)
>>>     smtpObj.login(sender,password)
>>>     smtpObj.sendmail(sender, receivers, message.as_string())
>>>     print ("邮件发送成功")
>>>     smtpObj.quit()
>>> except smtplib.SMTPException:
>>>     print ("Error: 无法发送邮件")
邮件发送成功

7.6.2. yagmail发送附件

yagmail如何发送附件呢?只要添加一个附件列表就可以了。

导入yagmail库以及参数。连接smtp服务器邮箱。

>>> import yagmail
>>> from cfg import email_cfg
>>> sender = email_cfg['user']
>>> passwd=email_cfg['passwd']
>>> yag = yagmail.SMTP( user=sender, password= passwd, host='smtp.163.com')

附件可在写入内容时一同添加,test2.txt为此邮件的附件。

>>> contents = ['This is test', 'You can find an audio file attached.', 'test2.txt']
>>> yag.send([email_cfg['user'],'alanyers@163.com'], 'subject', contents)