【问题标题】:Python Matplotlib to smtplibPython Matplotlib 到 smtplib
【发布时间】:2013-09-12 13:45:50
【问题描述】:

我想知道我是否可以通过 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发送它?谢谢!

【问题讨论】:

    标签: python-3.x matplotlib smtplib


    【解决方案1】:

    还可以将内存中的所有操作保存到 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)
    

    【讨论】:

    • 请注意,“anything.png”只是邮件附件中显示的名称,而不是文件系统中的名称。它可以是你选择的任何东西。
    • 这是更好的 imo。这是否真的保存了文件 IO 操作?
    【解决方案2】:

    您可以使用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")
    

    然后将图片附加到您的电子邮件中(如recipe in this answer)。

    【讨论】:

    • 是的,这太完美了!!我搜索了谷歌,但 Stack Overflow 再次获胜。
    【解决方案3】:

    我不喜欢用 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

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 2016-01-10
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      相关资源
      最近更新 更多