要带附件,就需要先创建MIMEMultipart()类型的message。
然后用二进制读取要发送的文件,创建MIMEApplication类型的附件,并attach到message,如下:
tarfile = 'xxx.tar.gz'
attachfile = MIMEApplication(open(tarfile, 'rb').read())
print('Attach: ' + os.path.basename(tarfile))
attachfile.add_header(
'Content-Disposition',
'attachment',
filename=os.path.basename(tarfile)
)
msg.attach(attachfile)
用for循环可以添加多个附件。
for tarfile in tarfiles:
attachfile = MIMEApplication(open(tarfile, 'rb').read())
# ...
msg.attach(attachfile)
下面是完整python代码示例:
import sys
import os
import re
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.header import Header
# config basic account
mailhost = 'smtp.your_server.com'
mailport = 465
mailuser = 'me@exasic.cn'
mailpass = 'your_password'
mailfrom = 'me@exasic.com'
def sendmail(mailto, subject, body, tarfiles=[], cc=[]):
msg = MIMEMultipart()
msg['From'] = mailfrom
print('From: ' + msg['From'])
msg['To'] = ','.join(mailto)
print('To: ' + msg['To'])
if len(cc) != 0:
msg['Cc'] = ','.join(cc)
print('Cc: ' + msg['Cc'])
msg['Subject'] = subject
print('Subject: ' + msg['Subject'])
msg.attach(MIMEText(body, 'plain'))
print('Body: ...')
for tarfile in tarfiles:
# read attach file
attachfile = MIMEApplication(open(tarfile, 'rb').read())
print('Attach: ' + os.path.basename(tarfile))
attachfile.add_header(
'Content-Disposition',
'attachment',
filename=os.path.basename(tarfile)
)
# overwrite default attach content type, default is 'application/octet-stream'
m = re.search(r'(\..*)$', tarfile)
if m:
fileext = m.group(1)
if fileext in ['.tar.gz', '.tgz', '.gz']:
attachfile.add_header('Content-Type', 'application/gzip')
elif fileext in ['.tar']:
attachfile.add_header('Content-Type', 'application/x-tar')
elif fileext in ['.zip']:
attachfile.add_header('Content-Type', 'application/zip')
elif fileext in ['.pdf']:
attachfile.add_header('Content-Type', 'application/pdf')
# attach file
msg.attach(attachfile)
try:
# login
mailserver = smtplib.SMTP_SSL(host=mailhost, port=mailport)
mailserver.ehlo()
mailserver.login(mailuser, mailpass)
# sendmail
mailserver.sendmail(mailfrom, mailto, msg.as_string())
mailserver.quit()
print('Done!')
except Exception as e:
print(e)
if __name__ == '__main__':
mailto = []
mailto.append('to@exasic.com')
cc = []
cc.append('cc@exasic.com')
subject = 'This is a test mail'
tarfiles = []
tarfiles.append('xxx.tar.gz')
tarfiles.append('yyy.pdf')
textbody = f'''
Dear friend,
How are you?
regards,
Me
'''
sendmail(mailto, subject, textbody, tarfiles, cc)
分享数字集成电路设计中的经验和方法。分享让工作更轻松。
