您的位置:首页 > 编程语言 > Python开发

python flask发送邮件嵌入图片 Outlook

2017-01-20 10:24 323 查看
邮件模板如下:email.html

<img src="{{ img }}">

<p>注意:此邮件自动发送,回复无效</p>


最开始使用的是下面这种方法,测试后在163邮箱是可以看到图片的,但是在Outlook2010中图片无法显示,是x

下面是flask标准的异步发送邮件方法

def send_async_email(app, msg):
with app.app_context():
mail.send(msg)

def send_email(to, subject, template, **kwargs):
app = current_app._get_current_object()
msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + ' ' + subject,
sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to])
# msg.body = render_template(template + '.txt', **kwargs)
msg.html = render_template(template + '.html', **kwargs)

thr = Thread(target=send_async_email, args=[app, msg])
thr.start()
return thr
读取图片base64传入到模板中
f = open('test.png', 'rb')
img = base64.b64encode(f.read())
f.close()
send_email('123@xxx.com', 'hello', 'email', img=img)


查到了Outlook2007+不支持Embedded Image,见send-a-base64-image-in-html-email



看到解决方法有用cid的,但是并没有查到flask发送邮件,img用cid的方法,所以参考了用email包的方法,见用Python发送邮件

首先将图片作为附件添加到邮件中,修改send_email方法:

def send_email(to, subject, template, image, **kwargs):
app = current_app._get_current_object()
msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + ' ' + subject,
sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to])
# msg.body = render_template(template + '.txt', **kwargs)
msg.html = render_template(template + '.html', **kwargs)

with app.open_resource(image) as fp:
msg.attach('image.png', "image/png", fp.read())

thr = Thread(target=send_async_email, args=[app, msg])
thr.start()
return thr


这样图片就被添加到附件中了,对比用email包嵌入图片和添加附件的区别,红色框住的是区别:



继续修改send_email方法,根据flask-mail的api增加了两个参数:



with app.open_resource(image) as fp:
msg.attach('image.png', "image/png", fp.read(), 'inline', headers=[('Content-ID', 'image')])最后修改传入到模板中的参数:(注意cid要和Content-ID一致)
send_email('123@xxx.com', 'hello', 'email', 'test.png', img='cid:image')大功告成!Outlook终于能正常显示图片了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息