15

我想知道我是否可以通过 smtplib 发送一个 matplotlib pyplot。我的意思是,在我绘制了这个数据框之后:

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>

我知道我可以使用

plt.show()

但是对象本身存储在哪里?还是我对 matplotlib 有误解?有没有办法在python中将它转换为图片或html,以便我可以通过smtplib发送它?谢谢!

4

3 回答 3

34

也可以将内存中的所有内容保存到 BytesIO 缓冲区,然后将其提供给有效负载:

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)
于 2014-02-18T18:37:43.773 回答
5

您可以使用figure.savefig()将绘图保存到文件中。我将绘图输出到文件的示例:

fig = plt.figure()    
ax = fig.add_subplot(111)

# Need to do this so we don't have to worry about how many lines we have - 
# matplotlib doesn't like one x and multiple ys, so just repeat the x
lines = []
for y in ys:
    lines.append(x)
    lines.append(y)

ax.plot(*lines)

fig.savefig("filename.png")

然后只需将图像附加到您的电子邮件中(如此答案中的食谱)。

于 2013-09-12T13:53:43.530 回答
0

我不喜欢用 SMTP 和电子邮件库做这件事有多混乱,所以我决定自己解决这个问题,并创建了一个更好的库来发送电子邮件。您可以毫不费力地将 Matplotlib 图作为附件或 HTML 正文包含:

# Create a figure
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot([1,2,3,2,3])


from redmail import EmailSender
# Configure the sender (pass user_name and password if needed)
email = EmailSender(host="<SMTP HOST>", port=0)

# Send an email
email.send(
    subject="A plot",
    sender="me@example.com",
    receivers=["you@example.com"],

    # A plot in body
    html="""
        <h1>A plot</h1> 
        {{ embedded_plot }}
    """,
    body_images={
        "embedded_plot": fig
    },

    # Or plot as an attachment
    attachments={
        "attached_plot.png": fig
    }
)

图书馆(希望)应该是电子邮件发件人所需要的一切。您可以从 PyPI 安装它:

pip install redmail

文档:https ://red-mail.readthedocs.io/en/latest/

源代码:https ://github.com/Miksus/red-mail

于 2022-01-04T07:04:18.117 回答