Python Matplotlib to smtplib

David Yang picture David Yang · Sep 12, 2013 · Viewed 12.9k times · Source

I'm wondering if I can send out a matplotlib pyplot through smtplib. What I mean is, after I plot this dataframe:

In [3]: dfa
Out[3]:
           day      imps  clicks
70  2013-09-09  90739468   74609
69  2013-09-08  90945581   72529
68  2013-09-07  91861855   70869

In [6]: dfa.plot()
Out[6]: <matplotlib.axes.AxesSubplot at 0x3f24da0>

I know I can see the plot using

plt.show()

but where is the object itself stored? Or am I misunderstanding something about matplotlib? Is there a way to convert it to a picture or html within python so I can send it through smtplib? Thanks!

Answer

Jorge Gonz&#225;lez Lorenzo picture Jorge González Lorenzo · Feb 18, 2014

It is also possible to do everything in memory saving to a BytesIO buffer and then feeding the payload with it:

import io
from email.encoders import encode_base64
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart

buf = io.BytesIO()
plt.savefig(buf, format = 'png')
buf.seek(0)

mail = MIMEMultipart()
...
part = MIMEBase('application', "octet-stream")
part.set_payload( buf.read() )
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"' % 'anything.png')
mail.attach(part)