admin管理员组

文章数量:1558698

前言

大家好,我是最渣的黑客,前几天需要做一个检测 server 的桌面的情况,所以特意写了一个 自动截屏桌面并发送邮箱 的功能,此篇是python篇,并非其他语言。其实在写之前,我也查了很多资料,很多办法可能只是适合他自己的,CSDN 千篇一律,不是你复制我,就是我复制你,然后保存在自己的博客中,在这里我真的要吐槽那些喜欢复制的博主,真别这样做了,如果看到一篇文章觉得可以解决你的问题,我建议好好研究为什么可以解决问题,然后写到博客中。CSDN真让我查资料查吐了。

我这篇文章只适合现在时间,我用pyton 3.6版本,可能适合3.x 任何版本,但是如果pyton 一直更新,代码函数可能也会随着更新。是用方法也可能会变。

进入正题:

首先我们需要导入的包:

#encoding:utf-8
from PIL import ImageGrab # 截屏
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import time
import os

上面的如果提示 红色波浪线,那你可以能就需要安装下了 PIL 是自带的,别去pip 或者到 pycharm 安装会报错的。

截屏篇:

下方是截屏桌面生成图片 代码:


def screenshots():
    """
    1.生成本地图片文件
    2.删除旧的图片文件,防止图片过多内存过载
    3.以时间命名,防止命名重复。
    :return:
    """

    try:
        imgfile = os.listdir()
        for img in imgfile:
            newimg = str(img).split('.')[1]
            if newimg == 'jpg':
                os.remove(img)
    except:
        pass

    nowtime = time.time()
    newnowtime = str(nowtime).split('.')[0]
    imgs = ImageGrab.grab()
    imgs.save('%s.jpg'%newnowtime)

代码解释【1】:

try:
        imgfile = os.listdir()
        for img in imgfile:
            newimg = str(img).split('.')[1]
            if newimg == 'jpg':
                os.remove(img)
    except:
        pass

上述代码, 主要是检测当前目录是否存在 jpg 文件,如果存在那就删除,就防止浪费服务器资源存储空间,如果不存在就执行截屏操作。【如果是使用的我的办法,切勿将生成后的 py 或者 exe 程序,放入到图片多的文件夹中。】

代码解释【2】:

nowtime = time.time()
newnowtime = str(nowtime).split('.')[0] # 删除时间戳后面的小数点【或者是这么理解:把字符串 以 . 分成一个列表取第一个值】
imgs = ImageGrab.grab()  # 保存当前桌面
imgs.save('%s.jpg'%newnowtime) #另存到当前目录下

上述代码,主要功能是截屏桌面生成jpg 图片保存在当前目录。但是有个注意点就是,我这里导入了time 包,为了保证每次生成的图片的命名不重复,所以用的是当时生成的时间戳作为图片的命名。当然你可以用 随机模块来做为图片。
这里可能有要说了,你上面不是已经删除了图片,害怕什么重复啊,有些时候,如果我们需要看每间隔30分钟的10次的服务器状态。那就需要用到这个功能。就不能直接删除图片了。

发送邮件篇:

代码如下:

def smtp_mail():
    """
    这里是检测本地jpg文件,然后通过邮件发送到指定邮箱
    :return:
    """
    msg_from = '150243xxxx@163'
    passward = 'xxxxxxxxxxxxx' #授权码
    msg_to = 'singfy@163'
    subject = '淘宝自动发货状态检测'
    # content = '这是用python和smtp模块发送的邮件'
    # msg = MIMEText(content)
    msg = MIMEMultipart()
    msg[ 'Subject' ] = subject
    msg[ 'From' ] = msg_from
    msg[ 'To' ] = msg_to

    imgfile = os.listdir()
    for img in imgfile:
        newimg = str(img).split('.')
        if len(newimg)>1:
            if newimg[1] == 'jpg':
                with open ('%s.jpg'%newimg[0],'rb') as f: # 打开图片,然后利用邮箱 发送
                    mime = MIMEBase('image', 'jpg', filename='%s.jpg'%newimg[0])
                    mime.add_header('Content-Disposition', 'attachment', filename='%s.jpg'%newimg[0])
                    mime.add_header('Content-ID', '<0>')
                    mime.add_header('X-Attachment-Id', '0')
                    mime.set_payload(f.read())
                    encoders.encode_base64(mime)
                    msg.attach(mime)
                    emails = smtplib.SMTP_SSL('smtp.163', 465)
                    emails.login(msg_from, passward)
                    emails.sendmail(msg_from, msg_to, msg.as_string())

上诉代码中,涉及到几个点非常重要:
第一个是 你所使用的邮箱的 授权码 和开启 POP3/SMTP/IMAP ,官方解释文档:点击查看详情
第二个是 读取当前目录图片文件,我这里是因为我上面用了 时间戳作为命名,前提是我不知道他的名称,所以用了 os.listdir() 和 if 来判断出 jpg 的命名。
第二点,根据实际情况可以更改代码。当然也可以直接复制我的代码。就是第一点,初学的朋友可能不知道 如何知道自己的邮箱授权码。

我这里以 163邮箱为例子:

1 .打开 https://mail.163/ ,然后登陆,登陆成功后,点击设置:

2 . 点击 POP3/SMTP/IMAP 。

3. 先开启协议:

3.1 一般都是 SMTP 协议:

4. 在新弹出的弹窗中,可以选择扫码发送短信,或者点击下方“手动发送短信”。(如果发送5分钟后系统依旧提示未收到短信,请联系移动运营商核实短信发送情况。)


5.点击我已发送后,如果系统检测到用户成功发送短信,则会提示您的客户端授权码(自动生成一串(16位字母组合)唯一随机授权密码),为了最大程度保证用户授权密码使用安全,一个授权码在开启后网页上只出现一次,但是一个授权码可以同时设置多个客户端。

您可以选择开启时记录该授权码在其他地方(不推荐),

或者需要设置额外的客户端时候,再次新增授权码使用(推荐),

最多同时存在5个授权码。

6. 目前主流的常用新版本客户端,Foxmail(点击查看foxmail设置教程),Outlook等,都已经支持网易邮箱一键登录,即网易邮箱帐号+客户端授权码直接登录,无需设置服务器地址。如果您需要设置正确的163邮箱服务器地址,信息如下:


注:126,yeah邮箱请自行更换服务器地址中相关参数。例如smtp.126和smtp.yeah。

全部代码【可复制直接使用】:

#encoding:utf-8
from PIL import ImageGrab
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import time
import os


def screenshots():
    """
    1.生成本地图片文件
    2.删除旧的图片文件,防止图片过多内存过载
    3.以时间命名,防止命名重复。
    :return:
    """

    try:
        imgfile = os.listdir()
        for img in imgfile:
            newimg = str(img).split('.')[1]
            if newimg == 'jpg':
                os.remove(img)
    except:
        pass

    nowtime = time.time()
    newnowtime = str(nowtime).split('.')[0]
    imgs = ImageGrab.grab()
    imgs.save('%s.jpg'%newnowtime)


def smtp_mail():
    """
    这里是检测本地jpg文件,然后通过邮件发送到指定邮箱
    :return:
    """
    msg_from = '1502xxxx1207@163'
    passward = 'xxxxxxxxxxx' #授权码
    msg_to = 'singfy@163'
    subject = '淘宝自动发货状态检测'
    # content = '这是用python和smtp模块发送的邮件'
    # msg = MIMEText(content)
    msg = MIMEMultipart()
    msg[ 'Subject' ] = subject
    msg[ 'From' ] = msg_from
    msg[ 'To' ] = msg_to

    imgfile = os.listdir()
    for img in imgfile:
        newimg = str(img).split('.')
        if len(newimg)>1:
            if newimg[1] == 'jpg':
                with open ('%s.jpg'%newimg[0],'rb') as f:
                    mime = MIMEBase('image', 'jpg', filename='%s.jpg'%newimg[0])
                    mime.add_header('Content-Disposition', 'attachment', filename='%s.jpg'%newimg[0])
                    mime.add_header('Content-ID', '<0>')
                    mime.add_header('X-Attachment-Id', '0')
                    mime.set_payload(f.read())
                    encoders.encode_base64(mime)
                    msg.attach(mime)
                    emails = smtplib.SMTP_SSL('smtp.163', 465)
                    emails.login(msg_from, passward)
                    emails.sendmail(msg_from, msg_to, msg.as_string())
def index():
    screenshots()
    smtp_mail()



if __name__ == '__main__':
    index()

代码总结:CSDN 或者百度是有很多种方法,如果这个办法对你无效的,请多百度其他方法,拼凑起来,就可能实现你自己想要的功能。如果对你有帮助点个关注呗 代码还有很多可以优化地方,都是以学习参考为主,实战请修改成自己优化的代码,减少服务器运行资源。

本文标签: 截图发送到可直接易懂邮箱