参考文章
可以直接用的代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import base64
import os
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
class SendMail(object):
def __init__(self, username="", passwd="", recv=[], title="", content="", content_type="plain", images={},
files=[], ssl=False, email_host='smtp.qq.com', port=25, ssl_port=465):
'''
:param username: 用户名
:param passwd: 密码
:param recv: 收件人,多个要传list ['a@qq.com','b@qq.com]
:param title: 邮件标题
:param content: 邮件正文
:param content_type: 邮件正文类型: plain 普通文本,html HTML格式
:param images: 图片集合 key,value 格式,如 {"image1":"imagePath1","image2":"imagePath2"}
:param files: 附件路径,如果不在当前目录下,要写绝对路径,默认没有附件
:param ssl: 是否安全链接,默认为普通
:param email_host: smtp服务器地址,默认为163服务器
:param port: 非安全链接端口,默认为25
:param ssl_port: 安全链接端口,默认为465
'''
self.recv = recv # 收件人,多个要传list ['a@qq.com','b@qq.com]
self.title = title # 邮件标题
self.content = content # 邮件正文
self.content_type = content_type # 邮件正文类型
self.images = images
self.files = files # 附件路径,如果不在当前目录下,要写绝对路径
self.username = username # 用户名
self.passwd = passwd # 密码
self.email_host = email_host # smtp服务器地址
self.port = port # 是否安全链接
self.ssl = ssl # 是否安全链接
self.ssl_port = ssl_port # 安全链接端口
def send_mail(self):
msg = MIMEMultipart()
# 发送内容的对象
if len(self.files) > 0:
for file_att in self.files:
file_name = os.path.split(file_att)[-1] # 只取文件名,不取路径
try:
f = open(file_att, 'rb').read()
except Exception as e:
raise Exception('附件打不开!!!!')
else:
att = MIMEText(f, "base64", "utf-8")
att["Content-Type"] = 'application/octet-stream'
# base64.b64encode(file_name.encode()).decode()
new_file_name = '=?utf-8?b?' + base64.b64encode(file_name.encode()).decode() + '?='
# 这里是处理文件名为中文名的,必须这么写
att["Content-Disposition"] = 'attachment; filename="%s"' % (new_file_name)
msg.attach(att)
# 发送的图片
for image_key in self.images.keys():
image_path = self.images[image_key]
try:
fp = open(image_path, 'rb')
except Exception as e:
raise Exception('图片打不开!!!!')
else:
msg_image = MIMEImage(fp.read())
fp.close()
# 定义图片 ID,在 HTML 文本中引用
msg_image.add_header('Content-ID', '<' + image_key + '>')
msg.attach(msg_image)
msg.attach(MIMEText(self.content, self.content_type)) # 邮件正文的内容
msg['Subject'] = self.title # 邮件主题
msg['From'] = self.username # 发送者账号
msg['To'] = ','.join(self.recv) # 接收者账号列表
if self.ssl and self.ssl_port > 0:
self.smtp = smtplib.SMTP_SSL(self.email_host, port=self.ssl_port)
elif self.port > 0:
self.smtp = smtplib.SMTP(self.email_host, port=self.port)
else:
self.smtp = smtplib.SMTP(self.email_host)
# 发送邮件服务器的对象
self.smtp.login(self.username, self.passwd)
try:
self.smtp.sendmail(self.username, self.recv, msg.as_string())
pass
except Exception as e:
print('出错了。。', e)
else:
print('发送成功!')
self.smtp.quit()
if __name__ == '__main__':
m = SendMail(
username="xxxxx@qq.com",
passwd="xxxxx",
recv=['yyyyyyy@qq.com'],
title='python发生邮箱测试',
content='''
<p>Python 邮件发送测试...</p>
<p><a href="http://www.runoob.com">菜鸟教程链接</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
''',
content_type="html",
images={"image1": "D:/Documents/Pictures/图片/11.png"},
files=['D:\\qzn\\MyData\\temp\\temp.xlsx']
)
m.send_mail()
需要注意图片用法
<img src="cid:image1">
其中 cid 是固定字符串,image1 为 images对象的key。如上 images={“image1”: “D:/Documents/Pictures/图片/11.png”},