用python发送带附件的邮件
专栏:ExASIC June 28, 2025, 2:26 p.m. 51 阅读
本文介绍用python发送email时如何添加附件

要带附件,就需要先创建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)

 

感谢阅读,更多文章点击这里:【专栏:ExASIC】
最新20篇 开设专栏