强推:Python 菜谱,里面对 python发送带图片的邮件讲的比较清楚。
刚好我有一个需求,就发送一个网页形式的邮件,而且网页中有图片。
下面是我自己的发送带图片的邮件的代码:
def send_email(subject, to_address_list, cc_address_list):
import smtplib
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
sendObj = smtplib.SMTP('mail.gometech.com.cn', 25)
sendObj.set_debuglevel(1) # 打印debug日志
print(sendObj) # ok 了
# 2. 跟服务器建立连接
sendObj.ehlo()
# 3. 实现加密的必须的步骤
# sendObj.starttls()
username = r'[email protected]'
password = _get_password()
# ##########################--------------- start
# 读取html文件内容
f = open('e:/py/notification.html', 'r', encoding='utf-8')
mail_body = f.read()
f.close()
# 00. 类型需要是 multipart 的
msg = MIMEMultipart('related')
msg['To'] = ",".join(to_address_list)
msg['Cc'] = ",".join(cc_address_list)
msg['Subject'] = Header(subject, 'utf-8').encode()
# 01. 添加文本
msgText = MIMEText(mail_body.replace('{username}', newly_gerrit()), _subtype='html', _charset='utf-8')
msg.attach(msgText)
# 02. 添加图片
file = open("e:/py/dns.jpg", "rb")
img_data = file.read()
file.close()
img = MIMEImage(img_data)
img.add_header('Content-ID', 'dns_config')
msg.attach(img)
login_result = sendObj.login(username, password)
# 4. 发送邮件
send_result = sendObj.sendmail(username, to_address_list + cc_address_list,
msg.as_string())
# 5. 发送完成,退出
quit_result = sendObj.quit()
print(login_result, send_result, quit_result)
注意点:
msg = MIMEMultipart('related')
必须选择这个类型的,不然不能又包含图片,又包含文字。msg
相当于一个容器,本身没有具体的内容。如果要什么内容,就调用 msg.attach(msgText)
这样的方法去包含。
# 02. 添加图片
file = open("e:/py/dns.jpg", "rb")
img_data = file.read()
file.close()
img = MIMEImage(img_data)
img.add_header('Content-ID', 'dns_config') # todo: 注意这里的 dns_config 是和 html中对应的
msg.attach(img)
对应的
html
中的代码:
<img src="cid:dns_config" alt="dns配置">
大体上内容就这些,跪安吧。
另外,对于给多个收件人设置昵称,需要使用到新的方法 : email.utils.formataddr
from email.utils import parseaddr, formataddr
subject = r"这是主题"
to_address = [r'灰猫不是猫' ]
cc_address = [formataddr((r'蓝猫不是猫', '[email protected]'), charset='utf-8'),
formataddr((r'吕布', '[email protected]'), charset='utf-8'),]
send_email(subject, to_address, cc_address)